CXX.SV.PRIVATE_KEY.UNENCRYPTED

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

Klocwork は、公開キー基盤 (PKI) ベースの認証で、秘密キーを保存するために暗号化されていない暗号が使用されるときに、CXX.SV.PRIVATE_KEY.UNENCRYPTED の欠陥を報告します。これは、不正アクセスを引き起こす可能性があります。

脆弱性とリスク

秘密キーが盗まれると、攻撃者は秘密キーを使用して、ドキュメントにデジタル署名し、承認されているユーザーになりすますことができるため、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::Unencrypted, "password");

    QFile keyFile("privateKey.pem");
    keyFile.open(QFile::WriteOnly);
    keyFile.write(keyData);
    keyFile.close();
  }

Klocwork は、11 行目で CXX.SV.PRIVATE_KEY.UNENCRYPTED の欠陥を報告し、「不正な方法で秘密キーをシリアル化しようとしています。暗号による暗号化を検討してください」を示します。QOpcUaKeyPair::privateKeyToByteArray メソッドでは、QOpcUaKeyPair::Cipher::Unencrypted が渡されています。これは、秘密キーが暗号化されていない暗号で保存され、不正アクセスされやすいことを意味します。

修正コード例

コピー
#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, "K016w813");

    QFile keyFile("privateKey.pem");
    keyFile.open(QFile::WriteOnly);
    keyFile.write(keyData);
    keyFile.close();
  }

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

関連チェッカー

拡張機能

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