SV.STRBUF.CLEAN

如果可能安全的数据未从 StringBuffer 中清除,将出现 SV.STRBUF.CLEAN。

漏洞与风险

依靠垃圾回收器清除数据并不安全。攻击者可以访问未释放的数据。

Klocwork 安全漏洞 (SV) 检查器可识别可能创建危险数据的调用;这些调用被视为不安全的来源。用户所提供的任何数据都可能是不安全的来源,因为用户可能是攻击者,或者可能引入人为错误。

缓解与预防

勿使用可变对象存储敏感数据。如果必须对敏感数据使用可变对象,使用后应立即将对象设置为 NULL。

示例 1

复制
     private void processingData(String user) throws SQLException {
         String credential = getCredential(user);
         // ...
     }
 
     private String getCredential(String user) throws SQLException {
         Statement statement = con.createStatement();
         try {
             StringBuffer buffer = new StringBuffer();
             ResultSet resultSet = statement.executeQuery("SELECT * FROM credentials WHERE name='" + user + '\'');
             while (resultSet.next()) {
                 String key = resultSet.getString("key");
                 buffer.append(key);
             }
 
             final String result = buffer.toString();
             return result;
         } finally {
             statement.close();
         }
     }

针对第 24 行报告 SV.STRBUF.CLEAN:进行垃圾回收前未清除字符串缓冲区“buffer”。

示例 2

复制
     private void processingData(String user) throws SQLException {
         String credential = getCredential(user);
         // ...
 
     }
 
     private String getCredential(String user) throws SQLException {
         Statement statement = con.createStatement();
         StringBuffer buffer = new StringBuffer();
         try {
             ResultSet resultSet = statement.executeQuery("SELECT * FROM credentials WHERE name='" + user + '\'');
             while (resultSet.next()) {
                 String key = resultSet.getString("key");
                 buffer.append(key);
             }
 
             final String result = buffer.toString();
             return result;
         } finally {
             buffer.delete(0, buffer.length());
             statement.close();
         }
     }

来自之前部分的代码段经过了修复;在此不会报告 SV.STRBUF.CLEAN。

扩展

此检查器可通过 Klocwork 知识库进行扩展。有关详情,请参阅调整 Java 分析。