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。