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 解析のチューニングを参照してください。