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
상위 셸에 의해 해석이 수행됩니다 .sudo
echo
echo sudo echo $TERM
해석을 한 단계 지연하여 $
" 탈출"할 수 있습니다 .\
sudo echo \$TERM
읽다 man sudo sudoers bash
.