RCA

使用了有风险的密码算法

如果程序处理敏感数据或保护通信通道,可以使用密码学防止攻击者读取程序。一些过时的密码算法已被证明具有攻击弱点。

RCA 检查器会检测一组特定的已知被破坏或有风险的密码算法。

漏洞与风险

如果程序使用被破坏或有风险的算法处理数据,可能在该程序中造成安全漏洞。CWE-327NIST 特刊 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 
      // .....
 };

安全培训

应用程序安全培训材料由 Secure Code Warrior 提供。