Czy możliwości mogą być użyte w skryptach bez ustawiania binarnego interpretera?

14

Obecnie używam cap_net_bind_service MY_USERNAMEw /etc/security/capability.conf.
Teraz muszę tylko ustawić cap_net_bind_service+iinterpreter mojego ulubionego języka skryptowego, aby móc dodać CAP_NET_BIND_SERVICEdo efektywnego zestawu poprzez libcap [-ng].

Działa to dobrze, ale zastanawiam się, czy istnieje sposób na osiągnięcie tego samego bez ustawiania jakichkolwiek ograniczeń dla pliku binarnego interpretera. Chociaż nie jest to duży problem (inne konta użytkowników nie mają limitu, więc nie mogą go używać, nawet z bitem ustawionym na pliku binarnym interpretera), jest to nieco denerwujące, ponieważ muszę ponownie ustawiać flagę za każdym razem, gdy interpreter jest zaktualizowane.

ThiefMaster
źródło

Odpowiedzi:

4

Zwykle możliwości są dziedziczone po dzieciach. Jak podano na stronie podręcznika :

Dziecko utworzone za pomocą fork (2) dziedziczy kopie zestawów możliwości swojego rodzica.

Problem ze skryptami polega na tym, że nie są one plikami wykonywalnymi bezpośrednio. Jądro przechodzi przez listę kontroli (kod jądra znajduje się w fs / binfmt _ *. C). Jednym z nich jest „binfmt_script.c”, który sprawdza pierwszą linię pod kątem shebang, a następnie wywołuje prawdziwego interpretera (ten w shebang) z twoim skryptem jako argumentem. Jako taki wywoływany jest interpreter standardowy / wspólny i po prostu odczytuje skrypt jako argument.

Oznacza to, że będziesz musiał ustawić zdolność interpretera, a nie skryptu. To samo dotyczy suidbitów i innych specjalnych flag.

Więc albo zrobisz kopię swojego tłumacza, ustaw odpowiednie możliwości (sprawdź też, czy nikt nie może uzyskać do niego dostępu poprzez chmod / chown) i zadzwoń do tego skopiowanego tłumacza w swoim shebang. Możesz także wykonać logikę setcap w swoim skrypcie.

Adrien M.
źródło
Ok, nie widziałem, że pytanie zostało zadane 2 lata temu, ale nigdy nie zostało zamknięte ... Wydaje się, że jest duplikatem unix.stackexchange.com/questions/87348/…
Adrien M.
ale tylko i(dziedziczenie), przechodzi obok exec. I inic nie robi sam, działa tylko, jeśli plik ma pasujące i, a ja e(skuteczny) bit (chyba, że ​​skrypt / plik wykonywalny to ustawia). Jest jeszcze bardziej złożony niż setuid, nie jest to efekt skryptu.
ctrl-alt-delor
1
Myślałem, że shebang został odczytany przez jądro, a nie powłokę? ( stackoverflow.com/questions/3009192/how-does-the-shebang-work/… )
Philip Couling
couling masz rację. To była błędna interpretacja, którą zrozumiałem później. Naprawiłem to ze wskazówkami, gdzie znajduje się kod jądra do wykonywania skryptów.
Adrien M.