Чому setuid не працює на виконуваному файлі?


9

Я знаю, що включення налаштування в сценаріях має проблеми із безпекою, тому воно за замовчуванням неактивне, але очікую, що воно працює для виконуваних файлів. Я створив і виконавчий файл, який показує uid як вихід, дотримуючись інструкцій, описаних у цій публікації: Дозволити налаштування на скриптах оболонки

Але він повертає той самий uid (1000) як до, так і після запуску sudo chmod +s ./setuid-test. Я думаю, це означає, що setuid не впливає на мій виконуваний файл, чому і як це вирішити?

Вихідний код:

#include <stdio.h>
#include <unistd.h>
int main(int argc, char** argv) {
    printf("%d", geteuid());
    return 0;
}

Побудовано та працює з

$ gcc -o setuid-test setuid-test.c
$ ./setuid-test
1000
$ sudo chown nobody ./setuid-test; sudo chmod +s ./setuid-test
$ ./setuid-test
1000

Під час бігу ls -laя отримую ось що:

me@me:~$ ls -la setuid-test
-rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test

2
Чи виконується виконуваним файлом користувач, окрім того, яким ви його запускаєте? (setuid не означає зміну корінця; це означає зміну користувача, якому належить виконуваний файл.)
cjm

PHPLearner Я думаю, що вам потрібно залучати групу / користувача, щоб змінити SUID файлу
ryekayo

@cjm me@me:~$ ls -la setuid-test---- повертається -----rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test
PHP Learner

7
Ваша програма працює так, як очікувалося в моїй системі Ubuntu 14.04, якщо вона знаходиться в моєму домашньому каталозі, але не тоді, коли вона знаходиться в / tmp, оскільки параметри, які використовуються для монтажу / tmp, забороняють налаштовувати програми. Де знаходиться ваша програма?
Марк Плотнік

2
Введіть df .у каталог, щоб знайти точку монтажу, потім mount | grep nameofmountpoint. Чи там nosuidперелічено прапор?
Марк Плотнік

Відповіді:


10

Більшість файлових систем, розроблених для Unix / Linux, можуть бути змонтовані за допомогою nosuidатрибута, який не дозволить встановити або встановити жорсткі бінарні файли, розташовані в цих файлових системах, змінити ефективний uid або gid процесу. Його часто використовують під час монтажу "ненадійних" файлових систем, тих, що перебувають під контролем не адміністратора.

У вашому випадку файлова система, яку ви використовуєте, вводить ecryptfs, яка відповідно до askubuntu: Помилка під час запуску двійкового файлу з кореневою установкою під зашифрованим домашнім каталогом примушує автоматично виконувати nosuid (та nodev), починаючи з версій декількох років тому.

Ось опис причини змін із https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2012-3409 :

Vincent Danen 2012-07-20 11:25:56 EDT
Повідомлялося, що приватний помічник шифрувального монтажу (/sbin/mount.ecryptfs_private), встановлений root, може дозволити непривілейованому місцевому користувачу монтувати акції, що контролюються користувачем ecryptfs. про локальну систему. Оскільки помічник ecryptfs не монтує файлові системи із прапорами "nosuid" та "nodev", користувач може змогти встановити файлову систему, що містить бінарні файли встановлених коренів та / або файли пристроїв, що може призвести до ескалації їх привілеїв. Це можна зробити через USB-пристрій, якщо користувач мав фізичний доступ до системи.
...
Примусові прапори встановлення MS_NOSUID та MS_NODEV додані до версії 99.


Якщо система дозволила користувачеві монтувати файлову систему, яка дозволяє встановити setuid, то було б тривіально стати root. 1) створити виконуваний файл 2) в іншому місці chown root, chmod +s3) встановити його 4) запустити виконуваний файл
ctrl-alt-delor

1

Біт SetUID у виконуваному файлі дозволяє запускати виконуваний файл у власнику файлу (не суперпользователя). Щоб мати змогу запустити виконуваний файл як root, виконайте:

sudo chown 0:0 ./setuid-test

Звичайно, але це не в цьому. Можна встановити програму, налаштовану на іншого користувача, крім root. У сценарії у питанні setuid-testповинен відображатися nobodyUID.
Жил 'SO- перестань бути злим'

@Gilles Ви маєте рацію. Я очікую, що встановлення-тест відобразиться nobody, ніroot
PHP Learner

"Біт SetUID у виконуваному файлі дозволяє запускати виконуваний файл у власника файлу", і мій власник файлу - це nobody, таким чином, я очікую 65534у відповідь, але я бачу, 1000хто буде власником!
PHP Learner

2
Перевірте параметри кріплення файлової системи, на якій працює ваша тестова програма. Якщо він змонтований nosuid, програма не може працювати.
контрмод

1
@countermode @MarkPlotnick mount | grep /home/meповертається /home/me/.Private on /home/me type ecryptfs (ecryptfs_check_dev_ruid,ecryptfs_cipher=xxx,ecryptfs_key_bytes=16,ecryptfs_unlink_sigs,ecryptfs_sig=0123456789abcdef,ecryptfs_fnek_sig=fedcba9876543210)
PHP Learner
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.