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 の欠陥を報告しなくなります。
関連チェッカー
外部参考資料
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。
拡張機能
このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、C/C++ 解析のチューニングおよび PK.UNENC.SINK knowledge base (ナレッジベース) を参照してください。