[defcon russia #29] Михаил Клементьев - Обнаружение руткитов в...
TRANSCRIPT
Обнаружение руткитов в GNU/Linux
Клементьев МихаилDCG #7812
10 марта 2017 г.
$ whoami
I Linux Kernel Security Developer
I Security researcher atI Hardened Gentoo loverI Associate member of
$ whoami
I Linux Kernel Security DeveloperI Security researcher at
I Hardened Gentoo loverI Associate member of
$ whoami
I Linux Kernel Security DeveloperI Security researcher atI Hardened Gentoo lover
I Associate member of
$ whoami
I Linux Kernel Security DeveloperI Security researcher atI Hardened Gentoo loverI Associate member of
$ agenda
I Что есть руткит (scope)
I Как снизить вероятность зараженияI Как избавиться от того, что уже внутри? (inb4: сжечь)I ПаникаI ПаранойяI СкорбьI О проекте по обнаружению руткитов
$ agenda
I Что есть руткит (scope)I Как снизить вероятность заражения
I Как избавиться от того, что уже внутри? (inb4: сжечь)I ПаникаI ПаранойяI СкорбьI О проекте по обнаружению руткитов
$ agenda
I Что есть руткит (scope)I Как снизить вероятность зараженияI Как избавиться от того, что уже внутри? (inb4: сжечь)
I ПаникаI ПаранойяI СкорбьI О проекте по обнаружению руткитов
$ agenda
I Что есть руткит (scope)I Как снизить вероятность зараженияI Как избавиться от того, что уже внутри? (inb4: сжечь)I Паника
I ПаранойяI СкорбьI О проекте по обнаружению руткитов
$ agenda
I Что есть руткит (scope)I Как снизить вероятность зараженияI Как избавиться от того, что уже внутри? (inb4: сжечь)I ПаникаI Паранойя
I СкорбьI О проекте по обнаружению руткитов
$ agenda
I Что есть руткит (scope)I Как снизить вероятность зараженияI Как избавиться от того, что уже внутри? (inb4: сжечь)I ПаникаI ПаранойяI Скорбь
I О проекте по обнаружению руткитов
$ agenda
I Что есть руткит (scope)I Как снизить вероятность зараженияI Как избавиться от того, что уже внутри? (inb4: сжечь)I ПаникаI ПаранойяI СкорбьI О проекте по обнаружению руткитов
Who is Mr. Rootkitsky?
Who is Mr. Rootkitsky?
Меня поломали?
Linux Kernel Vulnerabilities By Year (1999-2017)
Linux Kernel Vulnerabilities By Type (1999-2017)
Меня поломали?Да.
Как не словить?
I Использование электронной подписи для модулей ядра
I Обеспечение безопасность рабочего компьютераадминистратора
I Знание о том, что происходит на вашей системе (чтодолжно быть, а чего не должно быть)
I Разграничение полномочийI Обновление!
Как не словить?
I Использование электронной подписи для модулей ядраI Обеспечение безопасность рабочего компьютера
администратора
I Знание о том, что происходит на вашей системе (чтодолжно быть, а чего не должно быть)
I Разграничение полномочийI Обновление!
Как не словить?
I Использование электронной подписи для модулей ядраI Обеспечение безопасность рабочего компьютера
администратораI Знание о том, что происходит на вашей системе (что
должно быть, а чего не должно быть)
I Разграничение полномочийI Обновление!
Как не словить?
I Использование электронной подписи для модулей ядраI Обеспечение безопасность рабочего компьютера
администратораI Знание о том, что происходит на вашей системе (что
должно быть, а чего не должно быть)I Разграничение полномочий
I Обновление!
Как не словить?
I Использование электронной подписи для модулей ядраI Обеспечение безопасность рабочего компьютера
администратораI Знание о том, что происходит на вашей системе (что
должно быть, а чего не должно быть)I Разграничение полномочийI Обновление!
И что, это поможет?
И что, это поможет?Нет.
Какие бывают?
I User-space
I Kernel-space
Какие бывают?
I User-spaceI Kernel-space
Чем могут заниматься?
I Подмена системных файлов
I Изменение логовI Изменение исполняемых файлов при стартеI Скрытие процессовI Скрытие сетевых соединенийI Защита от обнаруженияI Много всего остального, о чем знают только разработчики
Чем могут заниматься?
I Подмена системных файловI Изменение логов
I Изменение исполняемых файлов при стартеI Скрытие процессовI Скрытие сетевых соединенийI Защита от обнаруженияI Много всего остального, о чем знают только разработчики
Чем могут заниматься?
I Подмена системных файловI Изменение логовI Изменение исполняемых файлов при старте
I Скрытие процессовI Скрытие сетевых соединенийI Защита от обнаруженияI Много всего остального, о чем знают только разработчики
Чем могут заниматься?
I Подмена системных файловI Изменение логовI Изменение исполняемых файлов при стартеI Скрытие процессов
I Скрытие сетевых соединенийI Защита от обнаруженияI Много всего остального, о чем знают только разработчики
Чем могут заниматься?
I Подмена системных файловI Изменение логовI Изменение исполняемых файлов при стартеI Скрытие процессовI Скрытие сетевых соединений
I Защита от обнаруженияI Много всего остального, о чем знают только разработчики
Чем могут заниматься?
I Подмена системных файловI Изменение логовI Изменение исполняемых файлов при стартеI Скрытие процессовI Скрытие сетевых соединенийI Защита от обнаружения
I Много всего остального, о чем знают только разработчики
Чем могут заниматься?
I Подмена системных файловI Изменение логовI Изменение исполняемых файлов при стартеI Скрытие процессовI Скрытие сетевых соединенийI Защита от обнаруженияI Много всего остального, о чем знают только разработчики
Open source решения
I chkrootkit (http://www.chkrootkit.org/ | 30.10.2016)
I unhide (http://www.unhide-forensics.info/ | 26.05.2013)I rkhunter (http://rkhunter.sf.net/ | 24.02.2014)I kjackal (https://github.com/dgoulet/kjackal | 16.06.2014)
Open source решения
I chkrootkit (http://www.chkrootkit.org/ | 30.10.2016)I unhide (http://www.unhide-forensics.info/ | 26.05.2013)
I rkhunter (http://rkhunter.sf.net/ | 24.02.2014)I kjackal (https://github.com/dgoulet/kjackal | 16.06.2014)
Open source решения
I chkrootkit (http://www.chkrootkit.org/ | 30.10.2016)I unhide (http://www.unhide-forensics.info/ | 26.05.2013)I rkhunter (http://rkhunter.sf.net/ | 24.02.2014)
I kjackal (https://github.com/dgoulet/kjackal | 16.06.2014)
Open source решения
I chkrootkit (http://www.chkrootkit.org/ | 30.10.2016)I unhide (http://www.unhide-forensics.info/ | 26.05.2013)I rkhunter (http://rkhunter.sf.net/ | 24.02.2014)I kjackal (https://github.com/dgoulet/kjackal | 16.06.2014)
Используемые методы
I Поиск нарушений консистентности предоставляемой ядроминформации
I Сравнение содержимого procfs с выводом команды ps auxI Поиск конкретных файлов известных руткитовI Проверка целостности (e.g. с помощью rpm)I Перебор идентификаторов процесса
Используемые методы
I Поиск нарушений консистентности предоставляемой ядроминформации
I Сравнение содержимого procfs с выводом команды ps aux
I Поиск конкретных файлов известных руткитовI Проверка целостности (e.g. с помощью rpm)I Перебор идентификаторов процесса
Используемые методы
I Поиск нарушений консистентности предоставляемой ядроминформации
I Сравнение содержимого procfs с выводом команды ps auxI Поиск конкретных файлов известных руткитов
I Проверка целостности (e.g. с помощью rpm)I Перебор идентификаторов процесса
Используемые методы
I Поиск нарушений консистентности предоставляемой ядроминформации
I Сравнение содержимого procfs с выводом команды ps auxI Поиск конкретных файлов известных руткитовI Проверка целостности (e.g. с помощью rpm)
I Перебор идентификаторов процесса
Используемые методы
I Поиск нарушений консистентности предоставляемой ядроминформации
I Сравнение содержимого procfs с выводом команды ps auxI Поиск конкретных файлов известных руткитовI Проверка целостности (e.g. с помощью rpm)I Перебор идентификаторов процесса
На чем бы проверить?
На чем бы проверить?
первый попавшийся rootkit с github vs chrootkit
Hook таблицы системных вызовов и скрытие себя
# make && insmod open−h i j a c k . c# dmesg[ 1 9 0 . 0 4 9 ] S imple mod : o r i g f f f f f f f f 8 1 2 0 b 9 4 0 new addr f f f f f f f f c 0 0 1 3 0 0 0# c h k r o o t k i t −qens3 : PACKET SNIFFER(/ s b i n / d h c l i e n t [ 1 5 5 7 ] )# rkhun t e r −c −qp e r l : warn ing : P l e a s e check tha t your l o c a l e s e t t i n g s :
LANGUAGE = ( unse t ) ,LC_ALL = ( unse t ) ,LC_CTYPE = "ru_RU . u t f 8 " ,LANG = "ru_RU . u t f 8 "
a r e suppo r t ed and i n s t a l l e d on your system .p e r l : warn ing : F a l l i n g back to the s t anda rd l o c a l e ("C" ) .
Может быть он слишкомпростой?
github.com/NoviceLive/research-rootkit
[ 5879 .008563 ] p sh i dko . in i t_modu le :G r e e t i n g s the World ![ 5879 .009880 ] p sh i dko . in i t_modu le :Opening the path : / proc .[ 5879 .011110 ] p sh i dko . in i t_modu le :Succeeded i n open ing : / proc[ 5879 .012376 ] p sh i dko . in i t_modu le :Changing f i l e_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 .
github.com/NoviceLive/research-rootkit
# ps aux. . .
# dmesg[ 6225 .613397 ] p sh i dko . f a k e _ f i l l d i r : H id i ng p i d : 1# rkhun t e rCheck ing f o r h idden f i l e s and d i r e c t o r i e s[ None found ]Roo t k i t checks . . .
R oo t k i t s checked : 299P 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 tCheck ing ‘ lkm ’ . . .You have 1 p r o c e s s h idden f o r r e a d d i r command# unh ide qu i c kFound HIDDEN PID : 1 Command : " i n i t [ 2 ] "
Как нашелся?
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 ) ) ;. . .
Как нашелся?
unhide:
// PID under 301 a r e r e s e r v e d f o r k e r n e lf 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++). . . .
Как нашелся?
unhide:
v o i d get_max_pid ( i n t ∗ newmaxpid ){
cha r path [ ]= "/ proc / s y s / k e r n e l /pid_max " ;pid_t tmppid = 0 ;FILE∗ f d= fopen ( path , " r " ) ;i f ( ! f d ){
warn ln (1 , unlog , "Cannot r ead c u r r e n t maximum PID . Us ing d e f a u l t v a l u e %d" , ∗ newmaxpid ) ;r e t u r n ;
}
Значит, что все-таки естьэффективные антируткиты
под Linux?
Значит, что все-таки естьэффективные антируткиты
под Linux?Нет.
My Little Fix
/∗∗ A maximum of 4 m i l l i o n PIDs shou l d be∗ enough f o r a wh i l e .∗ [NOTE: PID/TIDs a r e l i m i t e d to∗ 2^29 ~= 500+ m i l l i o n , s e e 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 ( l ong ) > 4 ? 4 ∗ 1024 ∗ 1024: PID_MAX_DEFAULT) )
My Little Fix
I Перед стартом процесса pid_max устанавливается вPID_MAX_LIMIT-N
I Запуск процессаI Снижение pid_max до прошлого значения
My Little Fix
# ps aux. . .
# dmesg[ 14365 . 243616 ] p sh i dko . f a k e _ f i l l d i r : S t a r t p r o c e s s[ 14965 . 325102 ] p sh i dko . f a k e _ f i l l d i r : H id i ng p i d : 4123123# rkhun t e rCheck ing f o r h idden f i l e s and d i r e c t o r i e s[ None found ]Roo t k i t checks . . .
R oo t k i t s checked : 299P 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# unh ide// None found
kjackal
Особенности:I Небольшой (≈ 700 строк)I Мертвый (разработка остановлена в 2013)
kjackal
$ make | tail -n 4make[2]: *** [scripts/Makefile.build:294: kjackal/src/module.o]Ошибка 1make[1]: *** [Makefile:1490: _module_/kjackal] Ошибка 2make[1]: выход из каталога «/usr/src/linux»make: *** [Makefile:26: default] Ошибка 2
Houston, we have a problem.
Houston, we have a problem.Эффективных антируткитов
нет :(
Что дальше?
Что дальше?Programming, Motherfucker.
Programming, Motherfucker
I Kernel-level
I Только общие методы (проверить наличие /proc/enyo иchkrootkit может)
Programming, Motherfucker
I Kernel-levelI Только общие методы (проверить наличие /proc/enyo и
chkrootkit может)
Обнаружение: Встраивание в планировщик процессов
Обнаружение: Встраивание в планировщик процессов
Основные причины вызова schedule():I Регулярное обновление текущей задачи с помощью
scheduler_tick()
I Задача приостанавливаетсяI Задача возобновляет выполнение (→ try_to_wake_up())
Обнаружение: Встраивание в планировщик процессов
Основные причины вызова schedule():I Регулярное обновление текущей задачи с помощью
scheduler_tick()I Задача приостанавливается
I Задача возобновляет выполнение (→ try_to_wake_up())
Обнаружение: Встраивание в планировщик процессов
Основные причины вызова schedule():I Регулярное обновление текущей задачи с помощью
scheduler_tick()I Задача приостанавливаетсяI Задача возобновляет выполнение (→ try_to_wake_up())
Обнаружение: Встраивание в планировщик процессов
try_to_wake_up():I Помещает задачу в очередь выполнения задач
I Изменяет состояние задачи на “TASK_RUNNING”I Если пробуждаемая задача имеет приоритет выше
текущей задачи, то производит вызов планировщика сцелью перепланирования задач
Обнаружение: Встраивание в планировщик процессов
try_to_wake_up():I Помещает задачу в очередь выполнения задачI Изменяет состояние задачи на “TASK_RUNNING”
I Если пробуждаемая задача имеет приоритет вышетекущей задачи, то производит вызов планировщика сцелью перепланирования задач
Обнаружение: Встраивание в планировщик процессов
try_to_wake_up():I Помещает задачу в очередь выполнения задачI Изменяет состояние задачи на “TASK_RUNNING”I Если пробуждаемая задача имеет приоритет выше
текущей задачи, то производит вызов планировщика сцелью перепланирования задач
Обнаружение: Встраивание в планировщик процессов
i n t hook_try_to_wake_up ( s t r u c t t a s k_s t r u c t ∗p ,un s i gned i n t s t a t e ,i n t wake_f lags )
{p r i n t k ("p−>p id : %d , p−>comm: %s \n" , p−>pid , p−>comm) ;r e t u r n origin_try_to_wake_up (
p , s t a t e , wake_f lags ) ;}
Обнаружение: Встраивание в планировщик процессов
dmesg:
[ 9 4 . 5 6 8 ] p−>p id : 1749 , p−>comm: r s y s l o g d[ 9 4 . 5 6 9 ] p−>p id : 1747 , p−>comm: r s : main Q: Reg[ 9 4 . 5 7 2 ] p−>p id : 1749 , p−>comm: r s y s l o g d[ 9 4 . 5 7 3 ] p−>p id : 1747 , p−>comm: r s : main Q: Reg[ 9 4 . 5 7 6 ] p−>p id : 1749 , p−>comm: r s y s l o g d[ 9 4 . 5 7 7 ] p−>p id : 1747 , p−>comm: r s : main Q: Reg[ 9 4 . 5 8 0 ] p−>p id : 1749 , p−>comm: r s y s l o g d[ 9 4 . 5 8 1 ] p−>p id : 1935 , p−>comm: hiddenprocess[ 9 4 . 6 0 5 ] p−>p id : 1747 , p−>comm: r s : main Q: Reg
Двигаться дальше
I Проверка согласованности структур данных ядраI Самозащита со стороны антируткитаI Поддержка других реализаций планировщика ядра
Вопросы?
Спасибо за внимание!Клементьев Михаил
<[email protected]>/* github.com/jollheef */