硬编码凭据¶
ID: py/hardcoded-credentials
Kind: path-problem
Security severity: 9.8
Severity: error
Precision: medium
Tags:
- security
- external/cwe/cwe-259
- external/cwe/cwe-321
- external/cwe/cwe-798
Query suites:
- python-security-extended.qls
- python-security-and-quality.qls
在源代码或配置文件中包含未加密的硬编码入站或出站身份验证凭据是危险的,因为这些凭据很容易被发现。
包含硬编码凭据的源代码或配置文件可能对攻击者可见。例如,源代码可能是开源的,或者可能被泄露或意外泄露。
对于入站身份验证,硬编码凭据可能允许对系统进行未经授权的访问。如果凭据在源代码中硬编码,则这将尤其成问题,因为它无法轻松禁用。对于出站身份验证,硬编码凭据可能会向攻击者提供特权信息或对其他系统的未经授权的访问。
建议¶
从源代码中删除硬编码凭据,例如用户名、密码和证书,必要时将它们放在配置文件或其他数据存储中。如果可能,将包含凭据数据的配置文件与源代码分开存储,存储在安全的位置,并限制访问权限。
对于出站身份验证详细信息,请考虑加密凭据或包含它们的数据存储或配置文件,并使用权限限制访问权限。
对于入站身份验证详细信息,请考虑使用标准库函数对密码进行哈希处理(如果可能)。例如,hashlib.pbkdf2_hmac
。
示例¶
以下示例显示了不同类型的入站和出站身份验证。
在第一种情况下,我们接受来自远程用户的密码,并将其与明文字符串字面量进行比较。如果攻击者获取了源代码,他们可以查看密码,并登录系统。此外,如果发现此类入侵,则需要重写并重新部署应用程序才能更改密码。
在第二种情况下,密码使用 hashlib.pbkdf2_hmac
与存储在配置文件中的哈希和加盐密码进行比较。在这种情况下,访问源代码或程序集不会向攻击者泄露密码。即使访问包含密码哈希和盐的配置文件,对攻击者也没有太大价值,因为从哈希和盐反向工程密码通常非常困难。
在最后一种情况下,密码将更改为一个新的、硬编码的值。如果攻击者有权访问源代码,他们将能够查看新密码。
import hashlib
import binascii
def process_request(request):
password = request.GET["password"]
# BAD: Inbound authentication made by comparison to string literal
if password == "myPa55word":
redirect("login")
hashed_password = load_from_config('hashed_password', CONFIG_FILE)
salt = load_from_config('salt', CONFIG_FILE)
#GOOD: Inbound authentication made by comparing to a hash password from a config file.
dk = hashlib.pbkdf2_hmac('sha256', password, salt, 100000)
hashed_input = binascii.hexlify(dk)
if hashed_input == hashed_password:
redirect("login")
参考资料¶
OWASP:XSS 使用硬编码密码.
常见弱点枚举:CWE-259.
常见弱点枚举:CWE-321.
常见弱点枚举:CWE-798.