Назад | Перейти на главную страницу

Включен липкий бит Сценарий не может записывать в корневой файл

У меня в каталоге / tmp / есть 2 файла.

#!/usr/bin/env ruby
$-v = true

IO.write( File.join(Dir.pwd, 'file'), 100.times.map { rand(97..122).chr }.join << ?\n )

Файл "file" имеет то же разрешение, что и /etc/shadow файл:

# ls -l /etc/shadow
-rw------- 1 root root 1045 Sep 22 04:13 /etc/shadow

# ls -l file
-rw------- 1 root root 6 Nov 29 12:22 file

Рубиновый скрипт "скрипт" имеет те же права, что и passwd команда:

$ ls -l $(type -p passwd)
-rwsr-xr-x 1 root root 63624 Nov 13 22:28 /usr/bin/passwd

# ls -l script
-rwsr-xr-x 1 root root 78 Nov 29 12:22 script

Я могу бегать ./script как root, который заменяет содержимое файла "file" некоторой случайной строкой.

Но когда я бегу ./script как пользователь без полномочий root, Ruby поднимает Errno::EACCES.


Могу ли я писать в корневой записываемый файл «file» как пользователь без полномочий root, правильно настроив разрешение SUID?

Вместо этого вы можете попробовать использовать список управления доступом (ACL). В приведенной ниже команде я (dmo) даю пользователю боб доступ для чтения / записи к файлу с именем тест:

$ setfacl -m u:bob:rw test

Сейчас ls показывает + подпишите в конце разрешений, чтобы указать, что для файла действует ACL.

$ ls -l
total 4
-rw-rw-r--+ 1 dmo dmo 0 Nov 29 07:22 test

Чтобы узнать, что позволяет использовать ACL getfacl:

$ getfacl test
# file: test
# owner: dmo
# group: dmo
user::rw-
user:bob:rw-
group::rw-
mask::rw-
other::r--

Как вы видете боб теперь имеет доступ на запись, который ему нужен.

Если вы хотите удалить ACL, вы можете использовать setfacl --remove-all:

$ setfacl --remove-all test
$ ls -l
total 0
-rw-rw-r--. 1 dmo dmo 0 Nov 29 07:22 test

Есть несколько хороших руководств по ACL, которые часто упускаются из виду: https://linuxconfig.org/how-to-manage-acls-on-linux

Наконец, будьте очень осторожны с тем, кому вы разрешаете писать в файлы, принадлежащие / читаемые корень пользователь.