CXX.SV.PRIVATE_KEY.EMPTY_PASSWD

不正な方法で秘密キーをシリアル化しようとしている

Klocwork は、公開キー基盤 (PKI) ベースの認証で、秘密キーを保存するために空のパスワードが使用されるときに、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();
  }

暗号化が必要な秘密キーにパスワード ("K016w81") が使用されているため、Klocwork は CXX.SV.PRIVATE_KEY.EMPTY_PASSWD の欠陥を報告しなくなります。

関連チェッカー

拡張機能

このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、C/C++ 解析のチューニングおよび PK.EMPTY_PWD.SINK knowledge base (ナレッジベース) を参照してください。