Методика проведения анализа помеченных данных

Ниже рассматривается применение инструмента «Блесна» для проведения анализа помеченных данных с целью проверки обработки чувствительных данных в ядре операционной системы Linux, в том числе для выявления потенциальных возможностей для утечки чувствительных данных. В качестве примера используется сценарий работы, в котором происходит обработка чувствительных данных при помощи средства работы с ключами ядра Linux (Linux keyring).

Для проведения анализа с применением инструмента «Блесна» необходимы следующие данные.

  1. Трасса выполнения тестового сценария.
  2. Объектные файлы с образом ядра и его модулей.
  3. Дополнительно необязательные файлы, содержащие символы с описаниями имен и смещений функций в ядре и модулях.
  4. Описания моделей функций.

Генерация трассы для анализа

Для получения трассы выполнения тестового сценария используется запись для детерминированного воспроизведения выполнения в эмуляторе QEMU тестового сценария:

# Cоздание overlay диска для сохранения состояния виртуальной машины.
# $ROOTFS_PATH - путь к файлу с образом корневой файловой системы,
# подготовленной для выполнения тестового сценария, в том числе
# содержащий установленный пакет keyutils.
qemu-img create -f qcow2 -b $ROOTFS_PATH/debian.img -F raw $ROOTFS_PATH/debian.diff.qcow2

# Запуск эмуляции с записью выполнения.
# $QEMU_PATH - путь к исполняемым файлам версии эмулятора QEMU с поддержкой
# плагина генерации трассы выполнения.
# $KERNEL_PATH - путь к сжатому образу ядра bzImage.
# Для возможности анализа трассы, сгенерированной из записи, 
# должна быть отключена рандомизация размещения адресного
# пространства (конфигурацией ядра при сборке
# (CONFIG_RANDOMIZE_BASE=n) или опцией запуска ядра nokaslr).
# Диски подключаются с загрузкой дополнительного драйвера
# для корректного воспроизведения дисковых операций.
# $JOURNAL - имя файла с записью выполнения для воспроизведения.
# $EVENTS - имя файла с записью событий, происходящих в процессе выполнения.
$QEMU_PATH/qemu-system-x86_64 -net none -m 2G -monitor stdio \
-kernel $KERNEL_PATH/bzImage \
-append "nokaslr root=/dev/sda" \
-drive file=$ROOTFS_PATH/debian.diff.qcow2,if=none,id=device-8-file \
-drive driver=blkreplay,if=none,image=device-8-file,id=device-8-driver \
-device ide-hd,drive=device-8-driver \
-icount shift=auto,rr=record,rrfile=$JOURNAL,events=$EVENTS

Для сокращения времени генерации и размера трассы перед началом выполнения тестового сценария в загруженной виртуальной машине можно использовать возможность создания снапшота, выполнив в консоли QEMU команду:

(qemu) savevm test_start

Для выполнения рассматриваемого тестового сценария в командной строке терминала виртуальной машины необходимо выполнить следующие команды.

# Вывод списка ключей в текущей сессии.
keyctl list @s

# Добавление нового ключа в текущую сессию с сохранением
# возращаемого номера ключа, который будет использован
# для его удаления.
test_key=$(keyctl add user 'test:key' "XXXXXXXXXX" @s)

# Вывод списка ключей в текущей сессии.
keyctl list @s

# Удаление созданного ключа.
keyctl unlink $test_key @s

# Вывод списка ключей в текущей сессии.
keyctl list @s

После завершения тестового сценария необходимо выключить виртуальную машину, выполнив в консоли QEMU команду:

(qemu) quit

Для генерации трассы для анализа инструментом «Блесна» запускается в остановленном режиме детерминированное воспроизведение снапшота test_start.

