Один и тот же suid + системная программа, разные выходы на разных системах - PullRequest
1 голос
/ 17 февраля 2020

Я пишу простую программу с именем suid.c:

int main(int argc, char* argv[]) {
        system(argv[1]);
}

Скомпилируйте ее с помощью g cc, затем установите разрешение suid (root user now):

# gcc suid.c -o suid
# chmod +s suid

Я пытался запустить ./suid id с пользователем www-data на разных виртуальных машинах, но вывод другой.

  • Выход в Кали 2019: id=33(www-data) gid=33(www-data) groups=33(www-data)
  • Выход в Ubuntu Trusty (старый linux): uid=33(www-data) gid=33(www-data) euid=0(root) egid=0(root) groups=0(root),33(www-data)

Почему в том, что? Что-нибудь изменилось в Linux?

Ответы [ 2 ]

5 голосов
/ 17 февраля 2020

Это зависит от того, является ли /bin/sh bash или da sh от вашего дистрибутива. Bash всегда удаляет привилегии setuid / setgid, если не вызывается с параметром -p. Da sh не делает ничего особенного с привилегиями.

В Ubuntu функция system вызывает sh, то есть /bin/sh, то есть da sh, которое не сбрасывается привилегии. В Kali функция system вызывает sh, то есть /bin/sh, то есть bash, который отбрасывает привилегии. Речь идет о том, какую оболочку дистрибутив устанавливает как sh, а не о том, насколько недавним является дистрибутив. Поведение

Bash может быть контрмерой безопасности, но не очень эффективным. Это вторая линия защиты от ошибочных конфигураций или плохо написанных программ, которые запускаются с привилегиями, которых у них не должно быть, и допускают ненадежный ввод для таких функций, как system. Однако такие программы обычно имеют другие дыры, которые позволяют потенциальному злоумышленнику атаковать в любом случае, например, возможность записи в файлы.

4 голосов
/ 17 февраля 2020

Как отмечалось в комментарии выше, вы видите, как system() целенаправленно сбрасывает setuid (косвенно через bash).

Мои примечания к экземпляру Amazon Linux для system(3):

Не используйте system () из программы с привилегиями set-user-ID или set-group-ID, потому что странные значения для некоторых переменных среды могут использоваться для нарушения целостности системы. Вместо этого используйте семейство функций exe c (3), но не execlp (3) или execvp (3). На самом деле system () не будет работать должным образом из программ с привилегиями set-user-ID или set-group-ID в системах, в которых / bin / sh имеет значение bash версия 2, так как bash 2 отбрасывает привилегии при запуске. (Debian использует модифицированный bash, который не делает этого, когда вызывается как sh.)

Запуск system() из программы setuid супер опасен , потому что это Намного проще подорвать ваши намерения, чем вы думаете (для начала нужно взломать $IFS).

Использование хотя бы одной из exec функций, по крайней мере, удаляет оболочку, но есть часто другой снаряд в будущем.

Если вам абсолютно необходимо это сделать, вы можете позвонить setuid(geteuid()); до system(), что, по сути, отбрасывает тот факт, что вы находитесь в среде setuid - где реально и эффективные пользователи разные - говорят, что оба являются повышенными правами. Аналогично с группой. Вероятно, это ужасная идея.

Я мог бы предложить, чтобы, если вам нужно спросить SO, как сделать setuid, вы, возможно, не в лучшем положении, чтобы сделать это безопасно.

...