Bash 쉘 기능 및 쉘 충격 이해

Bash 쉘 기능 및 쉘 충격 이해

나는 그것에 대해 물었다.질문Bash에서 쉘 함수를 정의하고 사용하십시오. 이번 질문에서는 어떤 함수 정의 방식이 쉘쇼크를 유발하는지 구체적으로 묻고 싶습니다. 나는 몇 가지 테스트를 했고 다른 사람들에게 확인하고 싶었습니다. 테스트를 위해 bash v4.2를 실행하고 있습니다.

내가 아는 한, 서브쉘에 쉘 함수 정의를 제공하는 방법에는 두 가지가 있습니다.

  • 쉘 변수를 통해 환경으로 내보내기 +
  • 쉘 기능을 통한 정의 + 환경으로 내보내기

첫 번째 방법:

$ foo='() { echo "hello world"; }'
$ export foo
$ env | grep foo
foo = () { echo "hello world"; }

두 번째 방법은 다음과 같습니다.

$ foo() { echo "hello world"; }
$ export -f foo
$ env | sed -n '/foo/{N;p}'
foo = () { echo "hello world"
}

두 가지 방법 모두에서 환경은 쉘 함수를 이름-값 쌍으로 수신합니다 [ foo = () { echo "hello world"; } ]. 이제 내가 관심을 갖는 것은CVE-2014-6271. 함수 정의 끝에서 bash가 후행 명령을 구문 분석하는 방식 때문에 이런 일이 발생한다는 것을 알고 있지만 위의 두 가지 모두가 이 문제를 일으키는지 묻고 싶습니다.

첫 번째 경우에는 다음과 같이 정의할 수 있습니다.

$ foo='() { echo "hello"; }; echo "world";'
$ export foo
$ env | grep foo
foo = () { echo "hello"; }; echo "world";
$ bash -c foo
world // <-- shellshock bug
hello

그러나 두 번째 경우에는 동일한 작업을 수행할 수 없습니다.

// won't put trailing echo in definition
$ foo() { echo "hello"; }; echo "world"; 

// bad syntax
$ foo() '{ echo "hello"; }; echo "world";'

그래서 내 질문은 환경 변수의 함수 정의 이후 후행 명령의 구문 분석 오류로 인해 CVE-2014-6271이 발생하지만 그러한 함수 정의를 export -f <func>환경에 OR로 연결할 수 있다는 것입니다. 이것이 이 문서의 요점입니다. 후행 명령을 입력하면 쉘쇼크가 발생하는 경우가 있나요?

답변1

질문:

...이러한 함수 정의를 OR을 통해 환경에 넣을 수 있습니까 export -f <func>? 첫 번째 경우는 쉘쇼크를 유발하는 후행 명령을 입력하는 유일한 방법입니까?

답변: 첫 번째 시나리오는 쉘 쇼크를 유발하는 유일한 방법입니다.

취약점은 환경 해석에 의해 유발됩니다.변하기 쉬운, 내보낸 함수가 아닙니다.

저것 좀 봐(이거시만텍 사진은 여기. 읽다버그 리포터에 대한 설명.

포함되는 환경 변수의 처리는 (){...}함수 정의로 처리됩니다.그리고: 이러한 변수를 후행하는 경우 ;cmd명령이 실행됩니다. cmd핵심 문제는 함수 구문 분석이 함수 해석을 제한하지 않는다는 것입니다.하나실행 가능한 토큰을 생성하고 내보낸 var에 포함된 나머지 줄을 실행 가능한 명령으로 처리합니다.

변수 내보내기로만 실행을 제한하는 부분은 다음과 같습니다.첫 번째 패치 시도. 곧 명백해졌기 때문에 이것만으로는 충분하지 않았습니다.몇 가지 추가 오류.

따라서 아니요, 함수 정의를 올바르게 내보내지 못하고 다시 읽히는 데 실패하여(완전히 쉘의 제어 하에 있음) 오류가 발생하는 것이 아닙니다. 하지만 결과는일부공격자가 주입했을 수 있는 변수의 값을 구문 분석하는 데 문제가 발생했습니다.

그럼에도 불구하고 버그를 최초로 보고한 사람은 해당 사이트의 일반 사용자였습니다. 아마 그 사람은 문제를 보러 온 것 같습니다.

관련 정보