# Запуск эмулятора для воспроизведения тестового сценария с генерацией трассы.
# Опция -S запускает эмулятор в остановленном режиме, что необходимо
# для загрузки плагина генерации трассы и его старта.
$QEMU_PATH/qemu-system-x86_64 -net none -m 2G -monitor stdio \
-kernel $KERNEL_PATH/bzImage -append "nokaslr root=/dev/sda" \
-drive file=$ROOTFS_PATH/debian.diff.qcow2,if=none,id=device-8-file \
-drive driver=blkreplay,if=none,image=device-8-file,id=device-8-driver \
-device ide-hd,drive=device-8-driver \
-icount shift=auto,rr=replay,rrfile=$JOURNAL,events=$EVENTS,rrsnapshot=start_test
-S

После запуска эмулятора в остановленном режиме в консоли QEMU выполняются команды загрузки плагина генерации трассы, запуска генерации трассы и запуска эмуляции.

(qemu) plugins_load trace
(qemu) trace_start file=trace
(qemu) cont

После окончания воспроизведения тестового сценария в консоли QEMU выполняются команды остановки эмуляции, остановки генерации трассы и завершения эмулятора.

(qemu) stop
(qemu) trace_stop
(qemu) quit

В результате в текущей директории сгенерируется набор файлов трассы с именем, заданным в параметре file команды trace_start:

$ ls -1 trace.*
trace.bin
trace.devinfo
trace.dma_info
trace.fto
trace.ini
trace.oobe
trace.tlb_log_info

Конфигурирование проекта в инструменте «Блесна»

Инструмент «Блесна» запускается в командной строке терминала командой Lure. Для запуска мастера создания в открывшемся окне инструмента надо выбрать пункты меню Проект -> Новый проект.

lure01

В открывшемся окне надо ввести следующие данные:

  1. имя проекта;
  2. выбрать каталог, где будут размещены файлы проекта;
  3. указать файл манифеста трассы с полным путем (файл с расширением .ini, см. выше, в рассматриваемом примере trace.ini).

lure01-2

После нажатия кнопки Далее откроется следующий экран мастера:

lure02

В качестве платформы необходимо выбрать Linux. В поле Образ ядра Linux указать файл с несжатым образом ядра, которое использовалось при генерации трассы. Включить флаг Адрес загрузки ядра Linux и оставить в поле значение по умолчанию. Включить флаг Файл Linux system.map и указать файл с полным путем к файлу с символьной информацией ядра.

В поле Размещение символьных файлов можно указать каталог с дополнительными бинарными файлами, которые были задействованы в тестовом сценарии, для рассматриваемого примера таким файлом может быть бинарный файл библиотеки libkeyutils (libkeyutils.so.1.9).

lure02-2

Для создания и запуска предварительной обработки проекта надо последовательно нажать кнопки Далее и Завершить. Прогресс предварительной обработки будет отображаться в открывшемся окне.

lure04

После завершение предварительной обработки откроется окно с соответствующим сообщением.

lure05

Анализ обработки чувствительных данных

В интерфейсе инструмента в разделе Поиск утечек должен быть выбран Автоматический режим.

lure06

Для добавления моделей функций надо в соседнем разделе перейти на вкладку Модели функций и нажать кнопку +. В открывшемся окне выбрать модуль, содержащий функцию, и нажать кнопку Далее.

lure07

В следующем окне в списке доступных функций выбрать нужную функцию и нажать кнопку Далее.

lure08

Для завершение создания новой модели функции надо нажать на кнопку Завершить.

lure09

Если все сделано правильно, то функция отобразится в разделе Поиск утечек в списке Источник, в котором для рассматриваемого примера надо выбрать функцию add_key, и, при необходимости промотав окно раздела вниз до конца, нажать на кнопку Построить список задач.

lure11

В открывшейся вкладке Список задач надо запустить анализ, нажав на кнопку Поиск утечек.

lure12

После завершения анализа откроется вкладка Вердикт с результатами.

lure13

Зеленая галочка говорит об отсутствии утечек памяти и правильной работе с чувствительными данными. Выбрав во вкладке «Вердикт» интересующий нас элемент, мы можем получить подробную информацию об этих данных. Нажмем на кнопку «Восстановить буфер» и запустим алгоритм восстановления содержимого буфера. В окне восстановление буфера будет отображено содержимое чувствительных данных и место нахождения их в памяти.