Руткиты в мире основанных на ядре Linux операционных систем уже не являются редкостью. Рассказ будет о том, как попытки в современных реалиях определить то, скомпрометирована ли система, привели к неожиданному результату.
8. $ agenda
Что есть руткит (scope)
Как снизить вероятность заражения
Как избавиться от того, что уже внутри? (inb4: сжечь)
9. $ agenda
Что есть руткит (scope)
Как снизить вероятность заражения
Как избавиться от того, что уже внутри? (inb4: сжечь)
Паника
10. $ agenda
Что есть руткит (scope)
Как снизить вероятность заражения
Как избавиться от того, что уже внутри? (inb4: сжечь)
Паника
Паранойя
11. $ agenda
Что есть руткит (scope)
Как снизить вероятность заражения
Как избавиться от того, что уже внутри? (inb4: сжечь)
Паника
Паранойя
Скорбь
12. $ agenda
Что есть руткит (scope)
Как снизить вероятность заражения
Как избавиться от того, что уже внутри? (inb4: сжечь)
Паника
Паранойя
Скорбь
О проекте по обнаружению руткитов
20. Как не словить?
Использование электронной подписи для модулей ядра
Обеспечение безопасность рабочего компьютера
администратора
21. Как не словить?
Использование электронной подписи для модулей ядра
Обеспечение безопасность рабочего компьютера
администратора
Знание о том, что происходит на вашей системе (что
должно быть, а чего не должно быть)
22. Как не словить?
Использование электронной подписи для модулей ядра
Обеспечение безопасность рабочего компьютера
администратора
Знание о том, что происходит на вашей системе (что
должно быть, а чего не должно быть)
Разграничение полномочий
23. Как не словить?
Использование электронной подписи для модулей ядра
Обеспечение безопасность рабочего компьютера
администратора
Знание о том, что происходит на вашей системе (что
должно быть, а чего не должно быть)
Разграничение полномочий
Обновление!
32. Чем могут заниматься?
Подмена системных файлов
Изменение логов
Изменение исполняемых файлов при старте
Скрытие процессов
33. Чем могут заниматься?
Подмена системных файлов
Изменение логов
Изменение исполняемых файлов при старте
Скрытие процессов
Скрытие сетевых соединений
34. Чем могут заниматься?
Подмена системных файлов
Изменение логов
Изменение исполняемых файлов при старте
Скрытие процессов
Скрытие сетевых соединений
Защита от обнаружения
35. Чем могут заниматься?
Подмена системных файлов
Изменение логов
Изменение исполняемых файлов при старте
Скрытие процессов
Скрытие сетевых соединений
Защита от обнаружения
Много всего остального, о чем знают только разработчики
42. Используемые методы
Поиск нарушений консистентности предоставляемой ядром
информации
Сравнение содержимого procfs с выводом команды ps aux
Поиск конкретных файлов известных руткитов
43. Используемые методы
Поиск нарушений консистентности предоставляемой ядром
информации
Сравнение содержимого procfs с выводом команды ps aux
Поиск конкретных файлов известных руткитов
Проверка целостности (e.g. с помощью rpm)
44. Используемые методы
Поиск нарушений консистентности предоставляемой ядром
информации
Сравнение содержимого procfs с выводом команды ps aux
Поиск конкретных файлов известных руткитов
Проверка целостности (e.g. с помощью rpm)
Перебор идентификаторов процесса
47. первый попавшийся rootkit с github vs chrootkit
Hook таблицы системных вызовов и скрытие себя
# make && insmod open−h i j a c k . c
# dmesg
[ 1 9 0 . 0 4 9 ] Simple mod : o r i g f f f f f f f f 8 1 2 0 b 9 4 0 new addr
# c h k r o o t k i t −q
ens3 : PACKET SNIFFER(/ sbin / d h c l i e n t [ 1 5 5 7 ] )
# rkhunter −c −q
p e r l : warning : Please check that your l o c a l e s e t t i n g
LANGUAGE = ( unset ) ,
LC_ALL = ( unset ) ,
LC_CTYPE = "ru_RU . utf8 " ,
LANG = "ru_RU . utf8 "
are supported and i n s t a l l e d on your system .
p e r l : warning : F a l l i n g back to the standard l o c a l e (
49. github.com/NoviceLive/research-rootkit
[ 5879.008563] pshidko . init_module :
Greetings the World !
[ 5879.009880] pshidko . init_module :
Opening the path : / proc .
[ 5879.011110] pshidko . init_module :
Succeeded in opening : / proc
[ 5879.012376] pshidko . init_module :
Changing file_op −>i t e r a t e from f f f f f f f f 8 1 2 7 a 0 0 0
to f f f f f f f f c 0 0 3 c 0 0 0 .
50. github.com/NoviceLive/research-rootkit
# ps aux
. . .
# dmesg
[ 6225.613397] pshidko . f a k e _ f i l l d i r : Hiding pid : 1
# rkhunter
Checking f o r hidden f i l e s and d i r e c t o r i e s
[ None found ]
Rootkit checks . . .
Rootkits checked : 299
P o s s i b l e r o o t k i t s : 0
# c h k r o o t k i t
Checking ‘ lkm ’ . . .
You have 1 process hidden f o r r e a d d i r command
# unhide quick
Found HIDDEN PID : 1 Command : " i n i t [ 2 ] "
51. Как нашелся?
chkrootkit:
#d e f i n e MAX_PROCESSES 999999
/∗ Brute f o r c e ∗/
s t r c p y ( buf , "/ proc /");
r e t p s = r e t d i r = 0;
f o r ( i = FIRST_PROCESS ; i <= MAX_PROCESSES; i++)
. . .
j = r e a d l i n k ("./ cwd" , path , s i z e o f ( path ) ) ;
. . .
52. Как нашелся?
unhide:
// PID under 301 are r e s e r v e d f o r k e r n e l
f o r ( x=0; x < 301; x++)
{
a l l p i d s [ x ] = 0 ;
a l l p i d s 2 [ x ] = 0 ;
}
f o r ( z =301; z < maxpid ; z++)
{
a l l p i d s [ z ] = z ;
a l l p i d s 2 [ z ] = z ;
}
f o r ( i =301; i < maxpid ; i++)
. . . .
53. Как нашелся?
unhide:
void get_max_pid ( i n t ∗ newmaxpid )
{
char path []= "/ proc / sys / k e r n e l /pid_max ";
pid_t tmppid = 0;
FILE∗ fd= fopen ( path ," r " ) ;
i f ( ! fd )
{
warnln (1 , unlog , "Cannot read c u r r e n t maximum
r e t u r n ;
}
56. My Little Fix
/∗
∗ A maximum of 4 m i l l i o n PIDs should be
∗ enough f o r a while .
∗ [NOTE: PID/TIDs are l i m i t e d to
∗ 2^29 ~= 500+ m i l l i o n , see f u t e x . h . ]
∗/
#d e f i n e PID_MAX_LIMIT
(CONFIG_BASE_SMALL ? PAGE_SIZE ∗ 8 :
( s i z e o f ( long ) > 4 ? 4 ∗ 1024 ∗ 1024
: PID_MAX_DEFAULT))
57. My Little Fix
Перед стартом процесса pid_max устанавливается в
PID_MAX_LIMIT-N
Запуск процесса
Снижение pid_max до прошлого значения
58. My Little Fix
# ps aux
. . .
# dmesg
[14365.243616] pshidko . f a k e _ f i l l d i r : Start process
[14965.325102] pshidko . f a k e _ f i l l d i r : Hiding pid : 412
# rkhunter
Checking f o r hidden f i l e s and d i r e c t o r i e s
[ None found ]
Rootkit checks . . .
Rootkits checked : 299
P o s s i b l e r o o t k i t s : 0
# c h k r o o t k i t
// None found
# unhide
// None found
68. Обнаружение: Встраивание в планировщик процессов
Основные причины вызова schedule():
Регулярное обновление текущей задачи с помощью
scheduler_tick()
69. Обнаружение: Встраивание в планировщик процессов
Основные причины вызова schedule():
Регулярное обновление текущей задачи с помощью
scheduler_tick()
Задача приостанавливается
70. Обнаружение: Встраивание в планировщик процессов
Основные причины вызова schedule():
Регулярное обновление текущей задачи с помощью
scheduler_tick()
Задача приостанавливается
Задача возобновляет выполнение (→ try_to_wake_up())
71. Обнаружение: Встраивание в планировщик процессов
try_to_wake_up():
Помещает задачу в очередь выполнения задач
72. Обнаружение: Встраивание в планировщик процессов
try_to_wake_up():
Помещает задачу в очередь выполнения задач
Изменяет состояние задачи на “TASK_RUNNING”
73. Обнаружение: Встраивание в планировщик процессов
try_to_wake_up():
Помещает задачу в очередь выполнения задач
Изменяет состояние задачи на “TASK_RUNNING”
Если пробуждаемая задача имеет приоритет выше
текущей задачи, то производит вызов планировщика с
целью перепланирования задач
74. Обнаружение: Встраивание в планировщик процессов
i n t hook_try_to_wake_up ( s t r u c t task_struct ∗p ,
unsigned i n t state ,
i n t wake_flags )
{
p r i n t k ("p−>pid : %d , p−>comm: %s n" , p−>pid ,
r e t u r n origin_try_to_wake_up (
p , state , wake_flags ) ;
}
75. Обнаружение: Встраивание в планировщик процессов
dmesg:
[ 9 4 . 5 6 8 ] p−>pid : 1749 , p−>comm: r s y s l o g d
[ 9 4 . 5 6 9 ] p−>pid : 1747 , p−>comm: r s : main Q: Reg
[ 9 4 . 5 7 2 ] p−>pid : 1749 , p−>comm: r s y s l o g d
[ 9 4 . 5 7 3 ] p−>pid : 1747 , p−>comm: r s : main Q: Reg
[ 9 4 . 5 7 6 ] p−>pid : 1749 , p−>comm: r s y s l o g d
[ 9 4 . 5 7 7 ] p−>pid : 1747 , p−>comm: r s : main Q: Reg
[ 9 4 . 5 8 0 ] p−>pid : 1749 , p−>comm: r s y s l o g d
[ 9 4 . 5 8 1 ] p−>pid : 1935 , p−>comm: hiddenprocess
[ 9 4 . 6 0 5 ] p−>pid : 1747 , p−>comm: r s : main Q: Reg