Обзор классических способов кражи данных из Java-приложений и методы защиты от утечки информации.
В этой статье мы рассмотрим возможные способы внедрения вредоносного кода в Java Virtual Machine (JVM) и получение доступа к конфиденциальным данным. Основная цель статьи — объяснить, как защитить ваше приложение. Планируется провести следующие атаки:
Если кто-то получит доступ к процессу Java, он сможет прочитать конфиденциальную информацию – пароли или адреса баз данных. Давайте посмотрим на следующую конфигурацию DataSource:
@Bean
public DataSource dataSource(){
MysqlDataSource mysqlDataSource = new MysqlDataSource();
mysqlDataSource.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
mysqlDataSource.setUser("mySqlUser");
mysqlDataSource.setPassword("secretPassword");
return mysqlDataSource;
}
Если хакер атакует наш сервер и получает доступ к процессу JVM, он может сделать дамп памяти JVM с помощью программы jcmd. Например:
jcmd 20932 GC.heap_dump d:\dump\JVM_DUMP.bin
Когда злоумышленник получит дамп JVM, он может запросить его с помощью VisualVM. Например, чтобы получить все строки, начинающиеся с «JDBC», хакер может выполнить следующий запрос:
select s from java.lang.String s where s.toString().startsWith("jdbc")
Или в качестве альтернативы он может получить объект MysqlDataSource:
select filter(heap.classes(), "/com.mysql.cj.jdbc.MysqlDataSource/.test(it.name)")
В следующем видео продемонстрировано, как можно сделать дамп и найти потенциально конфиденциальные данные из DataSource:
Подавляющее большинство приложений Java используют зависимости. Даже программы «hello world» должны использовать зависимость от регистратора. Никто не хочет изобретать велосипед и предпочитает использовать существующие решения. Но не все знают, что зависимости могут стать источником потенциальной утечки исходного кода или даже более серьезных проблем.
Для проведения атаки атакующему нужны две вещи:
Когда эти требования соблюдены, зараженная зависимость может выполнить вредоносный код. Теперь хакер получает следующие возможности:
Вышеописанные возможности – не полный список потенциальных действий. Внутри вредоносного ПО можно запускать любой код. Но среди всех проблем, самая важная — украденный исходный код.
Поскольку у JVM есть доступ к папке с классами, можно ожидать, что внешняя зависимость тоже имеет право на ее чтение. На практике кража исходного кода состоит из двух этапов:
В этом примере мы воспроизведем атаку, внедрив вредоносное ПО в библиотеку для протоколирования SLF4J (Simple Logging Facade for Java). Предполагаем, что хакер получил доступ к репозиторию SLF4J (как вариант, хакер может провести атаку типа «человек посередине» (Man-in-the-Middle, MitM) и подменить входящие запросы jar-файла из внешнего репозитория.
Для успешной атаки требуется, чтобы у жертвы уже была зависимость регистратора от внешнего репозитория (например, maven Central).
Пример атаки
Со стороны Java-приложения жертвы
Со стороны злоумышленника
Результаты, когда жертва обновляет версию и запускает приложение
На данный момент нет какого-либо окончательного способа защитить Java-приложение от таких атак – существует множество способов внедрить вредоносное ПО в ваш код. Хакеры могут внедрить вредоносное ПО во время сборки или внедрить вредоносное ПО в JDK (Java Development Kit), а также динамически заменять зависимости, получая контроль над вашей сетью. Однако ниже приведены некоторые меры предосторожности, которые следует принять для защиты вашего приложения:
Указанные меры помогают защитить приложение, но важно понимать, что полностью исключить риск атак практически невозможно – есть еще множество способов взломать Java-приложение. В этой статье мы описали самый известный и эффективный способ, которым пользуется большинство хакеров. Всегда важно оставаться в курсе последних тенденций в области кибербезопасности и регулярно обновлять меры защиты.
Гравитация научных фактов сильнее, чем вы думаете