SV.SENSITIVE.OBJ
当敏感信息未经加密进行存储或传输时将报告此错误。
漏洞与风险
如果您的密码和社会安全号码等敏感数据未经加密,攻击者可能会读取或修改这些数据。
如果加密敏感数据,攻击者将需要解密数据才能读取或修改数据。
代码示例
漏洞代码示例 1
package com.company;
import java.io.IOException;
import java.io.OutputStream;
public class WriteInfo {
public void write(ObjectOutputStream oos, User user) throws IOException {
oos.writeObject(user);
}
public class User {
public int ssn = 1234;
}
}
在此示例中,用户对象(包含敏感数据)将写入流。当调用 writeObject() 方法时,Klocwork 发现一个缺陷。
修正代码示例 1
package com.company;
import java.io.IOException;
import java.io.OutputStream;
public class WriteInfo {
public void write(ObjectOutputStream oos, User user) throws IOException {
oos.writeObject(user);
}
public static class User {
public int encryptedSSN = encrypt(1234);
public static int encrypt(int value) {
int encrypted;
// ... do encryption
return encrypted;
}
}
}
此潜在修复涉及到加密社会安全号码。CWE-311 建议使用命名约定以帮助发现是否使用敏感数据。在这种情况下,包含社会安全号码的变量以“encrypted”一词开头,以明确表明敏感数据已加密。应用该修复后,Klocwork 将不再检测之前与敏感数据相关的缺陷。
可配置的检查器的漏洞代码示例
此检查器使用默认敏感数据列表进行配置,例如出生日期、社会安全号码、密码。此列表是可配置的,而不是包含所有数据的。可使用 .jkb 文件中的 @CheckerParam 注释配置敏感数据。请注意,用户指定自定义 @CheckerParam 选项后,将不再使用默认内置敏感词列表。
在此示例中,用户具有其软件的特定域知识,并已确定患者的“姓名”、“出生日期”和“地址”是敏感数据类型。包含以下注释的 .jkb 文件已加载至项目配置:
@CheckerParam("SV.SENSITIVE.OBJ", "name,dob,address")漏洞代码示例 2
package com.company;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
public class Writer {
public void writePatientInfo(OutputStream os, Patient patient) throws IOException
{
try (ObjectOutputStream oos = new ObjectOutputStream(os)) {
oos.writeObject(patient);
}
}
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"; }
}
}
将包含敏感数据的对象(“患者”)写入 ObjectOutputStream 时,Klocwork 将检测到一个缺陷。
修正代码示例 2
package com.company;
import javax.crypto.Cipher;
import javax.crypto.CipherOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.security.GeneralSecurityException;
import java.security.Key;
public class Writer {
private String transformation = "AES/ECB/PKCS5Padding";
public void writePatientInfo(OutputStream os, Patient patient, Key key)
throws GeneralSecurityException, IOException {
Cipher cipher = Cipher.getInstance(transformation);
cipher.init(Cipher.ENCRYPT_MODE, key);
try (CipherOutputStream cos = new CipherOutputStream(os, cipher);
ObjectOutputStream oos = new ObjectOutputStream(cos)) {
oos.writeObject(patient);
}
}
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"; }
}
}
CipherOutputStream 用于加密流。
将包含敏感数据的对象(“患者”)写入 ObjectOutputStream 时,Klocwork 仍将检测到一个缺陷,但通过人工检查即可确定这是误报,因为数据已加密。此缺陷现在可忽略。
相关检查器
外部指导
扩展
通过使用 .jkb 文件中的 @CheckerParam 和 @Check 选项,可调整此检查器用于查找敏感值。如果调整此检查器以添加任何自定义敏感值,将不再使用默认值;如果要将其包括在内,可将其与自定义值一起重新添加到 .jkb 文件。有关详情,请参阅调整 Java 分析。
默认敏感值
默认使用的敏感值为:dob、ssn、pin、password、password_buffer、pwd、pwd_buffer、pwdbuf、passwd。