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;
}
}
この例では、User オブジェクト (機密データを含む) がストリームに書き込まれています。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 は機密データに関連する以前の欠陥を検出しなくなります。
構成可能なチェッカーでの脆弱コード例
このチェッカーは、dob、ssn、password などの機密データのデフォルトリストで構成されています。このリストは、すべてを含むものではなく、構成可能であることを意図しています。機密データは、.jkb ファイルの @CheckerParam 注釈を使用して構成できます。ユーザーがカスタム @CheckerParam オプションを指定すると、デフォルトの組み込み型の機密用語リストはもはや使用されなくなります。
この例では、ユーザーはソフトウェアのドメイン固有の知識を持ち、患者の「name」、「dob」、「address」は機密のデータタイプであることを確認しました。次の注釈を含む .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"; }
}
}
機密データを含むオブジェクト (「patient」) が 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 は、ストリームを暗号化するために使用されます。
機密データを含むオブジェクト (「patient」) が ObjectOutputStream に書き込まれたときにも Klocwork は欠陥を検出しますが、データが暗号化されているため、手動の検査では誤検知であると判断される可能性があります。この欠陥は無視できるようになりました。
関連チェッカー
外部参考資料
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。
拡張機能
このチェッカーは、.jkb ファイルの @CheckerParam と @Check オプションを使用して機密値を探すように調整できます。このチェッカーを調整してカスタムの機密値を追加すると、デフォルトは使用されなくなります。それらも含めたい場合は、それらをカスタム値とともに .jkb ファイルに再追加することができます。詳細については、Java 解析のチューニングを参照してください。
デフォルト機密値
デフォルトで使用される機密値は、dob、ssn、pin、password、password_buffer、pwd、pwd_buffer、pwdbuf、passwd です。