당신은 다음 사항을 알고 있습니다 sudo
:
Defaults env_reset
이로 인해 환경 주입이 불가능해집니다.이 기능을 bash 스크립트에서 직접 "내부에서" 사용할 수 있는지 궁금합니다.
적어도 부분적으로는 확실합니다. 예:
#!/usr/bin/env php
<?php
//...
// sanitizes $PATH
putenv("PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin");
// unsets $LD_LIBRARY_PATH, as it should be in Ubuntu
putenv('LD_LIBRARY_PATH');
//...
env_reset
그런 식으로 스크립트를 실행할 수 있나요 sudo
? 수행하는 방법?
편집하다:
나는 이 작업을 "외부에서" 수행하는 방법이 아니라
env -i command
스크립트 자체 내에서 수행하는 방법을 찾고 있습니다. 내 의도는 누가(어떤 사용자), 어떻게(어떤 경우, 환경 변수) 실행하든 관계없이 보안을 보장하는 것입니다.
답변1
bash
일부 환경 변수 자체를 사용합니다. bash
부팅되어 첫 번째 명령을 해석할 준비가 되었을 때는 이미 너무 늦었고 악성 환경이 이미 bash
피해를 입혔을 수 있습니다.
bash
전화하기 전에 환경을 정리해야 합니다. C 함수를 사용하여 대부분의 시스템에서 환경을 지울 수도 있고 , 스크립트를 clearenv()
호출 하고 인수에 빈 목록을 전달할 수도 있습니다.execve()
envp
스크립트에 다음이 포함된 경우에도:
#! /bin/bash -
:
( :
특수 내장 명령으로) 환경에 SHELLOPTS=xtrace PS4='$(reboot)'
포함 된 경우 reboot
호출됩니다 :
.
bash
동적으로 링크된 경우 LD_PRELOAD
/는 호출 시 즉시 임의의 코드를 실행할 LD_LIBRARY_PATH
수 있습니다 .bash
bash
또한 구문 분석을 위해 로케일의 문자 세트를 존중하므로 LOCPATH
및 LC_*
변수를 사용하면 라인에서 임의 코드를 호출하도록 할 수도 있습니다 #! /bin/bash -
( #!/bina
예: 문자를 공백으로 설정).
또한보십시오:
env SHELLOPTS=noexec any-bash-script
이렇게 하면 bash
어떤 작업도 수행되지 않습니다.
이는 단지 몇 가지 예일 뿐입니다.
또한 환경 변수는 명령이 시작 시 상속하는 유일한 항목이 아니며 해당 동작(예: 매개변수, umask, 제한, 현재 작업 디렉터리, 열린 파일 설명자, 신호 구성, 터미널 제어 등)에 영향을 미칠 수 있습니다.
답변2
export -p
다음을 사용하여 내보내기를 취소하거나 간단히 내보내기를 찾아 export
각 줄을 다음으로 바꿀 수 있습니다.declare -x
declare +x
eval "$(export|sed s/-/+/)"
스크립트 시작 부분에 환경 변수를 넣으면 명시적으로 직접 내보내지 않는 한 환경 변수가 실행되는 프로그램에 전달되지 않습니다. 로케일과 TZ
변수 TERM
등 을 내보내고 싶을 수도 있습니다 .