RCA
使用了有风险的密码算法
如果程序处理敏感数据或保护通信通道,可以使用密码学防止攻击者读取程序。一些过时的密码算法已被证明具有攻击弱点。
RCA 检查器会检测一组特定的已知被破坏或有风险的密码算法。
漏洞与风险
如果程序使用被破坏或有风险的算法处理数据,可能在该程序中造成安全漏洞。CWE-327 和 NIST 特刊 800-131A 修订版本 1 将以下算法的使用列为被破坏或有风险:CBC-MAC、DES、DES-X、Two-key Triple DES、MD2、MD4、MD5、RC2、RNG in ANSI X9.31、SHA-0、SHA-1、SKIPJACK。尽管不建议使用,但密码库中仍可支持这些算法。
缓解与预防
考虑将报告的弱算法替换为更强的算法。例如,SHA-256 或 SHA-512 可替代 SHA-1 或 MD5,AES 可替代 DES,等等。
示例 1
某函数调用使用有风险的算法(或初始化代表该算法的对象)。
#include <openssl/md5.h>
void foo( const unsigned char *msg, unsigned int len) {
unsigned char md5digest[MD5_DIGEST_LENGTH];
MD5(msg, len, md5digest); // <== RCA reported
// .....
}
示例 2
将识别有风险算法的常量 C 字符串文本传递到将执行该算法或初始化代表该算法的对象实例的函数。
#include <Bcrypt.h>
void demo()
{
NTSTATUS status;
BCRYPT_ALG_HANDLE hAlg;
status = BCryptOpenAlgorithmProvider(&hAlg, BCRYPT_MD4_ALGORITHM, 0, 0); // <== RCA reported
// use(hAlg)
}
示例 3
创建代表有风险算法的类的实例。
#include <cryptopp/sha.h>
using namespace CryptoPP;
void bar() {
SHA1 *hashfunc = new SHA1(); // <== RCA reported
// use(hashfunc)
}
示例 4
自定义类继承自代表有风险算法的类。
#include <cryptopp/sha.h>
class MyAlgo : public CryptoPP::SHA1 { // <== RCA reported
// .....
};
外部指导
密码算法的概述及审批状态:
-
NIST.SP.800-131Ar1:NIST 特刊 800-131A 修订版本 1。转型:关于转变密码算法和密钥长度使用的建议(2015 年 11 月)
关于受威胁密码算法的报告和文章:
- CWE-327:使用被破坏的或有风险的加密算法
- OWASP A2:2021 加密失败
-
DES,RC2:J. Kesley,B. Schneider,D. Wanger。3-WAY、Biham-DES、CAST、DES-X、NewDES、RC2 和 TEA 的相关密钥破译
-
Dual_EC_DRBG:Matthew Green。Dual_EC_DRBG 的诸多缺陷。
-
Dual_EC_DRBG:Kristian Gjøsteen。关于 Dual-EC-DRBG/NIST SP 800-90 的评论
-
SHA-1:M. Stevens,P. Karman, T. Peyrin。完整 SHA-1 的 Freestart 冲突
-
SHA-1:C. McDonald,P. Hawkes,J. Pieprzyk。采用复杂度 O(2^52) 的 SHA-1 差分路径