Sudo неправильно проверяет аргументы командной строки с помощью регулярных выражений

Sudo неправильно проверяет аргументы командной строки с помощью регулярных выражений

Допустим, у нас есть два пользователя: alex и alexa. Мы хотим разрешить alex выполняться htopкак root, чтобы видеть статистику использования диска, но мы не хотим, чтобы они видели процессы других пользователей, которые может делать root. Тогда необходимо разрешить им выполняться htopс -uфлагом, являющимся их собственным именем пользователя(важное примечание: как отметил @HBruijn, указание флага пользователя htopне мешает исполнителю изменять пользовательский фильтр с помощью клавиши U; давайте представим, что флаг ограничивает исполнителя, чтобы проиллюстрировать проблему). Но нам также нужно проверить, что последний указанный -uаргумент — это alex, плюс мы не хотим, чтобы он был последним указанным аргументом. Регулярное выражение выглядит следующим образом:

^.*(--user=alex|-u alex)\b((?!-u).)*$
  • ^указывает начало строки
  • (--user=alex|-u alex)- группа захвата для -uпараметра
  • \b- граница слова (поэтому Алекс не смог указать -u alexa)
  • ((?!-u).)*- отрицательный просмотр вперед, который запрещает любые проходы после того, как был пройден -uдопустимый ( )-u alex

И записываем это в /etc/sudoersфайл:

echo "alex ALL=(ALL) NOPASSWD: /usr/bin/htop ^.*(--user=alex|-u alex)\b((?!-u).)*$" >> /etc/sudoers

Однако когда alex пытается выполнить обычную команду, sudo отклоняет ее:

$ sudo /usr/bin/htop -u alex 
[sudo] password for alex: 
Sorry, user alex is not allowed to execute '/usr/bin/htop -u alex' as root on machine.

При проверке регулярного выражения egrep(в документации sudo указано, что это похоже на проверку строк с помощью регулярного выражения) все работает так, как и ожидалось:

$ echo '-u alex' | egrep '^.*(--user=alex|-u alex)\b((?!-u).)*$'
-u alex

Что вызывает такое поведение sudo, игнорирующего это совпадение? Использую Ubuntu 22.04, Sudo 1.9.14p3.

Связанный контент