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。