SV.STRBUF.CLEAN

SV.STRBUF.CLEAN は、潜在的なセキュリティデータが StringBuffer から消去されていない場合に発生します。

脆弱性とリスク

データのクリアをガーベッジコレクターに頼るのは安全ではありません。攻撃者が解放されていないデータにアクセスする可能性があります。

Klocwork セキュリティ脆弱性 (SV) チェッカーは、潜在的に危険なデータを生成する呼び出しを特定します。このような呼び出しは安全でないソースと考えられます。ユーザーは攻撃者になる可能性があり、ヒューマンエラーを取り込む可能性があるため、安全でないソースはユーザーが指定した任意のデータである可能性があります。

軽減と防止

機密データの保存に mutable オブジェクトを使用しないようにします。機密データに mutable オブジェクトを使用する必要がある場合には、使用後すぐにオブジェクトを無効にします。

例 1

16     private void processingData(String user) throws SQLException {
17         String credential = getCredential(user);
18         // ...
19     }
20 
21     private String getCredential(String user) throws SQLException {
22         Statement statement = con.createStatement();
23         try {
24             StringBuffer buffer = new StringBuffer();
25             ResultSet resultSet = statement.executeQuery("SELECT * FROM credentials WHERE name='" + user + '\'');
26             while (resultSet.next()) {
27                 String key = resultSet.getString("key");
28                 buffer.append(key);
29             }
30 
31             final String result = buffer.toString();
32             return result;
33         } finally {
34             statement.close();
35         }
36     }

SV.STRBUF.CLEAN が 24 行目に対して報告されています。ガーベッジコレクションの前に文字列バッファ 'buffer' が削除されていません。

例 2

16     private void processingData(String user) throws SQLException {
17         String credential = getCredential(user);
18         // ...
19 
20     }
21 
22     private String getCredential(String user) throws SQLException {
23         Statement statement = con.createStatement();
24         StringBuffer buffer = new StringBuffer();
25         try {
26             ResultSet resultSet = statement.executeQuery("SELECT * FROM credentials WHERE name='" + user + '\'');
27             while (resultSet.next()) {
28                 String key = resultSet.getString("key");
29                 buffer.append(key);
30             }
31 
32             final String result = buffer.toString();
33             return result;
34         } finally {
35             buffer.delete(0, buffer.length());
36             statement.close();
37         }
38     }                                

前節のセクションのスニペットは修正されています。フィールドは SV.STRBUF.CLEAN は報告されません。

拡張機能

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