다음은 bash 쉘에서 Shellshock 버그를 확인하는 데 사용한 명령입니다.
env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
누구든지 명령을 자세히 설명해 주시겠습니까?
답변1
이 답변은Fedora 매거진의 원본 기사작성자: Matthew Miller, 다음 라이선스에 따라 라이선스가 부여됨크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0특허.
설명하겠습니다:
env x='() { :;}; echo OOPS' bash -c :
취약한 시스템에서는 "OOPS"가 인쇄되지만 bash가 패치된 경우 자동으로 종료됩니다.
env x='() { :;}; echo OOPS' bash -c "echo this is a test"
취약한 시스템에서는 "OOPS"가 인쇄되지만, “this is a test”
bash가 패치된 경우에는 인쇄됩니다.
그리고 환경 변수와 관련이 있다는 말을 들어보셨을 것입니다. 그런데 환경 변수의 코드가 실행되는 이유는 무엇입니까? 글쎄요, 그럴 필요는 없습니다. 하지만 그 자체의 이익을 위해 너무 영리하다고 말하고 싶은 기능 때문에 결함이 있을 여지가 있습니다. Bash는 터미널 프롬프트로 표시되지만 스크립팅 언어이기도 하며 기능을 정의하는 기능도 있습니다. 이렇게 하면 됩니다:
$ Ubuntu() { echo "Ubuntu is awesome."; }
그리고 새로운 명령이 생겼습니다. echo
여기서는 실제로 아직 실행되지 않았다는 점을 명심하세요 . 새 명령을 실행할 때 발생하는 일로 저장되었습니다. 이것은 잠시 후에 중요해질 것입니다!
$ Ubuntu
Ubuntu is awesome.
유용한! 하지만 어떤 이유로든 하위 프로세스로 bash의 새 인스턴스를 실행해야 하고 그 아래에서 멋진 새 명령을 실행하고 싶다고 가정해 보겠습니다. 명령문은 bash -c somecommand
정확히 다음을 수행합니다. 새 쉘에서 주어진 명령을 실행합니다.
$ bash -c Ubuntu
bash: Ubuntu: command not found
아. 슬퍼. 자식은 함수 정의를 상속받지 않았습니다. 그러나 이는 셸에서 내보낸 키-값 쌍의 모음인 환경에 내재되어 있습니다. (이것은 완전한 'nuther 개념입니다. 이것에 익숙하지 않다면 지금은 저를 믿으십시오.) 그리고 bash는 기능도 내보낼 수 있다는 것이 밝혀졌습니다. 그래서:
$ export -f Ubuntu
$ bash -c Ubuntu
Ubuntu is awesome.
이것은 모두 훌륭하고 좋습니다. 이를 수행하는 메커니즘이 다음과 같다는 점을 제외하면좀 멍청한 것 같아. 기본적으로 환경 변수에서 기능을 수행하기 위한 Linux/Unix 마법이 없기 때문에 내보내기 기능은 실제로 기능 정의가 포함된 일반 환경 변수를 생성합니다. 그런 다음 두 번째 셸이 "들어오는" 환경을 읽고 함수처럼 보이는 내용이 포함된 변수를 만나면 이를 평가합니다.
이론적으로 이것은완벽하게 안전하다, 기억하세요. 함수를 정의하는 것은 실제로는그것을 실행. 단, 이것이 우리가 여기 있는 이유입니다. 함수 정의 끝에 도달해도 평가가 중지되지 않는 버그가 코드에 있었습니다. 계속 진행되고 있습니다.
환경 변수에 저장된 함수가 export -f
. 그런데 왜 합법적입니까? 공격자는 기존 환경 변수를 구성할 수 있으며, 그것이 함수처럼 보이면 새로운 bash 쉘은 그렇게 생각할 것입니다!
첫 번째 예에서는 다음과 같습니다.
env x='() { :;}; echo OOPS' bash -c "echo this is a test"
이 env
명령은 주어진 변수 세트를 사용하여 명령을 실행합니다. 이 경우에는 x
함수처럼 보이는 것으로 설정하고 있습니다. 이 함수는 :
실제로 아무것도 하지 않는 것으로 정의된 간단한 명령인 단일 입니다 . 그러나 semi-colon
함수 정의의 끝을 알리는 다음에는 echo
명령이 있습니다. 그런 일이 있어서는 안 되지만, 우리가 그 일을 하는 것을 막을 수 있는 것은 아무것도 없습니다.
그런 다음 이 새로운 환경에서 실행하기 위해 주어진 명령은 다시 " echo this is a test
" 또는 "아무 것도 하지 않음 :
" 명령을 사용하는 새로운 bash 쉘이며, 그 후에는 완전히 무해하게 종료됩니다.
하지만 — 이런! 새 쉘이 시작되고 환경을 읽으면 변수에 도달하고 x
함수처럼 보이기 때문에 이를 평가합니다. 함수 정의가 무해하게 로드된 다음 악성 페이로드도 트리거됩니다. 따라서 취약한 시스템에서 위의 명령을 실행하면 “OOPS”
다시 인쇄될 것입니다. 또는 공격자는 단순히 내용을 인쇄하는 것보다 훨씬 더 나쁜 짓을 할 수도 있습니다.
답변2
~ 안에패치되지 않은 버전bash
내보낸 함수 정의를 환경 변수로 저장합니다.
함수를 다음 x
과 같이 저장합니다.
$ x() { bar; }
$ export -f x
그리고 그 정의를 다음과 같이 확인하세요.
$ env | grep -A1 x
x=() { bar
}
따라서 자신의 환경 변수를 정의하여 이를 활용하고 이를 함수 정의로 해석할 수 있습니다. 예를 들어 다음 env x='() { :;}'
과 같이 취급됩니다.
x() { :;
}
Shellshock을 확인하는 명령은 무엇을 수행합니까?
env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
에서 man env
,
env
- 수정된 환경에서 프로그램을 실행합니다.:
아무것도 하지 않고 종료 상태로 종료합니다0
. 보다더패치되지 않은 bash의 새 인스턴스가 로 시작되면
bash -c "echo this is a test"
제작된 환경 변수가 함수로 처리되어 로드됩니다. 따라서 출력을 얻습니다.
취약한 이건 테스트야
메모:bash 시작 중에 함수 정의 외부의 에코가 예기치 않게 실행되었습니다. 함수 정의는 평가 및 악용이 발생하도록 하는 단계일 뿐이며, 함수 정의 자체와 사용되는 환경 변수는 임의적입니다. 쉘은 환경 변수를 보고, 함수 정의가 어떻게 생겼는지에 대해 알고 있는 제약 조건을 충족하는 것처럼 보이는 x를 확인하고, 라인을 평가하고 의도치 않게 echo(악의적이든 아니든 모든 명령일 수 있음)를 실행합니다. . 또한 참조이것