Как использовать bin setuid для доступа к другому исполняемому файлу? [Дубликат]

Точечная нотация не работает с некоторыми ключевыми словами (например, new и class) в Internet explorer 8.

У меня был этот код:

//app.users is a hash
app.users.new = {
  // some code
}

И это запускает страшный «ожидаемый indentifier» (по крайней мере, на IE8 на windows xp, я не пробовал другие среды). Простое исправление для этого состоит в том, чтобы переключиться на запись в скобках:

app.users['new'] = {
  // some code
}
25
задан 17 February 2009 в 11:18
поделиться

5 ответов

Поскольку бит suid в исполняемых файлах только изменяет эффективный UID (EUID), исполняемый файл будет работать как, а не реальный UID (RUID), который возвращает getuid(), и в дополнение к ограничению на suid скрипты (любой исполняемый файл, начинающийся с «#!»), некоторые оболочки, такие как bash в качестве дополнительной меры безопасности, в этом случае вернут EUID в RUID, вам нужно будет использовать вызов setuid(0) в коде C перед выполнением скрипта.

См. страницы man в setuid, seteuid, getuid и geteuid, чтобы узнать точную семантику реальных и эффективных UID.

( ПРЕДУПРЕЖДЕНИЕ ) Конечно, это подходящий момент, чтобы упомянуть, что ограничение на скрипты suid во многих системах Unix, оболочках и интерпретаторах существует по какой-либо причине, что что, если сценарий не очень осторожен в том, чтобы дезинфицировать его вход и состояние окружающей среды, когда он выполняется, они опасны и могут быть использованы для повышения безопасности. Поэтому будьте очень осторожны при этом. Установите доступ к своему сценарию и обертке как можно строже, разрешите этот конкретный сценарий, который вы намереваетесь выполнить, и очистите среду внутри вашей программы C перед запуском скрипта, установив переменные среды, такие как PATH, чтобы содержать именно то, что необходимо в правильном порядке, и нет каталогов, которые можно записать другим.

40
ответ дан Tom Alsberg 27 August 2018 в 00:08
поделиться
  • 1
    Безопаснее сохранить исходный UID и сбросить его в конце программы? – skinp 17 February 2009 в 15:49
  • 2
    Если ваша программа выполняет другие действия после завершения сценария, это не нужно, то да. Если все, что вы делаете, это возвращение, то это не имеет большого значения. В типичном случае оболочка сценария будет использовать exec, а не system (...), поэтому в любом случае оболочка не будет запускаться после завершения скрипта. – Tom Alsberg 17 February 2009 в 22:50
  • 3
    @TomAlsberg Знаете ли вы исходный код / ​​документацию, чтобы подтвердить поведение Bash для этого «автоматического сброса uid»? – steveyang 18 May 2013 в 18:11

Примеры ужасно небезопасны и позволяют любому, у кого есть два бита знаний, запускать любую программу, которую они хотят, в качестве пользователя setuid.

Никогда не проходите через оболочку, если вы сначала не дезинфицируете среду, а большинство примеров показанные здесь, уязвимы для установки IFS и PATH перед запуском.

1
ответ дан Henrik 27 August 2018 в 00:08
поделиться

Добавьте setuid (0) в скрипт и скомпилируйте его. Он должен работать после этого.

$ cat wrapper.c 
int main(void) 
{ 
        setuid(0);
        system("/bin/bash ./should_run_as_root.sh"); 
} 
$ gcc -o wrapper wrapper.c 
$ sudo chown root wrapper 
$ sudo chmod ug+s wrapper 
$ ll wrapper 
-rwsr-sr-x 1 root users 6667 2009-02-17 11:11 wrapper 
$ 
3
ответ дан Novice scripter 27 August 2018 в 00:08
поделиться
  • 1
    Не используйте system () из программы с привилегиями set-user-ID или set-group-ID, потому что странные значения для некоторых переменных среды могут использоваться для разрушения целостности системы. Вместо этого используйте семейство функций exec (3), но не execlp (3) или execvp (3). system () на самом деле не будет корректно работать с программами с привилегиями set-user-ID или set-group-ID в системах, на которых / bin / sh является версией bash версии 2, так как bash 2 снижает привилегии при запуске. (Debian использует модифицированный bash, который не делает этого при вызове как sh.) – cateof 7 June 2011 в 17:48

Еще одна вещь, которую следует отметить здесь, состоит в том, что ограничение здесь происходит от bash, а не от самой системы * nix. Bash действительно делает проверки на скриптах SUID, чтобы выполнять их только с корнем EUID. Если вы берете старые раковины, вы часто получаете то, что хотите, из коробки. Например, sh не делает такого рода проверки:

$ cat wrapper.c
int main(void)
{
            system("/bin/sh -c whoami");
}

$ ls -l wrapper
-rwsr-sr-x 1 root users 8887 Feb 17 14:15 wrapper
$ ./wrapper
root

С bash:

$ cat wrapper.c
int main(void)
{
            system("/bin/bash -c whoami");
}

$ ls -l wrapper
-rwsr-sr-x 1 root users 8887 Feb 17 14:18 wrapper
$ ./wrapper
skinp

Тем не менее, ответ Тома, как правило, подходит для создания обертки для корневых программ SUID

6
ответ дан skinp 27 August 2018 в 00:08
поделиться
  • 1
    Вы правы, конечно. Linux обрабатывает ограничивающие сценарии suid, проверяя режим исполняемого файла в вызове exec, и это ограничение является дополнительной мерой безопасности некоторых интерпретаторов. Не знаю, почему я получил это замешательство, когда написал это. Я исправил свой ответ. Благодаря! – Tom Alsberg 17 February 2009 в 22:44
  • 2
    И, конечно, я пропустил это в коде OP, но на самом деле он не выполняет скрипт с #! интерпретатор, но вызов bash напрямую, поэтому ограничение ядра в этом случае не будет применяться, но ядро ​​имеет это ограничение для #! скрипты с режимом suid file. – Tom Alsberg 17 February 2009 в 22:49
  • 3
    Больше не работает). С одной стороны, man system говорит Do not use system() from a program with set-user-ID or set-group-ID privileges, because .... С другой стороны, это работает в Ubuntu 14.04, но не в Ubuntu 16.04. – anumi 19 October 2016 в 15:23
  • 4
    @anumi, как я уже упоминал, это будет зависеть от оболочки. / bin / bash в ubuntu на самом деле связано с тире. Похоже, что это было исправлено между 14.04 и 16.04, вероятно, в bugs.launchpad.net/ubuntu/+source/dash/+bug/1215660 . Другие оболочки в других дистрибутивах / версиях будут иметь разные типы поведения. – skinp 20 October 2016 в 15:15

Почему sudo не является жизнеспособным? Он избегает бушующих дыр в безопасности, таких как:

bash-3.2$ cat test
#!/bin/bash
echo ima shell script durp durp
bash-3.2$ chmod +x test
bash-3.2$ ./test
heh heh
bash-3.2$ 

Из-за того, что среда не была надлежащим образом дезинфицирована, например, в этом случае:

export echo='() { builtin echo heh heh; }'

sudo санирует этот случай и, возможно, другие граничные случаи и gotchas, которые могли бы не писать в обычную оболочку suid.

0
ответ дан user 27 August 2018 в 00:08
поделиться
  • 1
    man sudo: «Запуск сценариев оболочки через sudo может выявить те же ошибки ядра, которые делают скрипты оболочки setuid небезопасными в некоторых операционных системах ...» Стандартная оболочка для создания suid-скриптов, вероятно, лучше всего, но знаете ли вы ее? Sudo здесь небезопасен, потому что он использует ядро ​​для передачи сценария через / dev / fd / ...! – Robert Siemer 9 February 2012 в 09:56
Другие вопросы по тегам:

Похожие вопросы: