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 进行所需的加密。

扩展

此检查器可通过 Klocwork 知识库进行扩展。有关详情,请参阅调整 C/C++ 分析和 PK.EMPTY_PWD.SINK 知识库。