Как избежать эскалации прав через NOPASSWD: практическое руководство
Ошибки в настройке 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.