CXX.SV.PRIVATE_KEY.EMPTY_PASSWD
尝试以未经授权的方式序列化私钥
当使用空密码通过基于公钥基础设施 (PKI) 的身份验证方法存储私钥,并可能导致未经授权的访问时,Klocwork 会报告 CXX.SV.PRIVATE_KEY.EMPTY_PASSWD 缺陷。
漏洞与风险
如果私钥被盗,可能会危及通过 PKI 进行的身份验证,因为攻击者可以使用私钥对文档进行数字签名,并冒充授权用户。
缓解与预防
我们建议使用加密技术,如密码或非空密码。
漏洞代码示例
复制
#include <QOpcUaProvider>
#include <QOpcUaKeyPair>
#include <QFile>
int main()
{
// Generate RSA Key
QOpcUaKeyPair key;
key.generateRsaKey(QOpcUaKeyPair::RsaKeyStrength::Bits1024);
// Save private key to file
QByteArray keyData = key.privateKeyToByteArray(QOpcUaKeyPair::Cipher::Aes128Cbc, "");
QFile keyFile("privateKey.pem");
keyFile.open(QFile::WriteOnly);
keyFile.write(keyData);
keyFile.close();
}
Klocwork 在第 11 行报告 CXX.SV.PRIVATE_KEY.EMPTY_PASSWD 缺陷,指出“尝试以未经授权的方式序列化私钥。请考虑使用非空密码进行加密。”QOpcUaKeyPair::privateKeyToByteArray
方法中传递了空密码,这意味着私钥使用空密码进行存储,容易遭到未经授权的访问。
修正代码示例
复制
#include <QOpcUaProvider>
#include <QOpcUaKeyPair>
#include <QFile>
int main()
{
// Generate RSA Key
QOpcUaKeyPair key;
key.generateRsaKey(QOpcUaKeyPair::RsaKeyStrength::Bits1024);
QByteArray keyData = key.privateKeyToByteArray(QOpcUaKeyPair::Cipher::Aes128Cbc, "K016w81");
QFile keyFile("privateKey.pem");
keyFile.open(QFile::WriteOnly);
keyFile.write(keyData);
keyFile.close();
}
Klocwork 不再报告 CXX.SV.PRIVATE_KEY.EMPTY_PASSWD 缺陷,因为已针对私钥使用密码 K016w81 进行所需的加密。
外部指导
安全培训
应用程序安全培训材料由 Secure Code Warrior 提供。
扩展
此检查器可通过 Klocwork 知识库进行扩展。有关详情,请参阅调整 C/C++ 分析和 PK.EMPTY_PWD.SINK 知识库。