CXX.SV.PWD.PLAIN

アプリケーションはパスワード/PIN をクリアテキストとして表示してはならない

アプリケーションがプレーンテキストに記述された文字列を使用して、パスワードまたは PIN を設定しようとすると、Klocwork は CXX.SV.PWD.PLAIN 欠陥を報告します。

脆弱性とリスク

保存場所またはネットワークが外部の暗号化によって保護されていない場合、文字列にアクセスできる人ならば誰でも、パスワードを見ることができます。

認証プロセス中に、ユーザーがプレーンテキスト形式を使用して、パスワードまたは PIN を提示すると、悪意のある攻撃者はそのデータを傍受し、ユーザーアカウントを侵害する可能性があります。

軽減と防止

暗号化技術を使用して、このような攻撃を回避します。たとえば、QT フレームワークには、プレーンテキスト文字列を暗号化する、encryptToString という API が用意されています。

脆弱コード例

コピー
void Database::connect(Ui::MainWindow *ui){
    /* Set connections */
    this->qSqlDatabase.setUserName("mojito");
    this->qSqlDatabase.setPassword("J0a1m8");
}

Klocwork は 4 行目で CXX.SV.PWD.PLAIN の欠陥を報告し、「プレーンな文字列を使用してパスワードを設定しようとしています。プレーンな文字列を暗号化するためのいくつかの暗号化技術を検討してください」と表示しています。Database::connect メソッドの内部では、プレーンな文字列 "J0a1m8" が setPassword API に直接渡されます。

修正コード例

コピー
void Database::connect(Ui::MainWindow *ui){
    /* Set connections */
    QString pwd = "J0a1m8";
    QString encryptedData = encryptToString(pwd);
    this->qSqlDatabase.setUserName("mojito");
    this->qSqlDatabase.setPassword(encryptedData);
}

QT フレームワークが提供する encryptToString API が、テキスト ("J0a1m8") を暗号化してから、setPassword API に渡すため、Klocwork は CXX.SV.PWD.PLAIN の欠陥を報告しなくなります。

拡張機能

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