Як використовувати капш: Я намагаюся запустити непривілейований пінг, з мінімальними можливостями


13

Я експериментую з можливостями на Debian Gnu / Linux.

Я скопіював / bin / ping у свій поточний робочий каталог. Як і очікувалося, це не працює, спочатку він був встановлений корінь.

Тоді я надаю своєму ping мінімальні можливості (не root), виконуючи свої дії sudo /sbin/setcap cap_net_raw=ep ./ping, і пінг працює, як очікувалося.

Потім sudo /sbin/setcap -r ./pingвідкликати цю можливість. Зараз він не працює, як очікувалося.

Зараз я намагаюся працювати з Ping за допомогою capsh.

capsh не має привілеїв, тому мені потрібно запустити його як root, але потім скинути root і, таким чином, всі інші привілеї.

Я думаю, що мені теж потрібно secure-keep-caps, це не зафіксовано в документі capsh, але є в посібнику з можливостей. Я отримав бітові числа /usr/include/linux/securebits.h. Вони здаються правильними, оскільки висновок --printпоказує, що ці біти є правильними.

Я годинами лунаю, поки що це маю.

sudo /sbin/capsh --keep=1 --secbits=0x10 --caps="cap_net_raw+epi" == --secbits=0x10 --user=${USER} --print -- -c "./ping localhost"

Однак з pingпомилками ping: icmp open socket: Operation not permitted, це те, що відбувається, коли він не має можливості. Також --printшоу Current: =p cap_net_raw+i, цього нам недостатньо e.

sudo /sbin/capsh --caps="cap_net_raw+epi" --print -- -c "./ping localhost"встановить можливість Current: = cap_net_raw+eipцього правильно, але залишає нас як root.

Правка-1

Я зараз спробував sudo /sbin/capsh --keep=1 --secbits=0x11 --caps=cap_net_raw+epi --print -- -c "touch zz; ./ping -c1 localhost;"

Це дає:

