PATH의 물결표(~)는 HOME이 아니다

원제: The tilde in your PATH may not be your HOME

왜 중요한가

수백만 개발자의 쉘 설정 파일에 잠재된 상대경로 취약점으로, 공유 환경에서 권한 탈취로 이어질 수 있다.

따옴표로 감싼 PATH 설정에서 물결표(~)를 사용하면 $HOME으로 확장되지 않고 문자 그대로 './~/' 디렉터리로 해석된다. 이 경우 공격자가 해당 상대 경로에 악성 바이너리를 심으면 의도치 않게 실행될 수 있어 보안 위협이 된다.

보안 연구자 Disconnect3d이 샌드박싱 도구 nono를 테스트하던 중 이 문제를 발견했다. ~/.bashrc나 ~/.zshrc에 export PATH="$PATH:~/.local/bin/"처럼 작성하면 따옴표 안에서는 물결표 확장(tilde expansion)이 일어나지 않는다. Bash 공식 문서에 따르면, 물결표 확장은 따옴표 없는 입력에서만 수행되며, 변수 할당 시 '='이나 ':'뒤에 오는 경우에도 따옴표가 없어야 한다.

결과적으로 PATH에는 /home/<user>/.local/bin/이 아닌 ./~/.local/bin/이 추가된다. 연구자가 직접 실증한 결과, ./~/.local/bin/ 경로에 임의 바이너리를 넣어두면 해당 쉘 세션에서 실제로 실행됐다. 올바른 해결법은 export PATH="$PATH:$HOME/.local/bin/"처럼 $HOME 변수를 사용하는 것이다.

따옴표 없는 버전인 export PATH=$PATH:~/.local/bin은 Bash와 Zsh 모두에서 정상 작동하지만, 공백이 끼어드는 순간 변수 할당이 깨지기 때문에 이에 의존하는 것은 권장되지 않는다.

자신의 PATH에 문제가 있는지 확인하려면 echo "$PATH" | tr ':' '\n' | grep '~' 명령을 실행하면 된다. 결과가 출력된다면 .bashrc, .zshrc, .profile에서 ~를 $HOME으로 교체해야 한다.

출처

disconnect3d.pl — 원문 읽기 →