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