2016-07-18 10 views
5

Bir PA-DSS denetim süreci sırasında, kredi kartı ödeme işlemini yürüttükten sonra sunucu taraflı kodumuzda (işlem belleği dökümü) kredi kartı numarası bulundu.Nasıl hassas kart verileri için java.io.BufferedOutputStream bellek kazıyıcı için güvenli hale getirilir?

Başlangıçta yalnızca JVM çöp toplayıcısını ödeme işleminin sonunda çağırmayı denedim çünkü değişkenlerimiz bu sorunu çözmek için yereldi. Ancak hala bellek dökümünde bir kredi kartına (CC) atıfta bulunan tek bir örnek var. Bu CC dizesi (aslında bir bayt []), sonunda BufferedOutputStream nesnesini kullanan sun.net.www.protocol.https.HttpsClient kullanarak SOAP CXF istemci nesnesi tarafından başvurulmuştur.

BufferedOutputStream koduna bakıyorum Özel flushBuffer() yönteminin sayım değişkeni sıfıra ayarlandığını ve dahili bayt [] dizisini sıfırlamadığını fark ettim.

Düzenli uygulama için bu kodda sorun yok (yalnızca sıfırlama sayısı değişkeni daha basit ve etkilidir) ancak bu, güvenli denetim sürecimizde bir bayrak çıkardı; böylece alternatifim özel bir java.io.BufferedOutputStream oluşturmaktı. Bu bayt dizisini sıfırla ve sonra bu dosyayı tomcat boot sınıf yoluna eklemeliyim.

private void flushBuffer() throws IOException { 
    if (count > 0) { 
     out.write(buf, 0, count); 

     //NEW - Custom code to reset buffer 
     for (int i = 0; i < count; i++) { 
      buf[i] = 0; 
     } 
     //End custom code 

     count = 0; 
    } 
    } 

Bu aslında çalıştı ve ben bellekte CC verileri artık dökümü bulamadık ama bu doğru çözüm (bir java çekirdek sınıfın özel değişikliği) olduğunu hissetmiyorum.

Bu sorunu farklı bir şekilde nasıl ele alabileceğime dair herhangi bir öneri (herhangi bir kitaplık kodunu değiştirmek zorunda kalmadan)?

+0

SOAP İstemcisi bir şekilde önbelleğe alınıyor mu? Veya kullandığı bağlantı olabilir mi? –

+0

Bu, bulduğunuz tek durum olduğuna şaşırdım. Genel olarak JVM dökülenler sağlam bir şekilde güvenli değildir. – EJP

+0

Eclipse Memory Analyzer'ı inceledim ve bu hassas veriyi önbelleğe alan sınıf sun.security.ssl.SSLSocketImpl (iç alandaki handshakeListeners). Ancak bu sabun istemcisine veya bu bağlantıya herhangi bir doğrudan referans göstermiyorum. – amboni

cevap

4

Java, "herhangi bir kütüphane kodunu değiştirmek zorunda kalmadan" kütüphaneleri genişletmenize izin verir. BufferedOutputStream'i, bir floştan sonra ve çöp toplama işleminden önce tamponun içeriğini sıfırlayacak olan SecureBufferedOutputStream'i genişletebilirsiniz (JVM uygulamanızın toplanan belleği önceden sıfırlamaması durumunda).

import java.io.BufferedOutputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.util.Arrays; 

public class SecureBufferedOutputStream extends BufferedOutputStream { 

    public SecureBufferedOutputStream(OutputStream out) { 
     super(out); 
    } 

    public SecureBufferedOutputStream(OutputStream out, int size) { 
     super(out, size); 
    } 

    @Override 
    public synchronized void flush() throws IOException { 
     super.flush(); 
     Arrays.fill(buf, (byte) 0); 
    } 

    @Override 
    protected void finalize() throws Throwable { 
     super.finalize(); 
     Arrays.fill(buf, (byte) 0); 
    } 
} 
+0

Cevabınız için teşekkürler rocketblast, ama benim soruda söylediğim gibi sorun başka bir java kütüphanesinde (CXF) BufferedOutputStream kullanır. Bu yeni güvenli arabelleği kullanmak için tüm ilgili CXF sınıflarını değiştirmem gerekir. Bu yüzden bu apache kütüphanesini değiştirmem gerekiyor. – amboni

İlgili konular