Sudo가 정규식을 통해 명령줄 인수의 유효성을 잘못 검사합니다.

Sudo가 정규식을 통해 명령줄 인수의 유효성을 잘못 검사합니다.

Alex와 Alexa라는 두 명의 사용자가 있다고 가정해 보겠습니다. 우리는 htop디스크 사용 통계를 보기 위해 Alex가 루트로 실행되도록 허용하고 싶지만 루트가 할 수 있는 다른 사용자의 프로세스를 보는 것을 원하지 않습니다. 그런 다음 플래그를 자신의 사용자 이름 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을 사용합니다.

관련 정보