OWASP Top Ten Web Application Security Risks | OWASP
重点解释
A02:2021 – Cryptographic Failures(A02:2021 – 加密失败)
概述
上移一个位置到#2,以前称为敏感数据暴露,这更像是一个广泛的症状而不是根本原因,重点是与密码学相关的失败(或缺乏密码学)。这往往会导致敏感数据的暴露。包括的值得注意的常见弱点枚举 (CWE) 包括CWE-259:使用硬编码密码、CWE-327:损坏或有风险的加密算法和CWE-331 熵不足。
描述
首先是确定传输中和静止数据的保护需求。例如,密码、信用卡号、健康记录、个人信息和商业秘密需要额外保护,主要是如果该数据属于隐私法(例如欧盟的通用数据保护条例 (GDPR))或法规(例如金融数据保护)例如 PCI 数据安全标准 (PCI DSS)。对于所有此类数据:
-
是否有任何数据以明文形式传输?这涉及 HTTP、SMTP、FTP 等协议也使用 TLS 升级,如 STARTTLS。外部互联网流量是危险的。验证所有内部流量,例如,负载平衡器、Web 服务器或后端系统之间的流量。
-
默认情况下或在较旧的代码中是否使用任何旧的或弱的加密算法或协议?
-
是否正在使用默认加密密钥、生成或重复使用弱加密密钥,或者是否缺少适当的密钥管理或轮换?加密密钥是否已签入源代码存储库?
-
是否未强制执行加密,例如,是否缺少任何 HTTP 标头(浏览器)安全指令或标头?
-
收到的服务器证书和信任链是否经过正确验证?
-
初始化向量是否被忽略、重用或生成的加密操作模式不够安全?是否正在使用不安全的操作模式,例如欧洲央行?当认证加密更合适时是否使用加密?
-
在没有密码基密钥派生函数的情况下,是否将密码用作加密密钥?
-
随机性是否用于并非旨在满足加密要求的加密目的?即使选择了正确的函数,它是否需要由开发人员播种,如果不需要,开发人员是否用缺乏足够熵/不可预测性的种子覆盖了内置的强大播种功能?
-
是否使用过时的哈希函数,例如 MD5 或 SHA1,或者在需要加密哈希函数时使用非加密哈希函数?
-
是否在使用已弃用的加密填充方法,例如 PCKS number 1 v1.5?
-
加密错误消息或边信道信息是否可利用,例如以填充预言机攻击的形式?
请参阅 ASVS 加密 (V7)、数据保护 (V9) 和 SSL/TLS (V10)
如何预防
至少执行以下操作,并查阅参考资料:
-
对应用程序处理、存储或传输的数据进行分类。根据隐私法、监管要求或业务需求确定哪些数据是敏感的。
-
不要不必要地存储敏感数据。尽快丢弃它或使用符合 PCI DSS 的标记化甚至截断。未保留的数据不能被窃取。
-
确保加密所有静态敏感数据。
-
确保拥有最新且强大的标准算法、协议和密钥;使用适当的密钥管理。
-
使用安全协议(例如具有前向保密 (FS) 密码的 TLS、服务器的密码优先级和安全参数)加密所有传输中的数据。使用 HTTP 严格传输安全 (HSTS) 等指令强制加密。
-
对包含敏感数据的响应禁用缓存。
-
根据数据分类应用所需的安全控制。
-
不要使用旧协议(例如 FTP 和 SMTP)来传输敏感数据。
-
使用具有工作因子(延迟因子)的强自适应和加盐散列函数存储密码,例如 Argon2、scrypt、bcrypt 或 PBKDF2。
-
必须选择适合操作模式的初始化向量。对于许多模式,这意味着使用 CSPRNG(密码安全伪随机数生成器)。对于需要随机数的模式,则初始化向量 (IV) 不需要 CSPRNG。在所有情况下,对于一个固定密钥,IV 永远不应该被使用两次。
-
始终使用经过身份验证的加密,而不仅仅是加密。
-
密钥应该以加密方式随机生成并作为字节数组存储在内存中。如果使用密码,则必须通过适当的密码基密钥派生函数将其转换为密钥。
-
确保在适当的地方使用加密随机性,并且它没有以可预测的方式或低熵进行播种。大多数现代 API 不需要开发人员为 CSPRNG 设置种子以获得安全性。
-
避免不推荐使用的加密函数和填充方案,例如 MD5、SHA1、PKCS number 1 v1.5。
-
独立验证配置和设置的有效性。
攻击场景示例
场景#1:应用程序使用自动数据库加密对数据库中的信用卡号进行加密。但是,此数据在检索时会自动解密,从而允许 SQL 注入缺陷以明文形式检索信用卡号。
场景#2:站点不使用或对所有页面强制执行 TLS 或支持弱加密。攻击者监视网络流量(例如,在不安全的无线网络中),将连接从 HTTPS 降级为 HTTP,拦截请求并窃取用户的会话 cookie。然后攻击者重放这个 cookie 并劫持用户的(经过身份验证的)会话,访问或修改用户的私人数据。除了上述之外,他们还可以更改所有传输的数据,例如,汇款的接收者。
场景#3:密码数据库使用未加盐或简单的哈希来存储每个人的密码。文件上传缺陷允许攻击者检索密码数据库。所有未加盐的哈希值都可以通过预先计算的哈希值彩虹表公开。由简单或快速散列函数生成的散列可能会被 GPU 破解,即使它们被加盐。