Чи є спосіб, коли зловмисник може використовувати mkdir для компрометації системи?


22

Я налаштовую обмежений обліковий запис для користувача ricardo, який викликає клопоту в моїй системі. Я хочу надати йому право робити каталоги з використанням sudo, що йому іноді потрібно робити. Я розглядаю це правило у своєму /etc/sudoersфайлі:

ricardo   ALL=(root) NOPASSWD: /bin/mkdir

Використовуючи лише це правило, чи є якийсь спосіб Рікардо навмисно чи випадково поставити під загрозу систему?


2
Якщо у вас є файлова система зі статичним числом inode, він може використати всі ваші вставки.
Йорданм

2
@schaiba Він любить повозитися і бачити, чи вміє він експлуатувати систему, і не завжди читає сторінки чоловіка стільки, скільки слід.
Рікардо Альтамірано

8
Правильна освіта користувачів у поєднанні з судом на даний момент не буде рекомендованою справою.
schaiba

2
Як говорить @schaiba, ви можете використовувати таких користувачів, навчаючи їх та надаючи їм обов'язки (під пильним наглядом). Я бачив війни між sysdamins та користувачами, як перші намагалися заблокувати систему занадто сильно. Користувачі переважали sysadmins 10 на 1, і навіть тоді ( без сьогоднішнього доступу до Інтернету!) Поразка сисдамінів була принизливою. Ніколи не вступайте в таке становище!
vonbrand

2
Ось у випадку одного рикардо занадто багато. Або, принаймні, таким чином говорив БОФ ...
Мисливець на оленів

Відповіді:


21

Я підозрюю, що така атака спрацює, де «щось» - це модуль ядра, який буде намагатися завантажувати після встановлення rootfs:

$ sudo mkdir -m 777 /lib/modules/`uname -r`/a
$ cp evil.ko /lib/modules/`uname -r`/a/«something».ko

Зауважте також, що ви можете використовувати інші імена, залежно від псевдонімів, оголошених у модулі. Я здогадуюсь, що він не завантажується, поки не буде запущено depmod, що станеться наступного разу, коли буде оновлено ядро, тому mkdirостаннім часом навіть не буде показано в журналі sudo.

У / etc є багато речей, які читають усі файли в каталозі, іноді рекурсивно. Ще гірше, що деякі з цих каталогів за замовчуванням не існують, і єдиний спосіб дізнатися про них - це прочитати manpage, скрипти init тощо для програми, яка їх використовує. Деякі, що ще гірше, застарілі речі, сумісні із зворотною формою, і навіть більше не можуть бути задокументовані.

редагувати: продумано ще декілька каталогів /usr/local:

  • /usr/local/lib/perl/5.14.2(відрізняється залежно від версії Perl, спробуйте perl -Vдізнатися). Створіть там Fileпідкаталог і вставте Find.pmйого. Тепер, коли хтось використовує File::Find, він буде використовувати версію зловмисника. Аналогічно зробіть те ж саме і з Getopt::Long. Системні утиліти часто пишуться на Perl, тому це, ймовірно, дає корінь. (Спробуйте ack-grep --color -a 'use.+::' /usr/sbin | less -R)
  • Я думаю, що Python, Ruby тощо мають подібні каталоги. Системні утиліти також написані на Python.
  • Субвертуйте багато речей, які хтось компілює з підкаталогами /usr/local/include.

О, але якщо <злий користувач> може скопіювати модулі до того місця, куди ядро ​​їх завантажить, гра закінчена до початку.
vonbrand

1
@vonbrand <злий користувач> зазвичай не може, але використовував його sudo mkdirдля створення нового каталогу, де він міг.
дероберт

20

Запускаючи mkdirяк root, користувач може блокувати інші процеси / користувачів від створення нових файлів і каталогів, створюючи каталоги з однаковими іменами (та / або неправильними правами) раніше.

Це може бути важливим для безпеки, особливо для журналів і файлів блокування .

Як jordanm зазначив, що максимальна кількість індексних дескрипторів можна також використовувати вгору , який може блокувати всю систему.

Додавши користувача до певних груп (або використовуючи ACL ), ви зможете вирішити проблеми, не надаючи прав через sudo.


Чудові моменти. Я, мабуть, залиште mkdirсписок команд, якими Рікардо дозволено використовувати.
Рікардо Альтамірано

Якщо це для виснажливих індексів, простий for((i = 0;; i++)); do touch $i; doneбуде добре (башизм, вибачте, але ви зрозумієте ідею).
фонбранд

@vonbrand За винятком того, що це не так root, тож його буде зупинено квотою. Звичайно, інші sudoкоманди, які ОП розглядає, можуть також дозволити виснажливі вставки; ОП повинен знати про цей вектор DoS.
дероберт

11

Ви повинні перенаправити його до в'язниці Chroot. Або ще краще, маленькому ВМ, що він може розбитися раз на годину. Все, що вам потрібно зробити - це надати нову копію.


Я дуже рекомендую це. Надайте йому кореневий доступ на власній машині.
emory

to chroot ^ H ^ H ^ H ^ H ^ Highty тюрма ...
Мисливець на оленів

6

Є можливості завдяки можливості створення каталогів з доступом до запису. З mkdir -m 777 blahв ricardoкористувач може написати все , що їм подобається в новий каталог. Вам знадобиться процес у системі, який вже працює як інший користувач, який повторно записує дерево каталогів для завантаження конфігурацій, сценаріїв або модулів. Тоді користувач, можливо, може додавати власні речі для завантаження чи запуску. Перше, що я можу придумати, це якщо ви запустили веб-сервер, який може виконувати php або cgi. Потім ви можете запускати сценарії як цей користувач. Я намагаюся придумати більш реальні приклади світу, особливо rootті, але я впевнений, що вони є.

ssh - приклад демона, який захоплює подібний сценарій. Якщо ви створили .sshкаталог для користувача, у якого його не було, і поставте власний authorized_hostsфайл на місце. sshdпомічає, що дозволи для каталогів занадто відкриті, і ігнорує відкритий ключ.

Ви, безумовно, можете створити собі неприємності, створюючи каталоги, в яких очікується поява файлів (наприклад, тимчасових tmp або swap-файлів), з якими багато програм не справляться добре.

Ви можете створити багато груп, але, схоже, ви нічого не робите з ними. Можливо, ви зможете привести систему до колін принаймні. Для вбивці OOM знадобилося близько 10000 груп на коробці з 256M, щоб вибити sshd.

Якщо ви керуєте -mваріантом mkdirта середовищем UMASK, sudoя вважаю, що це просто неприємність.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.