
Обнаружение действий руткита по скрытию файлов путем анализа изменений времени выполнения функций ядра.
Этот репозиторий содержит код для сбора временных измерений функций ядра, которые манипулируются руткитами при сокрытии файлов, а также метод полуконтролируемого обнаружения, анализирующий сдвиги времени выполнения функций ядра. Данная реализация основана на рутките с открытым исходным кодом CARAXES, который перехватывает функцию filldir для управления результатами перечисления файлов, например, при выполнении команды ls. Временные измерения берутся из нескольких функций системного вызова getdents (включая filldir) с помощью eBPF-зондов. Для обнаружения мы применяем простую модель машинного обучения, основанную на статистическом тестировании. Подробные объяснения механизмов сбора данных и обнаружения аномалий приведены в следующей публикации. Если вы используете какие-либо ресурсы из этого репозитория, пожалуйста, цитируйте следующую публикацию:
Следующие шаги настраивают руткит и объясняют, как собирать временные измерения функций ядра. Если вас интересует только обнаружение аномалий и вы хотите использовать наши публичные наборы данных, этот раздел можно пропустить.
Руткит и зондирование тестировались на ядрах Linux 5.15-6.11 и Python 3.10. Чтобы запустить инструменты, скачайте этот репозиторий и установите следующие зависимости, необходимые для работы руткита и механизма зондирования.
ubuntu@ubuntu:~$ git clone https://github.com/ait-aecid/rootkit-detection-ebpf-time-trace.git
ubuntu@ubuntu:~$ cd rootkit-detection-ebpf-time-trace
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ sudo apt update
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ sudo apt install python3-bpfcc make gcc flex bison python3-pip linux-headers-$(uname -r)
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ pip install -r requirements.txt
Некоторые сценарии требуют дополнительных ресурсов. В частности, сценарий ls-basic требует компиляции скрипта ls-basic, а сценарий системной нагрузки требует установки stress-ng. Если вы не хотите использовать эти сценарии, следующие зависимости можно пропустить.
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ gcc -o ls-basic ls-basic.c
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ sudo apt install stress-ng
Следующие команды обязательны, так как руткит по умолчанию манипулирует системным вызовом getdents, однако в настоящее время поддерживается только перехват filldir. Скачайте руткит, замените hooks.h файлом, предоставленным в этом репозитории (это гарантирует, что будет перехвачена функция filldir, а не getdents), и скомпилируйте руткит.
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ cd ..
ubuntu@ubuntu:~$ git clone https://github.com/ait-aecid/caraxes.git
ubuntu@ubuntu:~$ cd caraxes/
ubuntu@ubuntu:~/caraxes$ cp ../rootkit-detection-ebpf-time-trace/hooks.h .
ubuntu@ubuntu:~/caraxes$ sudo make
Если у вас возникли проблемы с установкой руткита или вы хотите проверить, работает ли он как ожидается, ознакомьтесь с ReadMe на странице GitHub CARAXES.
После этого вернитесь в этот репозиторий и откройте linux.py, чтобы изменить переменную KERNEL_OBJECT_PATH так, чтобы она указывала на только что склонированную папку caraxes; путь по умолчанию: "/home/ubuntu/caraxes/".
ubuntu@ubuntu:~/caraxes$ cd ../rootkit-detection-ebpf-time-trace
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ vim linux.py
Теперь вы готовы запустить механизм зондирования, который автоматически внедрит зонды в ядро, запустит руткит, сохранит данные временных измерений в файл и остановит руткит. Для вызова системных вызовов скрипт создает каталог с файлами, которые нужно скрыть, и выполняет ls 100 раз (можно изменить с помощью флага -i), опрашивая зонды. Скрипт позволяет собирать измерения с руткитом (флаг --rootkit), без руткита (флаг --normal) или оба, и поддерживает несколько сценариев. Запустите сценарий по умолчанию следующей командой:
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ sudo python3 probing.py --normal --rootkit
compiling eBPF probes...
probes compiled!
attached bpf probes:
iterate_dir-enter
iterate_dir-return
dcache_readdir-enter
dcache_readdir-return
filldir64-enter
filldir64-return
verify_dirent_name-enter
verify_dirent_name-return
touch_atime-enter
touch_atime-return
Running experiment with ls for 100 times.
Iteration 0...
detection_PID: 70133
Iteration 1...
detection_PID: 70134
...
Iteration 99...
detection_PID: 70338
polled 40 times!
done with the "rootkit version"
Experiment finished, saving output.
Saved data to events/events_2025-01-17T09:59:52.183801_rootkit.json.gz
412K events/events_2025-01-17T09:59:52.183801_rootkit.json.gz
Измерения сохраняются в каталоге events. Ознакомьтесь со страницей справки с помощью python3 probing.py -h, чтобы узнать о других параметрах, которые позволяют настроить сбор данных в других сценариях (например, используя ls-basic вместо ls или имитируя системную нагрузку) и присвоить имена различным запускам (--description). Просмотрите repeat_seq.sh для некоторых параметризованных команд; фактически, мы использовали этот скрипт для сбора наших публичных наборов данных. Обратите внимание, что мы рассматриваем только некоторые из доступных функций ядра из системного вызова getdents. Чтобы указать, к каким функциям механизм зондирования должен подключать зонды, откройте probing.py и добавьте или удалите имена функций в списке probe_points в начале файла.
Для запуска алгоритма обнаружения аномалий требуется только установить зависимости Python. Если вы еще не сделали этого на предыдущем шаге, выполните следующую команду для установки зависимостей с помощью pip.
ubuntu@ubuntu:~$ git clone https://github.com/ait-aecid/rootkit-detection-ebpf-time-trace.git
ubuntu@ubuntu:~$ cd rootkit-detection-ebpf-time-trace
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ pip install -r requirements.txt
Затем скачайте и распакуйте набор данных, который мы предоставляем на Zenodo. Если вы сгенерировали собственные данные на предыдущем шаге и хотите использовать их, пропустите этот шаг.
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ wget https://zenodo.org/records/14679675/files/events.zip
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ unzip events.zip
Теперь вы готовы запустить обнаружение аномалий следующим образом. Укажите каталог, содержащий данные измерений (-d), долю нормальных данных, используемых для обучения (-t), режим работы (-m) и функцию группировки (-g). Скрипт загрузит все файлы из указанного каталога, разделит их на обучающие и тестовые данные (суммировано в выводе), вычислит и выведет метрики обнаружения, а также построит матрицу ошибок.
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ python3 evaluate.py -d events -t 0.333 -m offline -g fun
100%|█████████████████████████████████████████████| 1250/1250 [02:47<00:00, 7.45it/s]
Processed all files from events
Normal batches: 750
Normal batches for training: 250
default: 50
file_count: 50
system_load: 50
ls_basic: 50
filename_length: 50
Normal batches for testing: 500
default: 100
file_count: 100
system_load: 100
ls_basic: 100
filename_length: 100
Anomalous batches: 500
default: 100
file_count: 100
system_load: 100
ls_basic: 100
filename_length: 100
Results (Run 1)
Threshold=3.5111917342151415e-16
Time=0.0027740001678466797
TP=499
FP=9
TN=491
FN=1
TPR=R=0.998
FPR=0.018
TNR=0.982
P=0.9822834645669292
F1=0.9900793650793651
ACC=0.99
MCC=0.9801254640896192
Confusion Matrix (Run 1)
Predicted
default file_count system_load ls_basic filename_length
Pos Neg Pos Neg Pos Neg Pos Neg Pos Neg
100 0 100 0 100 0 100 0 100 0 Pos - Actual default
3 97 100 0 99 1 100 0 2 98 Neg - Actual default
100 0 100 0 100 0 100 0 100 0 Pos - Actual file_count
100 0 0 100 100 0 100 0 100 0 Neg - Actual file_count
100 0 100 0 100 0 100 0 100 0 Pos - Actual system_load
100 0 100 0 4 96 100 0 100 0 Neg - Actual system_load
100 0 100 0 100 0 99 1 100 0 Pos - Actual ls_basic
100 0 100 0 100 0 2 98 100 0 Neg - Actual ls_basic
99 1 100 0 100 0 100 0 100 0 Pos - Actual filename_length
3 97 100 0 99 1 100 0 0 100 Neg - Actual filename_length
Ознакомьтесь с руководством с помощью python3 evaluate.py -h, чтобы узнать больше о доступных параметрах этого скрипта. Также посмотрите demo.sh, чтобы увидеть параметризованные команды, которые мы использовали для оценки в нашей статье.
Если вы используете какие-либо ресурсы из этого репозитория, пожалуйста, цитируйте следующую публикацию: