2016-07-18 16 views
5

Trong quá trình kiểm tra PA-DSS, nó đã được tìm thấy số thẻ tín dụng trong mã phía máy chủ của chúng tôi (quá trình xử lý bộ nhớ) sau khi chạy một giao dịch thanh toán bằng thẻ tín dụng.Làm thế nào để làm cho java.io.BufferedOutputStream được bảo mật cho bộ nhớ scraper cho dữ liệu thẻ nhạy cảm?

Tôi đã thử ban đầu chỉ cần gọi bộ thu gom rác JVM ở cuối giao dịch thanh toán vì các biến của chúng tôi là cục bộ để giải quyết vấn đề này. Nhưng vẫn còn một trường hợp duy nhất đề cập đến một thẻ tín dụng (CC) trong bộ nhớ dump. Chuỗi CC này (thực ra nó là một byte []) đã được tham chiếu bởi đối tượng máy khách SOAP CXF đang sử dụng lệnh sun.net.www.protocol.https.HttpsClient bên trong đã sử dụng đối tượng BufferedOutputStream.

Nhìn vào mã cho BufferedOutputStream Tôi đã nhận thấy phương thức flushBuffer() riêng chỉ là thiết lập biến đếm về 0 và không đặt lại mảng byte [] bên trong.

Không có vấn đề nào trong mã này đối với ứng dụng thông thường (chỉ cần đặt lại biến số đơn giản và hiệu quả hơn) nhưng điều này đã tăng cờ trong quy trình kiểm tra an toàn của chúng tôi để thay thế của tôi là tạo java.io.BufferedOutputStream tùy chỉnh zero mảng byte này và sau đó tôi sẽ cần phải thêm tập tin này trong classpath khởi động tomcat.

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; 
    } 
    } 

Điều này thực sự làm việc và tôi không thể tìm thấy dữ liệu CC trong bộ nhớ đổ nữa nhưng tôi không cảm thấy đây là giải pháp đúng (thay đổi tùy chỉnh của một lớp lõi java).

Bất kỳ đề xuất nào về cách tôi có thể giải quyết vấn đề này theo cách khác (phải thay đổi bất kỳ mã thư viện nào)?

+0

Trình khách SOAP có được lưu trong bộ nhớ cache bằng cách nào đó không ?? Hoặc có thể là kết nối mà nó sử dụng? –

+0

Tôi ngạc nhiên đây là trường hợp duy nhất bạn tìm thấy. Nói chung, các bãi JVM không an toàn đáng ngạc nhiên. – EJP

+0

Tôi đã xem trong bộ phân tích bộ nhớ Eclipse và lớp bộ đệm ẩn dữ liệu nhạy cảm này là sun.security.ssl.SSLSocketImpl (bên trong trường handshakeListeners). Nhưng tôi không giữ bất kỳ tham chiếu trực tiếp đến khách hàng xà phòng này hoặc kết nối này. – amboni

Trả lời

4

Java cho phép bạn mở rộng thư viện mà không cần phải thay đổi bất kỳ mã thư viện nào. Bạn có thể mở rộng BufferedOutputStream để tạo SecureBufferedOutputStream, sẽ không phải là nội dung của bộ đệm sau khi một bộ sưu tập rác và trước khi thu gom rác (trong trường hợp triển khai JVM của bạn không có bộ nhớ thu thập rác).

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

Cảm ơn bạn đã trả lời tên lửa, nhưng như tôi đã nói trong câu hỏi của tôi vấn đề nằm trong thư viện java khác (CXF) sử dụng BufferedOutputStream. Tôi sẽ cần phải thay đổi tất cả các lớp học CXF có liên quan để sử dụng bộ đệm an toàn mới này. Vì vậy, tôi vẫn sẽ cần phải thay đổi thư viện apache này. – amboni

Các vấn đề liên quan