Скрипт Setuid Perl работает на Solaris, но не в Linux

#linux #perl #solaris

#linux #perl #solaris

Вопрос:

Хорошо, это странно. Но в процессе попытки воспроизвести проблему для кого-то (где это стало потенциально спорным вопросом), я обнаружил эту интересную странность… Берем этот глупо-простой скрипт на perl:

 #!/usr/bin/perl

use POSIX;

$ENV{"PATH"} = "/usr/bin";
print "Effective:" . $> . "n";
print "Actual   :" . $< . "n";
print "geteuid():" . geteuid() . "n";
  

Если я создам этот скрипт как (например) root, установлю для него 4755 разрешений, я получу это на Solaris 11.4 (Perl 5.22.1) и Solaris 10.3 (Perl 5.16.1):

 Effective:0
Actual   :100
geteuid():0
  

Тот же самый точный скрипт, выполняемый на тех же или более поздних версиях Perl, но на Linux (RHEL 7.7, Ubuntu 14.04, Ubuntu 20.04, RHEL 6.10) дает мне:

 Effective:100
Actual   :100
geteuid():100
  

Если я создам исполняемый файл suid в Linux, который запускает этот скрипт, я получу ожидаемый результат 0/100/0.

На хосте RHEL 6.10 он также имеет Perl 5.8.4, и этот perl, как только suidperl установлен, также выдает мне 0/100/0, как и ожидалось.

Есть идеи, почему это работает на Solaris, а не на Linux? Специфичные для платформы особенности немного раздражают, когда вы имеете дело с проблемами миграции / обновления…

Комментарии:

1. Разрешает ли setuid в сценариях оболочки помощь?

2. @TedLyngmo не так сильно, потому что это на самом деле проблема здесь. Предполагается, что Perl поддерживает это, но теперь это «работает на некоторых платформах, не работает на других, где это было раньше …»

3. Вы тоже читали perlsec : Shebang Race Condition ?

4. Я прочитал оба, но опять же, это не отвечает на фундаментальный вопрос «Почему PERL работает на этой платформе, а не на той ?» Я подозреваю, что ответ на этот вопрос — что-то вроде «какому-то сопровождающему Linux Perl это не понравилось, и он убил его», но я не могу доказать или опровергнуть эту гипотезу.

5. Я думаю, что разные платформы (и версии платформ) имеют разные меры безопасности. Даже два Linux-интерфейса не похожи друг на друга, поскольку вы можете настроить параметры безопасности. Все ли ваши протестированные версии perl скомпилированы с помощью SETUID_SCRIPTS_ARE_SECURE_NOW ( perl -V | grep SETUID_SCRIPTS_ARE_SECURE_NOW ), как указано в perlsec ? Даже если вы используете одну и ту же версию на двух разных платформах, этот параметр определит, сможете ли вы сделать то, что вы надеетесь сделать в более новых версиях perl, если я правильно прочитал это.

Ответ №1:

Если проблема с переносимостью, небезопасно предполагать, что Unix-подобная платформа будет учитывать флаг setuid в сценариях. Это не проблема с Perl или любым другим интерпретатором — подобные ограничения заложены в платформу на довольно глубоком уровне. Многие люди обеспокоены — и не без оснований — тем, что разрешенные сценарии setuid создают слабые места в системе безопасности.

Стандартное решение — как вы уже поняли — это вызвать скрипт из двоичного файла, для которого установлен флаг setuid.