최신 bash
익스플로잇에 대해 읽은 후 Tavis Ormandy의 익스플로잇이 어떻게 작동하는지 궁금했습니다. 어떻게 (a)=>\
작동하나요?
그는 다음과 같이 게시했습니다.
나에게는 bash 패치가 불완전한 것으로 보이며 함수 구문 분석은 여전히 취약합니다. 예를 들어
$ env X='() { (a)=>\' sh -c "echo date"; cat echo
답변1
GNU Bash 내보내기쉘 기능함수 정의가 포함된 환경 변수에서:
$ function foo { echo bar; }
$ export -f foo
$ env | grep -A1 foo
foo=() { echo bar
}
새로운 Bash 인스턴스가 생성되면 특정 패턴과 일치하는 환경 변수를 찾습니다. 이 변수의 내용은 다음과 같습니다.자동으로쉘 함수로 가져왔습니다. ~처럼스티븐 체이저러스가 설명하다=
, 이 기능은 Bash 1.03에서 도입되었으므로 해당 항목을 교체하는 것만으로 함수 가져오기를 완료할 수 있습니다.환경 변수 배열, 결과를 함수 정의로 해석합니다. 전에반점그 고정 하나CVE-2014-6271, 환경 변수는 실제 함수 본문을 따르는 모든 명령을 포함하여 완전히 해석됩니다. 패치는 이 parse_and_execute()
기능에 두 가지 특수 모드를 도입했습니다 SEVAL_FUNCDEF
. SEVAL_ONECMD
이 함수를 호출할 때 SEVAL_FUNCDEF
함수에서 정의한 명령 이외의 명령이 해석되어서는 안 됩니다. 이 SEVAL_ONECMD
플래그는 함수가 여러 명령을 평가하는 것을 방지해야 합니다.
Tavis Ormandy의 사용자 정의 환경 변수는 미묘하게 다른 작업을 수행합니다. 이는 파서를 혼란스럽게 하고 평가할 명령을 저장하는 데 사용되는 버퍼를 손상시키도록 설계되었습니다. 버퍼의 나머지 환경 변수후속 명령의 해석 변경. 이 관련 문제는 CVE 식별자를 받았습니다.CVE-2014-7169.
환경 변수 정의의 구성요소는 X='() { (a)=>\'
다음과 같습니다.
() {
파서는 이것을 함수 정의의 시작으로 해석합니다.(a)=
파서를 혼란스럽게 하고 버퍼에 환경 변수의 잔여물을 남기도록 설계되었습니다.>\
버퍼에 남아있는 실제 페이로드입니다.
페이로드의 목적은 호출 하위 쉘에서 실행되는 명령의 해석을 변경하는 것입니다 sh -c "echo date";
. 물론 이것은 이것이 /bin/sh
에 대한 심볼릭 링크라고 가정합니다 bash
. 피연산자로 지정된 명령 문자열이 -c
버퍼에 배치되면 버퍼의 내용은 다음과 같습니다.
>\[0xA]echo date
[0xA]
일반적으로 명령 구분 기호로 사용되는 ASCII 개행 문자 이지만 이제 \
페이로드에서 이스케이프됩니다. 결과적으로 버퍼의 내용은 다음과 같이 해석됩니다.
>echo date
왜냐하면Bash에서는 리디렉션 연산자가 명령 앞에 올 수 있도록 허용합니다.,이것은 다음과 같습니다.
date > echo
이는 단순히 date
표준 출력이 이름이 지정된 파일로 리디렉션될 때 명령이 실행되도록 합니다 echo
. 나머지는 cat echo
공격의 일부가 아니며 이제 echo
출력이 포함된 이름의 파일이 있음을 보여줍니다 date
.
이 경우 문자열이 파서를 혼동하는 이유는 (a)=
(잘못된) 중첩 함수 정의로 나타나는 것과 관련이 있는 것 같습니다. 이것이 익스플로잇의 단순화된 변형이를 더 명확하게 증명하면 다음과 같습니다.
$ X='() { function a a>\' bash -c echo
$ ls echo
echo