Как сделать java.io.BufferedOutputStream безопасным для скребка памяти для конфиденциальных данных карты?

java security cxf

281 просмотра

1 ответ

26 Репутация автора

Во время процесса аудита PA-DSS был найден номер кредитной карты в нашем коде на стороне сервера (дамп памяти процесса) после выполнения транзакции оплаты кредитной картой.

Сначала я попытался просто вызвать сборщик мусора JVM в конце транзакции оплаты, поскольку наши переменные были локальными для решения этой проблемы. Но есть еще один экземпляр, ссылающийся на кредитную карту (CC) в дампе памяти. На эту строку CC (фактически это был byte []) ссылался клиентский объект SOAP CXF, который внутренне использовал sun.net.www.protocol.https.HttpsClient, который, наконец, использовал объект BufferedOutputStream.

Глядя на код для BufferedOutputStream, я заметил, что закрытый метод flushBuffer () просто устанавливал переменную count в ноль и не сбрасывал внутренний массив byte [].

Нет проблем в этом коде для обычного приложения (просто сбросить переменную счетчика проще и эффективнее), но это подняло флаг в нашем безопасном процессе аудита, поэтому моей альтернативой было создать пользовательский java.io.BufferedOutputStream, который бы сбрасывал в ноль этот байтовый массив и тогда мне нужно было бы добавить этот файл в путь загрузки загрузчика 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;
     }
   }

Это действительно сработало, и я больше не мог найти данные CC в дампе памяти, но я не чувствую, что это правильное решение (пользовательское изменение базового класса java).

Любое предложение, как я мог бы решить эту проблему по-другому (без необходимости изменения любого кода библиотеки)?

Автор: amboni Источник Размещён: 18.07.2016 07:53

Ответы (1)


4 плюса

156 Репутация автора

Java позволяет расширять библиотеки без «необходимости изменять какой-либо библиотечный код». Вы можете расширить BufferedOutputStream, чтобы сделать SecureBufferedOutputStream, который будет обнулять содержимое буфера после сброса и перед сборкой мусора (в случае, если ваша реализация JVM уже не обнуляет сборочную память).

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);
    }
}
Автор: rocketblast Размещён: 13.11.2016 08:16
Вопросы из категории :
32x32