Shellshock Bash 취약점은 어떻게 발견 되었습니까?


19

이 버그는 많은 플랫폼에 영향을 미치기 때문에이 취약점이 발견 된 프로세스에서 무언가를 배울 수 있습니다. εὕρηκα (eureka) 순간입니까, 보안 검사의 결과입니까?

우리는 Stéphane이 Shellshock 버그를 발견했음을 알고 다른 사람들도 프로세스를 알고있을 수 있기 때문에 버그를 어떻게 찾게되었는지에 관심이있을 것입니다.


5
관련 : 그의 대답 에 "는 셸 쇼크가있을 때 (CVE-2014-6271 / 7169) 버그가 도입, 어떤 패치가 완벽하게 수정이 무엇입니까?".
Cristian Ciupitu

이 질문은 특정 * nix 문제가 아닌 특정 개인의 사고 과정에 관한 것이기 때문에 주제가 아닌 것으로 보입니다.
terdon

@Anthon 왜 이것이 Linux에 관한 것입니까? OP 인 것처럼 다른 사람의 의견을 가져 오는 수정 사항을 승인하는 이유는 무엇입니까?
muru December

@muru 나는 ​​이것이 개선 된 것을 발견했다. 운 좋게도 제안 된 편집을 승인하는 데 두 명 이상이 필요합니다. 그러나 나는 질문이 이미 종결되었다는 사실을 놓쳤다는 것을 인정해야한다. 그렇지 않으면 나는 리눅스, 유닉스를 떠나지 않았을 것이다.별로 신경 쓰지 않는다.
Anthon

1
이 사이트에서 각각의 모든 질문을 읽었다 고 가정하지 마십시오. 간단한 답변 은 thread.gmane.org/gmane.comp.security.oss.general/14177/… 을 참조하십시오 .
Stéphane Chazelas

답변:


23

몇 가지를 안심시키기 위해, 익스플로잇을 관찰하여 버그를 찾지 못했습니다. 공개되기 전에 익스플로잇되었다고 믿을만한 이유가 없습니다 (물론 배제 할 수는 없지만). bash의 코드를 보면 찾지 못했습니다 .

나는 당시의 내 생각의 기차를 정확하게 기억한다고 말할 수 없다.

그것은 내가 위험하다고 생각하는 일부 소프트웨어 (소프트웨어가 아닌 행동)의 일부 행동에 대한 반성에서 비롯되었습니다 . 당신이 생각하게하는 행동의 종류 : 그것은 좋은 생각처럼 들리지 않습니다 .

이 경우 이름이로 시작하면 클라이언트에서 비 염소 환경 변수를 전달할 수있는 ssh의 공통 구성에 대해 생각하고있었습니다 LC_. 아이디어는 사람들이 ssh다른 기계를 사용할 때 자신의 언어를 계속 사용할 수 있도록 하는 것입니다. UTF-8을 방정식에 넣을 때 (그리고 많은 응용 프로그램에서 처리가 얼마나 나쁜지 확인하는 경우) 복잡한 지역화 처리가 얼마나 복잡한지를 고려하기 시작할 때까지 좋은 아이디어입니다.

돌아 가기 년 7 월 2014 년, 나는 이미 그와 함께 glibc는 현지화 처리의 취약점보고했다 sshd 설정하고, 두 개의 다른 위험한 행동bash 그들이 거기에 파일을 업로드 할 수 있었다 제공 (인증) 공격자가 자식 서버를 해킹 할 수 및 bash사용 git unix 사용자의 로그인 쉘 (CVE-2014-0475)로.

bashssh를 통해 서비스를 제공하는 사용자의 로그인 쉘로 사용하는 것이 좋지 않은 생각이라고 생각했습니다 . 단지 복잡한 쉘이기 때문에 (단순히 간단한 명령 줄을 구문 분석하는 경우) 대부분의 잘못된 디자인을 상속했습니다. ksh. bashssh를 해석하기 위해 해당 컨텍스트에서 사용되는 몇 가지 문제를 이미 식별 했으므로 ForceCommand잠재적으로 더 많은 것이 있는지 궁금합니다.

AcceptEnv LC_*이름이 시작하는 변수를 허용하고 함수LC_bash 내 보낸 함수 ( 시간에 위험한 기능 이지만 위험한 기능 임)는 이름이 비슷한 환경 변수를 사용 myfunction()하고 있고 흥미로운 것을 볼 수 없는지 궁금한 모호한 기억을 가지고있었습니다.

나는 그것이 최악의 방법 LC_something 은 존재하는 명령 이름이 아니기 때문에 실제로는 문제가 될 수없는 명령을 재정의하는 것이 아니라고 생각했지만 그 환경 변수를 어떻게 bash 가져 왔는지 궁금해하기 시작했습니다 .

LC_foo;echo test; f()예를 들어 변수가 호출되면 어떻게 됩니까? 그래서 자세히 살펴보기로했습니다.

ㅏ:

$ env -i bash -c 'zzz() { :;}; export -f zzz; env'
[...]
zzz=() {  :
}

내 기억이 변수가 호출되지 않은에서 것을 잘못 것으로 나타났다 myfunction()하지만 myfunction(그리고 그것은의 으로 시작하는 ()).

그리고 빠른 테스트 :

$ env 'true;echo test; f=() { :;}' bash -c :
test
bash: error importing function definition for `true;echo test; f'

변수 이름이 삭제되지 않았 음을 의심하고 시작시 코드를 평가 했습니다 .

더 나쁘게도, 훨씬 더 나쁘게도 그 가치 는 살균되지 않았습니다.

$ env 'foo=() { :;}; echo test' bash -c :
test

그것은 모든 환경 변수가 벡터가 될 수 있음을 의미했습니다 .

그때 나는 문제의 범위를 깨달았을 때 HTTP를 통해 ( HTTP_xxx/ QUERYSTRING... env vars), 메일 처리 서비스, DHCP (그리고 아마도 긴 목록)와 같은 다른 것들도 악용 될 수 있음을 확인하고 조심스럽게보고했습니다. .


4
재미있는 독서! 질문에 대한 의견은 이것이이 사이트에서 약간의 주제가 아닐 수 있음을 분명히하지만, 나는 이것과 같은 소량의 Q / A : (답변이 깨끗하고 잘 쓰여진)는 실제로 사이트의 자산!
Johan E
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.