`env X='() { (a)=>\' sh -c "echo date"` 어떻게 작동하나요?

`env X='() { (a)=>\' sh -c "echo date"` 어떻게 작동하나요?

최신 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

관련 정보