Bash 스크립트가 *전체* 환경을 재설정하고 정리할 수 있습니까? 어떻게?

Bash 스크립트가 *전체* 환경을 재설정하고 정리할 수 있습니까? 어떻게?

당신은 다음 사항을 알고 있습니다 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또한 구문 분석을 위해 로케일의 문자 세트를 존중하므로 LOCPATHLC_*변수를 사용하면 라인에서 임의 코드를 호출하도록 할 수도 있습니다 #! /bin/bash -( #!/bina예: 문자를 공백으로 설정).

또한보십시오:

env SHELLOPTS=noexec any-bash-script

이렇게 하면 bash어떤 작업도 수행되지 않습니다.

이는 단지 몇 가지 예일 뿐입니다.

또한 환경 변수는 명령이 시작 시 상속하는 유일한 항목이 아니며 해당 동작(예: 매개변수, umask, 제한, 현재 작업 디렉터리, 열린 파일 설명자, 신호 구성, 터미널 제어 등)에 영향을 미칠 수 있습니다.

답변2

export -p다음을 사용하여 내보내기를 취소하거나 간단히 내보내기를 찾아 export각 줄을 다음으로 바꿀 수 있습니다.declare -xdeclare +x

eval "$(export|sed s/-/+/)"

스크립트 시작 부분에 환경 변수를 넣으면 명시적으로 직접 내보내지 않는 한 환경 변수가 실행되는 프로그램에 전달되지 않습니다. 로케일과 TZ변수 TERM등 을 내보내고 싶을 수도 있습니다 .

관련 정보