SV.SENSITIVE.DATA
当敏感信息未经加密进行存储或传输时将报告此错误。
漏洞与风险
如果您的密码和社会安全号码等敏感数据未经加密,攻击者可能会读取或修改这些数据。
如果加密敏感数据,攻击者将需要解密数据才能读取或修改数据。
代码示例
漏洞代码示例 1
package com.company;
import java.io.IOException;
import java.io.OutputStream;
public class WriteInfo {
public void write(OutputStream os, int ssn) throws IOException {
os.write(ssn);
}
}
当敏感值写入流时,Klocwork 将生成一个缺陷。在此示例中,社会安全号码为敏感值。
修正代码示例 1
package com.company;
import java.io.IOException;
import java.io.OutputStream;
public class WriteInfo {
public void write(OutputStream os, int ssn) throws IOException {
int encryptedSsn = encrypt(ssn);
os.write(encryptedSsn);
}
private int encrypt(int value) {
int encrypted;
// ... do encryption
return encrypted;
}
}
应用以下 .jkb 文件,将告知 Klocwork 分析引擎“encrypt()”方法会返回安全数据。
package com.company;
@Bind("SV.SENSITIVE.DATA")
class Writer {
@Check("return") private int encrypt(int value);
}
在此修正示例中,敏感值(社会安全号码)将在写入之前进行加密。在此修正示例中,Klocwork 不会生成缺陷。
漏洞代码示例 2
package com.company;
import java.io.IOException;
import java.io.Writer;
public class WriteInfo {
public void write(Writer w, User user) throws IOException {
String value = user.getPassword();
w.write(value);
}
public static class User {
public String getPassword() {
return "pw";
}
}
}
当敏感值写入编写器对象时,Klocwork 将生成一个缺陷。在此示例中,将通过“getPassword()”方法检索并写入密码。
修正代码示例 2
package com.company;
import java.io.IOException;
import java.io.Writer;
public class WriteInfo {
public void write(Writer w, User user) throws IOException {
String encryptedPassword = encrypt(user.getPassword());
w.write(encryptedPassword);
}
private String encrypt(String value) {
String encrypted;
// ... do encryption
return encrypted;
}
public static class User {
public String getPassword() {
return "pw";
}
}
}
应用以下 .jkb 文件,将告知 Klocwork 分析引擎“encrypt()”方法包含安全数据。
package com.company;
@Bind("SV.SENSITIVE.DATA")
class Writer {
@Check("return") private String encrypt(String value);
}
在此修正示例中,敏感数据将在写入之前进行加密。另请注意,将使用变量名称“encryptedPassword”以明确表明代码未存储纯文本密码。
可配置的检查器的漏洞代码示例
此检查器使用默认敏感数据列表进行配置,例如出生日期、社会安全号码、密码。此列表是可配置的,而不是包含所有数据的。可使用 .jkb 文件中的 @CheckerParam 注释配置敏感数据。请注意,用户指定自定义 @CheckerParam 选项后,将不再使用默认内置敏感词列表。
在此示例中,用户具有其软件的特定域知识,并已确定患者的“姓名”、“出生日期”和“地址”是敏感数据类型。包含以下注释的 .jkb 文件已加载至项目配置:
@CheckerParam("SV.SENSITIVE.DATA", "name,dob,address")
package com.company;
@Bind("SV.SENSITIVE.DATA")
class Writer {
@Check("return") public String encrypt(String value);
}
上述 .jkb 文件将通知 Klocwork 分析引擎出生日期、地址和姓名为敏感值且 “encrypt()”方法会返回安全数据。
漏洞代码示例 3
package com.company;
import java.io.IOException;
import java.io.Writer;
public class WritePatient {
public void writePatientInfo(Writer writer, Patient patient) throws IOException {
StringBuilder sb = new StringBuilder();
sb.append(patient.getName());
sb.append(';');
sb.append(patient.getDob());
sb.append(';');
sb.append(patient.getAddress());
writer.write(sb.toString());
}
public static class Patient {
public String getName() { return "John Doe"; }
public String getDob() { return "1900-01-01"; }
public String getAddress() { return "123 Main St., Cityville, NY 12345"; }
}
}
在上述代码中,Klocwork 将检测到 3 个缺陷,一个针对未加密的姓名、一个针对未加密的出生日期、一个针对未加密的地址。
修正代码示例 3
package com.company;
import java.io.IOException;
import java.io.Writer;
public class WritePatient {
public void writePatientInfo(Writer writer, Patient patient) throws IOException {
StringBuilder sb = new StringBuilder();
sb.append(encrypt(patient.getName()));
sb.append(';');
sb.append(encrypt(patient.getDob()));
sb.append(';');
sb.append(encrypt(patient.getAddress()));
writer.write(sb.toString());
}
public String encrypt(String value) {
String encrypted;
// .. do encryption
return encrypted;
}
public static class Patient {
public String getName() { return "John Doe"; }
public String getDob() { return "1900-01-01"; }
public String getAddress() { return "123 Main St., Cityville, NY 12345"; }
}
}
相关检查器
外部指导
扩展
通过使用 .jkb 文件中的 @CheckerParam 和 @Check 选项,可调整此检查器用于查找敏感值。如果调整此检查器以添加任何自定义敏感值,将不再使用默认值;如果要将其包括在内,可将其与自定义值一起重新添加到 .jkb 文件。有关详情,请参阅调整 Java 分析。
默认敏感值
默认使用的敏感值为:dob、ssn、pin、password、password_buffer、pwd、pwd_buffer、pwdbuf、passwd。