状況によって引き起こされる脆弱性:
確実にメモリ操作システムStringオブジェクトからデータを削除することができない機密データを保管してください。
その後、メモリに保存されます(など、パスワード、社会保障番号、クレジットカード番号など)の機密データの使用後にメモリをクリアしていない場合、これらのデータは、漏れることがあります。一般的に、String
それがあるため、しかし、機密データを格納するために使用されている String
オブジェクトが変更されず、ユーザはメモリから削除するJVMのガベージコレクタを使用することができる String
値。不十分なJVMのメモリがない限り、それ以外のシステムは、ガベージコレクタの実行は保証されませんので、とき、ガベージコレクタを実行する必要はありません。アプリケーションがクラッシュが発生した場合は、メモリダンプ操作のアプリケーションは、機密データの漏洩を引き起こす可能性があります。
char配列は、一般的に文字列記憶されている機密データの代わりに使用されています。
(ストアするか否かをメディアコンバータとして使用される)などの長い文字列オブジェクトが使用されるように、データを格納する過程で、脆弱性が発生する可能性があります。
ボーは、メイン遭遇した状況です。
最初の(文字列方法に] [文字を入れる配列を直接使用するか、新しい文字列の脆弱性を有していてもよいです)。
char[] decryptChars = DecryptString(splits[1]);//splits是一个String[]
resultValue = String.valueOf(decryptChars);//该行引发漏洞,返回值resultValue是字符串
//resultValue = new String(decryptChars);//同上,该方法同样引发漏洞
Arrays.fill(decryptChars,' ');
if (resultValue == null) {
throw new Exception("解密字符串失败!");
}
更新:
char[] decryptChars = DecryptString(splits[1]);
StringBuffer sb = new StringBuffer();
for (int i = 0;i < decryptChars.length;i++){
sb.append(decryptChars[i]);
}
Arrays.fill(decryptChars,' ');
if (sb.length()==0){
throw new Exception("解密字符串失败!");
}
第(1バイトは[] [チャーに変換されます)。
byte[] bytes = HexToByte(sEncrypted);//sEncrypted是一个字符串
byte[] deBytes = DecryptStream(bytes);//加密
sDecryptChar = new String(deBytes,"ISO-8859-1");//引发漏洞,sDecryptChar是一个char[]
更新:
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
byte[] bytes = HexToByte(sEncrypted);
byte[] deBytes = DecryptStream(bytes);
Charset cs = Charset.forName("ISO-8859-1");
ByteBuffer bb = ByteBuffer.allocate(deBytes.length);
bb.put(bytes).flip();
CharBuffer cb = cs.decode(bb);
sDecryptChar = cb.array();