Ошибки в настройке sudo: почему NOPASSWD — это билет для privilege escalation и как правильно ограничивать команды

Конфигурация sudo — одна из самых частых причин взлома систем. Каждый третий администратор ставит NOPASSWD и считает, что всё безопасно. Ниже приведены типичные ошибки и рекомендации по их исправлению.

1️⃣ NOPASSWD: ALL – мгновенный root для любого пользователя

# Атакующий находит в /etc/sudoers:
%dev ALL=(ALL:ALL) NOPASSWD: ALL

# И просто делает:
sudo su -
# Поздравляю, вы root.

Фикс: никогда не используйте NOPASSWD: ALL. Всегда требуйте пароль или ограничьте команды.

# ВСЕГДА требуйте пароль:
%dev ALL=(ALL:ALL) ALL

# Или хотя бы ограничьте команды:
%dev ALL=(ALL:ALL) NOPASSWD: /usr/bin/apt update

2️⃣ Широкие команды с wildcard – путь к шеллу

# Дебильная строка в sudoers:
%ops ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart *

# Атакующий использует wildcard для побега:
sudo systemctl restart apache2; /bin/bash

Фикс: указывайте конкретные команды без звездочек и без операторов ;, |, &&.

%ops ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
%ops ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart postgresql
# Никаких * и никаких &&, |, ;

3️⃣ Пользовательские скрипты с sudo – засада внутри

# Вы разрешили:
%admin ALL=(ALL) NOPASSWD: /opt/scripts/backup.sh

# Внутри backup.sh:
#!/bin/bash
cp /etc/shadow /tmp/leak.shadow
chmod 777 /tmp/leak.shadow

Любой, кто может редактировать скрипт, становится root.

Фикс: делайте скрипт собственником root, ограничьте права только на исполнение и проверяйте его содержание.

# Владелец - root, права - только исполнение:
sudo chown root:root /opt/scripts/backup.sh
sudo chmod 755 /opt/scripts/backup.sh
# И проверьте, нет ли в скрипте вызова оболочки.

4️⃣ Неправильные пути – PATH атака

# Вы разрешили команду без полного пути:
%user ALL=(ALL) NOPASSWD: cat /var/log/app.log

# Атакующий делает:
export PATH=/tmp:$PATH
echo "/bin/bash" > /tmp/cat
chmod +x /tmp/cat
sudo cat /var/log/app.log # запускает его bash

Фикс: всегда указывайте полные пути и включайте secure_path в sudoers.

%user ALL=(ALL) NOPASSWD: /usr/bin/cat /var/log/app.log
# И используйте secure_path в sudoers:
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

5️⃣ Доступ к редакторам – прямая эскалация

# Если можно sudo vim или sudo nano:
%dev ALL=(ALL) NOPASSWD: /usr/bin/nano

# Внутри редактора:
Ctrl+R (в vim) или Ctrl+T (в nano)
:!/bin/bash
# Бум – root‑шелл.

Фикс: никогда не давайте sudo на редакторы. Если нужно редактировать системные файлы – копируйте, редактируйте локально, потом перемещайте с sudo.

6️⃣ Плохая проверка команд – обход через симлинки

# Вы разрешили:
%user ALL=(ALL) NOPASSWD: /usr/bin/less /home/user/log.txt

# Атакующий:
ln -s /etc/shadow /home/user/log.txt
sudo less /home/user/log.txt # теперь читает shadow

Фикс: проверяйте аргументы или запрещайте опасные команды. Используйте спецификации с тегами.

# Используйте спецификации команд с тегами:
%user ALL=(ALL) NOPASSWD: /usr/bin/less /home/user/*.txt
# Или просто не давайте sudo на чтение через less/more/cat.

Чек‑лист безопасного sudo

  • Никогда NOPASSWD: ALL. Никогда.
  • Всегда полные пути к бинарникам.
  • Без wildcard (*) в командах.
  • Скрипты под sudo – только read‑only, владелец root.
  • Включен secure_path в defaults.
  • Запрещён sudo на редакторы и шеллы (vim, nano, bash, sh).
  • Регулярный аудит /etc/sudoers и /etc/sudoers.d/*.
  • Используйте группы, а не ALL=(ALL) для конкретных пользователей.

Бонус: скрипт для аудита правил sudo

#!/bin/bash
echo "🛡  SUDO Rules Audit"
echo "================="
sudo grep -r "NOPASSWD" /etc/sudoers.d/ /etc/sudoers 2>/dev/null
echo "---"
sudo grep -r "ALL=(ALL)" /etc/sudoers.d/ /etc/sudoers 2>/dev/null | grep -v "#"
echo "================="
echo "Найдите и исправьте все NOPASSWD: ALL. Срочно."

Интересный факт

80% инцидентов с эскалацией привилегий в CTF и на пентестах начинаются с плохой конфигурации sudoers.