CVE-2014-6271의 원래 테스트는 다음과 같습니다.
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
그러나 CVE-2014-7169에 대한 업데이트 된 테스트와 해당 출력으로 인해 혼란 스럽습니다.
$ env X='() { (a)=>\' sh -c "echo date"; cat echo
sh: X: line 1: syntax error near unexpected token `='
sh: X: line 1: `'
sh: error importing function definition for `X'
Thu 25 Sep 2014 08:50:18 BST
누군가 여기서 일어나는 일과 그것이 CVE-2014-6271의 패치를 우회하는 방법을 간단히 설명 할 수 있습니까?
답변
나는이 질문을 처음 게시 한 이후로 웹을 조금 파고 들었습니다.
버그 의 원래 발견 자 에 따르면 CVE-2014-6271 패치 이전의 bash는 다음과 같은 기능을 가져 왔습니다.
foo=() {
code
}
등호를 공백으로 바꾸고 해석함으로써 … 함수 정의를 넘어서는 해석이 가능하다는 것을 의미했습니다.
패치 CVE-2014-6271에 대한이 parse_and_execute () 함수의 특수 모드를 도입 함수 정의에 한계 평가, 그리고 그 이상.
그러나이 스레드 에서 설명한 것처럼 CVE-2014-7169 취약성 테스트의 특수하게 조작 된 환경 변수는 1) 파서를 죽음으로 혼동합니다. 2) 버퍼에 스크랩을 남겨 둡니다. 3) 원래 bash 명령이 수행하는 작업을 완전히 변경하도록 설계되었습니다. 버퍼에 이미있는 스크랩과 결합합니다.
따라서 환경 변수를 분석하려면 다음을 수행하십시오.
X='() { (a)=>\'
- 파서는 분석
() { (a)=>\
합니다. 그 주\
문자열의 일부입니다; 그것은되어 있지 후행 따옴표를 탈출.
() {
- 파서는 이것을 함수 정의로 식별합니다.
(a)=
- 이것은 파서를 죽음으로 혼동합니다.
>\
- 파서는 마지막 두 문자를 버퍼에 그대로 둡니다.
>\[NEWLINE]
sh
명령이 실행 되기 전에 언젠가 개행이 버퍼에 배치됩니다.
>\[NEWLINE]echo date
sh
가 호출 되면 (이 경우 bash의 심볼릭 링크 일 수 있음) 명령 인수를echo date
버퍼에 이미 존재하는 문자에 추가합니다 .
>echo date
- 개행 이스케이프되므로 떠들썩한 파티는 버퍼 해석하는
>echo date
것과 같은 효과를 가지며,date > echo
. 이름echo
이 지정된 파일 이 작성되고date
명령 의 표준 출력 이 경로 재 지정됩니다.
; cat echo
- 두 번째 명령은 단순히 새로 만든 파일의 내용을 표시합니다.
답변
깔끔한 출력을 제공하지는 않지만 버그를 보여줍니다.
버그없이 환경 변수 X
를 무시하고 bash를 실행해야 echo date
하며 cat는 echo라는 파일이 없다고 불평해야합니다. 예를 들어 대시의 동작을 고려하십시오.
me@myserver$ rm -f echo && env -i X='() { (a)=>\' dash -c 'echo date'; cat echo
date
cat: echo: No such file or directory
나는 당신이 당신의 질문에 표시하는 출력을 반복하지 않을 것이고 그것이 어떻게 작동하는지 이해하는 척하지는 않지만 bash는 실행 date
되고 출력을 ‘echo’라는 파일에 넣습니다. 당신은 date
이것이 유용하고 위험하다는 것을 확신시키기 위해 대안을 가지고 놀 수 있습니다 .