환경 변수가 sudo 세션에 전달되는 이유는 무엇입니까? 이것이 문제입니까?

환경 변수가 sudo 세션에 전달되는 이유는 무엇입니까? 이것이 문제입니까?

sudoing이 보안 문제일 때 환경 변수가 루트에 전달되도록 허용하는 방법에 대해 읽어보았습니다. 이로 인해 설정이 올바른지 확인하기 위해 환경을 확인하라는 메시지가 표시되었습니다.

저는 Ubuntu를 사용하고 있으며 다음을 포함하는 기본 sudoers 파일을 가지고 있습니다.

Defaults        env_reset
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
...
%sudo   ALL=(ALL:ALL) ALL

내가 읽은 바에 따르면 (env_keep 또는 SETENV로 재정의되지 않는 한) sudo 세션에서 환경 변수를 제거해야 하는 것처럼 보이지만 env_reset그런 일은 일어나지 않는 것 같습니다.

$ sudo -u root echo $TERM
xterm-256color
$ export TERM=BLAH
$ sudo -u root echo $TERM
BLAH

이것은 내가 시도한 모든 환경 변수에서 발생합니다. 이것이 보안 문제입니까? 그렇다면 어떻게 완화할 수 있나요? 그렇지 않다면 왜 안 됩니까(누군가가 이것을 사용하여 PATH루트로 악성 코드를 실행하도록 조정할 수 있다는 것을 알게 되었습니다)?

내 디렉토리에 파일이 없습니다 sudoers.d.

편집하다:

위의 예에서 쉘은 사용자를 전환하기 전에 변수를 확장하는 것으로 나타납니다. 그러나 대화형 셸을 실행하면 동일한 결과가 나타납니다.

$ echo $TERM
xterm-256color
$ export TERM=BLAH
$ sudo -i         
# echo $TERM
BLAH

HOME그러나 또는 를 사용하여 위의 코드 조각을 실행하면 PATH,그것들변하기 쉬운리셋, 그건 내가 예상했던 것문서.

env_check 및 env_keep 옵션에서 허용하는 호출 프로세스의 변수 외에도 새 환경에는 TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER, USERNAME 및 SUDO_* 변수가 포함됩니다.

그러나 TERM그 목록에서 루트에 전달할 수 있다는 것을 알 수 있으며 이는 다른 임의의 변수에도 작동하는 것 같습니다.

답변1

명령 앞에 다음을 추가하면 볼 수 있듯이 실행 전에도 $TERM상위 셸에 의해 해석이 수행됩니다 .sudoecho

echo sudo echo $TERM 

해석을 한 단계 지연하여 $" 탈출"할 수 있습니다 .\

sudo echo \$TERM

읽다 man sudo sudoers bash.

관련 정보