Создал простой скрипт------------------- test.sh --------
#!/bin/sh
whoami
echo test > /root/ok.test
------------------------------------Выставил SUID
chmod 4755 ./test.shПосле выполнения под простым пользователем test получаю
test
./test.sh: cannot create /root/ok.test: Permission deniedЧто я делаю не так?
Решил проблему написав С - програмкуПолучается что во FreeBSD игнорируется SUID выставленный на скрипты или имеет какие-то ограничения.
> Решил проблему написав С - програмку
> Получается что во FreeBSD игнорируется SUID выставленный на скрипты или имеет какие-то
> ограничения.В линуксе на скока я помню, тоже не получиться выставить суид на скрипт.
>> Решил проблему написав С - програмку
>> Получается что во FreeBSD игнорируется SUID выставленный на скрипты или имеет какие-то
>> ограничения.
> В линуксе на скока я помню, тоже не получиться выставить суид на
> скрипт.Ну, да. В интернетах много где пишут - в фак-ах/ман-ах...
И если просто _немного подумать, что скрипт исполняет _на_самом_деле-то_ exe-шник вроде /bin/bash или perl, тот экзешник "просто" читатет скрипт как данные, как текст -- это не исполненеие бинарника ядром, которе и "смотрит" на SUID/SGID биты. А сам интерпретатор не суид-ный ни разу и не болжет быть... Вот.
> SUID/SGID биты. А сам интерпретатор не суид-ный ни разу и не
> болжет быть... Вот.Упс. %)
http://www.opennet.me/base/sec/suid_script.txt.htmlDate: Fri, 12 Apr 2002 21:43:30 +0400
From: Alex Semenyaka <Alex.Semenyaka@f640.n461.z2.fidonet.org>
Subject: Пояснение почему под FreeBSD не может быть suid скриптов.> suid+%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82+site:opennet.ru
>> SUID/SGID биты. А сам интерпретатор не суид-ный ни разу и не
>> болжет быть... Вот.
> Упс. %)
> http://www.opennet.me/base/sec/suid_script.txt.html
> Date: Fri, 12 Apr 2002 21:43:30 +0400
> From: Alex Semenyaka <Alex.Semenyaka@f640.n461.z2.fidonet.org>
> Subject: Пояснение почему под FreeBSD не может быть suid скриптов.
>> suid+%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82+site:opennet.ruСогласен полностью. Но вызов самого скрипта происходит через шел. Шел открывает файл и читает заголовок, понимая что это скрипт. Затем читает первую строчку - интерпретатор который требуется применить и фактический запускает указанный интерпретатор (собственно опять шел) передавая ему на вход уже ввиде параметра файл скрипта. Верно?
Предположим теперь, что вместо скрипта оказался бинарник. Тогда читая его заголовок шел должен понять, что это исполняемый файл, и начать его загрузку в память. При этом "система" как-то должна учесть что выставлен SUID. Но кто именно это должен учесть в случае бинарника? Получается что это делает ядро уже после загрузки в память, оно смотрит на атрибуты файла.
Я к чему клоню, так или иначе всё что запускается - запускается через оболочку шел. Но в одном случае это запускается с учётом SUID, а в другом нет. Чисто теоретически, шел мог бы учесть SUID входного файла и запуститься с нужными правами независимо от того скрипт это или бинарник.
>[оверквотинг удален]
> должен понять, что это исполняемый файл, и начать его загрузку в
> память. При этом "система" как-то должна учесть что выставлен SUID. Но
> кто именно это должен учесть в случае бинарника? Получается что это
> делает ядро уже после загрузки в память, оно смотрит на атрибуты
> файла.
> Я к чему клоню, так или иначе всё что запускается - запускается
> через оболочку шел. Но в одном случае это запускается с учётом
> SUID, а в другом нет. Чисто теоретически, шел мог бы учесть
> SUID входного файла и запуститься с нужными правами независимо от того
> скрипт это или бинарник.Рекомендую почитать что-нибудь по системе, чтобы выйти из области неверных предположений и фантазий на тему. У шелла нет прав дать или не дать SUID (хоть он 10 раз будет пытаться это "учесть") - раз, система всегда пускает только бинарники, скриптов для нее нет - два. Шелл передает команду запуска с указанием запускаемого файла через соответствующий системный вызов, а не "грузит в память", не хватало еще. Вода мокрая. Небо голубое. Книги рулез.
Суидный скрипт был бы возможен, если бы 1) сам интепретатор имел сам SUID-bit, 2) и при наличии этого бита на и на скрипте тоже выполняо бы его без сброса привилегий - а при отсутствии, соответственно, привилегии сначала сбрасывал бы. Но эта схема неуниверсальна - нужно каждый интерпретатор учить такому поведению. И дыр при ее реализации столько, что куда дешевле отказаться от сомнительной радости SUID-скриптов, чем пытаться их залатать. Так что на нынешний момент такой подход считается bad practice.
> Рекомендую почитать что-нибудь по системе, чтобы выйти из области неверных предположений
> и фантазий на тему. У шелла нет прав дать или не
> дать SUID (хоть он 10 раз будет пытаться это "учесть") -
> раз, система всегда пускает только бинарники, скриптов для нее нет -
> два. Шелл передает команду запуска с указанием запускаемого файла через соответствующий
> системный вызов, а не "грузит в память", не хватало еще. Вода
> мокрая. Небо голубое. Книги рулез.Ну по-сути вы ведь к словам прицепились. В конечном счёте сам шел и создаст процесс (пусть средствами ядра, но инициирует именно он - вежливо попросив ядро создать новый процесс). На счёт скриптов я всё же вас не понял, я писал что шел анализирует заголовок полученного файла и что если понимает что это скрипт, то запускает сам себя с передачей на вход этого скрипта(да собственно сам себя он запускает даже на бинарниках). Вы же пишите что "для системы нет скриптов" - ну и причём тут то, что писал я?
По поводу что шел не может запускать с произвольными правами - это верно, я с этим и не спорил, только предположил что шел мог бы быть более "особенным" чем обычные программы - например уметь наследовать бит SUID от скрипта. А выставить шелу SUID - по-моему это означает дать всем пользователям данного шела права root.
> Согласен полностью.Или "полностью", или "но", да? B)
>Но вызов самого скрипта происходит через шел. Шел открывает файл
> и читает заголовок, понимая что это скрипт. Затем читает первую строчку
> - интерпретатор который требуется применить и фактический запускает указанный интерпретаторШелу сказали выполнить, он сказал ядру - выпоолнить, _ядро_ посмотрело заголовок и...
_бинарнику_ с SUID-ом -- дало, чего положено,а
_скрипту_ -- с SUID-ом -- не дало. Потому что ядро-то _фактически выполняет какой-нибудь /bin/sh или /bin/perl (с имеренм скрипта -> параметром~~), а на _этих бирарниках никакого SUID-а нет (и не будет никогда).
Я даже ещё раз повторю: нет и небудет никогда SUID-ных скриптов.
Проще и правильнее "настроить наконец sudo"(тм).