Точечная нотация не работает с некоторыми ключевыми словами (например, new
и class
) в Internet explorer 8.
У меня был этот код:
//app.users is a hash
app.users.new = {
// some code
}
И это запускает страшный «ожидаемый indentifier» (по крайней мере, на IE8 на windows xp, я не пробовал другие среды). Простое исправление для этого состоит в том, чтобы переключиться на запись в скобках:
app.users['new'] = {
// some code
}
Поскольку бит suid
в исполняемых файлах только изменяет эффективный UID (EUID), исполняемый файл будет работать как, а не реальный UID (RUID), который возвращает getuid()
, и в дополнение к ограничению на suid
скрипты (любой исполняемый файл, начинающийся с «#!
»), некоторые оболочки, такие как bash
в качестве дополнительной меры безопасности, в этом случае вернут EUID в RUID, вам нужно будет использовать вызов setuid(0)
в коде C перед выполнением скрипта.
См. страницы man
в setuid
, seteuid
, getuid
и geteuid
, чтобы узнать точную семантику реальных и эффективных UID.
( ПРЕДУПРЕЖДЕНИЕ ) Конечно, это подходящий момент, чтобы упомянуть, что ограничение на скрипты suid
во многих системах Unix, оболочках и интерпретаторах существует по какой-либо причине, что что, если сценарий не очень осторожен в том, чтобы дезинфицировать его вход и состояние окружающей среды, когда он выполняется, они опасны и могут быть использованы для повышения безопасности. Поэтому будьте очень осторожны при этом. Установите доступ к своему сценарию и обертке как можно строже, разрешите этот конкретный сценарий, который вы намереваетесь выполнить, и очистите среду внутри вашей программы C перед запуском скрипта, установив переменные среды, такие как PATH
, чтобы содержать именно то, что необходимо в правильном порядке, и нет каталогов, которые можно записать другим.
Примеры ужасно небезопасны и позволяют любому, у кого есть два бита знаний, запускать любую программу, которую они хотят, в качестве пользователя setuid.
Никогда не проходите через оболочку, если вы сначала не дезинфицируете среду, а большинство примеров показанные здесь, уязвимы для установки IFS и PATH перед запуском.
Добавьте 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
$
Еще одна вещь, которую следует отметить здесь, состоит в том, что ограничение здесь происходит от 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
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
Почему 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.