/usr/bin/env를 shebang으로 사용 - 보안에 미치는 영향

/usr/bin/env를 shebang으로 사용 - 보안에 미치는 영향

다음 shebang 라인을 사용하라는 제안을 여러 곳에서 보았습니다.

#!/usr/bin/env bash

바꾸다

#!/usr/bin/bash

내 반응은 "누군가 자신의 실행 파일을 이것으로 바꾸면 어떻게 될까요 ~/.local/bin?"입니다. 이 디렉토리는 일반적으로 시스템 전체 경로보다 먼저 사용자 경로에 설정됩니다. 나는 이것이 보안 문제라고 생각하며 일반적으로 심각하게 고려할 만한 문제라기보다는 부수적으로 남겨 두지만 이 이론을 테스트해 보고 싶었습니다.

이것을 시도하기 위해 나는 다음과 같은 작업을 수행했습니다.

echo -e "#!/usr/bin/python\nprint 'Hacked!'" > $HOME/.local/bin/bash
chmod 755 $HOME/.local/bin/bash
PATH=$HOME/.local/bin env bash

이는

/usr/bin/env: ‘bash’: No such file or directory

뭔가가 포착되었는지 확인하기 위해 나도 그랬습니다.

echo -e "#!/usr/bin/python\nprint 'Hacked!'" > $HOME/.local/bin/perl
chmod 755 $HOME/.local/bin/perl
PATH=$HOME/.local/bin env perl

예상대로 인쇄가 되네요

Hacked!

bash대체품을 찾을 수 없는데 대체품이 발견된 이유를 누군가 나에게 설명해 줄 수 있습니까 perl? 이것이 (내 관점에서) 요점을 놓친 일종의 "안전" 조치입니까?

/usr/bin/env bash편집: 누군가 나에게 메시지 를 보냈기 때문에 /bin/bash. 위와 같이 질문드립니다.

EDIT2: 이건 제가 잘못한 게 틀림없어요. 오늘 다시 시도했지만( env암시적 경로 대신 명시적 경로 사용) "찾을 수 없음" 동작은 없습니다.

답변1

"누군가 실행 파일을 ~/.local/bin에서 이 파일로 바꾸면 어떻게 될까요?

그러면 스크립트가 작동하지 않습니다.

하지만 다른 방법으로 스크립트 자체를 깨뜨릴 수도 있고, 망치 PATH거나 env.

사용자가다른사용자 디렉토리를 수정 PATH하거나 PATH다른 사용자의 디렉토리를 편집할 수 있는 경우 한 사용자가 다른 사용자를 조작하는 것은 사실상 불가능합니다.


그러나 쉘 스크립트가 아니라 일부 프로그램의 setuid 래퍼와 같이 추가 권한을 부여하는 스크립트인 경우에는 상황이 다릅니다. 그런 경우에는필요한절대 경로를 사용하여 프로그램을 실행하고, 권한이 없는 사용자가 수정할 수 없는 디렉터리에 배치하고, 프로그램 시작 시 환경을 정리합니다.

답변2

perl쉘 과 의 동작 차이는 perl쉘이 무엇을 실행할지 결정하기 위해 첫 번째 줄을 확인하는 것과는 다릅니다.

$ cat tcl
#!/usr/bin/env tclsh
puts "TCL running as [pid]"
$ perl tcl
TCL running as 39689
$ cat sbcl
#!/opt/local/bin/sbcl --script
(format t "~a running as ~a~%" 'lisp (sb-unix:unix-getpid))
$ perl sbcl
LISP running as 39766
$ 

이 기능의 용도는 다음과 같습니다.Perl 이외의 언어로 테스트 작성따라서 다른 언어로 TAP 호환 스크립트를 작성하고 prove올바르게 실행할 수 있습니다.

답변3

여기에는 보안 위험이 없습니다. /usr/bin/env사용자 환경에 따라 적절한 바이너리를 선택해야 합니다. 따라서 사용자는 자신의 버전이 bash설치되어 있는 경우 이를 사용하려고 노력해야 합니다 (예: 시스템 전체 버전에서 사용할 수 없는 추가 기능이 포함된 버전을 컴파일했을 수 있으며 시스템 전체 버전 대신에 있는 것을 선호할 수 있음). 다른 바이너리/인터프리터에서도 마찬가지입니다. 사용자는 달리 실행할 수 없는 어떤 것도 실행할 수 없기 때문에 보안 위험이 없습니다.~/.local/bin/usr/bin/env

귀하의 경우 대안 이 실패 하는 이유는 /usr/bin/env. 이는 "파일을 찾을 수 없음" 오류가 무엇을 의미하는지에 대한 단서를 제공합니다.PATH=~/.local/bin bashPATH=~/.local/bin bash <path-to-script>PATH=~/.local/bin /usr/bin/env bash

관련 정보