Sudo valida incorrectamente los argumentos de la línea de comando mediante expresiones regulares

Sudo valida incorrectamente los argumentos de la línea de comando mediante expresiones regulares

Digamos que tenemos dos usuarios: alex y alexa. Queremos permitir que Alex se ejecute htopcomo root para ver las estadísticas de uso del disco, pero no queremos que vean los procesos de otros usuarios que el root puede hacer. Luego es necesario permitirles ejecutar htopcon la -ubandera como su propio nombre de usuario.(nota importante: como mencionó @HBruijn, especificar el indicador de usuario htopno impide que el ejecutor cambie el filtro de usuario mediante la tecla U; supongamos que el indicador limita al ejecutor para ilustrar el problema). Pero también debemos verificar que el último -uargumento especificado sea alex, además no queremos forzar que sea el último argumento especificado. La expresión regular viene de la siguiente manera:

^.*(--user=alex|-u alex)\b((?!-u).)*$
  • ^indica el inicio de la cadena
  • (--user=alex|-u alex)- el grupo de captura para el -uparámetro
  • \b- límite de palabra (por lo que alex no pudo especificar -u alexa)
  • ((?!-u).)*- anticipación negativa que niega cualquier pase después de que se haya pasado -uel válido ( )-u alex

Y lo escribimos en el /etc/sudoersarchivo:

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

Sin embargo, cuando Alex intenta ejecutar un comando normal, sudo se lo niega:

$ 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.

Al verificar la expresión regular egrep(la documentación de Sudo indica que es similar a cómo valida cadenas a través de la expresión regular), funciona como se esperaba:

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

¿Qué causa este comportamiento de sudo ignorando esa coincidencia? Usando Ubuntu 22.04, Sudo 1.9.14p3.

información relacionada