touch: cannot touch `zz': Permission denied
ping: icmp open socket: Operation not permitted

Перша помилка очікується, оскільки secure-noroot: yes друга - ніCurrent: = cap_net_raw+eip

Правка-2

Якщо я поставив це ==перед --print, він тепер показує Current: = cap_net_raw+i, що пояснює попередню помилку, але не чому ми втрачаємо можливості при вимиканні кореня, я хоч і secure-keep-capsповинен це виправити.

Правка-3

З того, що я бачу, я втрачаю Ефективний (e) та Дозволений (p), коли викликається exec. Це очікується, але я подумав, що захисні козирки повинні зупинити їх втрату. Я чогось сумую?

Правка-4

Я проводив більше досліджень і знову читав посібник. Здається, що нормально eі pможливості втрачаються, коли: ви переходите від користувача root(або застосовуєте secure-noroot, тим самим роблячи root звичайним користувачем), це може бути переосмислено secure-keep-caps; коли ви телефонуєте exec, наскільки я можу сказати, це інваріант.

Наскільки я можу сказати, це працює відповідно до посібника. Наскільки я можу сказати, немає нічого корисного зробити capsh. Наскільки я можу сказати, щоб використовувати можливості, необхідні для: використання можливостей файлів або наявної програми, яка не використовує exec. Тому немає пільгової обгортки.

Тож тепер моє запитання - що я пропускаю, для чого capsh.

Правка-5

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


Версії:

  • capshвід libcap2-binверсії пакета1:2.22-1.2
  • Перед редагування-3 я захопив останній capshз git://git.debian.org/collab-maint/libcap2.gitі почав використовувати його.
  • uname -a Linux richard-laptop 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux Земля користувача 32-біт.

1
Ви спробували приклад Лекенштейна з пізнішим випуском версії ? Отримання capshвід спів-садівникам репо не дав би вам «останнє» capsh, пакет Debian ще не підтримує можливості навколишнього середовища. Вгору за течією 2,27.
Стівен Кітт

1
@StephenKitt добре знати, але оригінальне питання полягає в тому, яке використання capsh, за відсутності навколишнього середовища (як це було спочатку). Що мені не вистачає. Він повинен мати користь.
ctrl-alt-delor

Відповіді:


11

Можливості - це властивості процесів. Традиційно існує три набори:

  • Дозволені можливості ( p ): можливості, які можуть бути "активовані" в поточному процесі.
  • Ефективні можливості ( е ): можливості, які в даний час можна використовувати в поточному процесі.
  • Спадкові можливості ( i ): можливості файлів, які можуть бути успадковані.

Програми, що виконуються як root, завжди мають усі дозволені та ефективні можливості, тому "додавання" більшої кількості можливостей не відчутно. (Набір успадкованих можливостей зазвичай порожній.) setcap cap_net_raw+ep pingУвімкніть ці можливості за замовчуванням для будь-якого користувача, який працює з цією програмою.

На жаль, ці можливості пов'язані з виконаним файлом і не зберігаються після виконання нового дочірнього процесу. Linux 4.3 представив можливості Ambient, що дозволяє успадковувати можливості дочірніми процесами. (Див. Також Трансформація можливостей під час execve () у можливості (7) .)

Граючи з можливостями, зверніть увагу на такі підводні камені:

  • При зміні користувача з root на некорінний очищуються ефективні та дозволені можливості (див. Вплив змін ідентифікатора користувача на можливості у можливостях (7) ). Ви можете використовувати --keep=1опцію, capshщоб уникнути очищення наборів.
  • Набір можливостей зовнішнього середовища очищається при зміні ідентифікаторів користувача або групи. Рішення: додайте можливості зовнішнього середовища після зміни ідентифікатора користувача, але перед виконанням дочірнього процесу.
  • Можливість може бути додана до набору можливостей навколишнього середовища, якщо вона вже є в наборі дозволених і успадкованих можливостей.

capshПрограма від libcap 2.25 не мають можливості змінювати можливості навколишнього середовища поки немає, але більш пізні випуски додавати нові варіанти. Зауважте, що порядок опціонів є важливим. Приклад використання:

sudo capsh --caps="cap_net_raw+eip cap_setpcap,cap_setuid,cap_setgid+ep" \
    --keep=1 --user=nobody --addamb=cap_net_raw -- \
    -c "./ping -c1 127.0.0.1"

Порада: ви можете додати цю --printопцію в будь-якому місці capshкомандного рядка і переглянути його поточний стан можливостей.

Примітка: cap_setpcapпотрібен на --addambтой час, cap_setuid,cap_setgidпоки потрібен --userваріант.


6

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

Під час запуску sudo capsh --user=<some_user> --є 2 системні дзвінки, що викликають інтерес, які спричиняють перерахунок можливостей (і потенційно відхилення):

  1. setuid: За даними man capabilities:

SECBIT_KEEP_CAPS Встановлення цього прапора дозволяє потоці, який має один або кілька 0 UID, зберігати свої можливості, коли він перемикає всі свої UID на ненульове значення. Якщо цей прапор не встановлений, такий перемикач UID призводить до втрати потоком всіх можливостей.

Іншими словами, у нашій capshкоманді вище, ми повинні переконатися, що SECBIT_KEEP_CAPS встановлений під час setuidсистемного дзвінка. Інакше всі можливості втрачаються. Це те, що --keep=1робить. Тож тепер команда стаєsudo capsh --user=<some_user> --keep=1 --

  1. execveЯкщо ми використовуємо --keep=1опцію, все набори можливостей (ефективні, дозволене, успадковані) не зберігаються до тих пір , в execveсистемний виклик, однак execveпризводить до можливості бути перераховані (для непривілейованих користувачів) , а також і в не настільки очевидним чином. Коротше кажучи, перед додаванням набору можливостей навколишнього середовища , щоб можливість знаходитись у "дозволеному" наборі потоку після execveвиклику, або:

    • Файл повинен мати таку можливість у своєму "дозволеному" наборі . Це можна зробити за допомогою setcap cap_net_raw+p /bin/bash. Виконання цього завдання робить всю вправу марною, оскільки набори можливостей потоку (крім набору обмежень) вже не мають жодного ефекту.
    • І файл, і потік повинні мати таку можливість у своїх "спадкових" наборах . Ви можете подумати, що setcap cap_net_raw+iце зробить трюк, але виявляється, що execveз-за непривілейованих користувачів (що ми зараз вдячні setuid) ми втрачаємо незрозумілі дозволи потоку . Тому немає можливості задовольнити цю умову як непривілейований користувач.

Навколишні можливості, впроваджені в Linux 4.3, дозволяють потоці зберегти свої можливості навіть після того, setuidяк непривілейований користувач, за яким слідує користувач execve, не покладаючись на можливості файлу.


2

У ядрі може бути помилка / функція. Було проведено певну дискусію:

Я не маю ідеї, якщо щось було зроблено, щоб це виправити.

Не зрозумійте мене неправильно - поточна поведінка захищена. Але він настільки надійний, що перешкоджає речам, які, здається, працюють.

Редагувати: Відповідно до http://man7.org/linux/man-pages/man7/capa sposobnosti.7.html є новий набір можливостей Ambient (з Linux 4.3). Схоже, це дозволить те, що потрібно.

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