오류에 대한 일부 배경 정보:CVE-2014-6271
Bash는 셸 변수 내보내기를 지원할 뿐만 아니라 프로세스 환경을 통해 다른 bash 인스턴스 및 (간접) 하위 프로세스로 셸 함수 내보내기도 지원합니다. 현재 버전의 Bash는 함수 이름으로 명명된 환경 변수와 변수 값에서 "() {"로 시작하는 함수 정의를 사용하여 환경에 함수 정의를 전파합니다. 이 취약점은 bash가 함수 정의를 처리한 후에 중지되지 않고 함수 정의 이후에 쉘 명령을 계속 구문 분석하고 실행하기 때문에 발생합니다. 예를 들어 환경 변수는 다음과 같이 설정됩니다.
VAR=() { ignored; }; /bin/id
/bin/id는 환경을 bash 프로세스로 가져올 때 실행됩니다.
원천:http://seclists.org/oss-sec/2014/q3/650
이 버그는 언제 도입되었나요? 이 버그를 완전히 수정한 패치는 무엇인가요?(바라보다CVE-2014-7169)
원래 CVE에 명시되지 않은 취약한 버전(3.{0..2} 및 4.{0..3})은 무엇입니까?
결함이 있는 소스 코드가 다른 프로젝트에서 재사용되었습니까?
추가 정보가 필요합니다.
답변1
긴 이야기 짧게
Shellshock 취약점이 완전히 수정되었습니다.
- bash-2.05b 브랜치: 2.05b.10 이상(패치 10 포함)
- bash-3.0 브랜치: 3.0.19 이상(패치 19 포함)
- bash-3.1 브랜치: 3.1.20 이상(패치 20 포함)
- bash-3.2 브랜치: 3.2.54 이상(패치 54 포함)
- bash-4.0 브랜치: 4.0.41 이상(패치 41 포함)
- bash-4.1 브랜치: 4.1.14 이상(패치 14 포함)
- bash-4.2 브랜치: 4.2.50 이상(패치 50 포함)
- bash-4.3 브랜치: 4.3.27 이상(패치 27 포함)
Bash에 이전 버전이 표시되면 운영 체제 공급업체에서 직접 패치할 수 있으므로 확인하는 것이 가장 좋습니다.
만약에:
env xx='() { echo vulnerable; }' bash -c xx
"취약성"을 보여도 여전히 취약합니다. 이것은 유일한 관련 테스트입니다(bash 파서가 여전히 노출되어 있는지 여부).어느환경 변수).
세부 사항.
이 버그는 1989년 8월 5일 Brian Fox가 도입한 내보내기/가져오기 기능의 초기 구현에 존재했으며 보안 이전에 bash가 널리 사용되기 전인 약 한 달 후 bash-1.03에서 처음 릴리스되었습니다. 이는 큰 관심사이며 HTTP와 웹 또는 Linux도 존재합니다.
~에서1.05의 변경 내역:
Fri Sep 1 18:52:08 1989 Brian Fox (bfox at aurel) * readline.c: rl_insert (). Optimized for large amounts of typeahead. Insert all insertable characters at once. * I update this too irregularly. Released 1.03. [...] Sat Aug 5 08:32:05 1989 Brian Fox (bfox at aurel) * variables.c: make_var_array (), initialize_shell_variables () Added exporting of functions.
일부 토론GNU 배쉬 오류그리고comp.unix.문제이 기능은 그 무렵에도 언급되었습니다.
그것이 어떻게 거기에 도달했는지 이해하기 쉽습니다.
bash는 환경 변수에 함수를 내보냅니다.
foo=() {
code
}
가져올 때 해야 할 일은 =
그것을 해석하기 위해 공백으로 바꾸는 것뿐입니다. 단, 맹목적으로 해석해서는 안 됩니다.
bash
또 다른 문제는 (Bourne 쉘과 달리) 스칼라 변수와 함수의 네임스페이스가 다르다는 것입니다 . 사실, 당신이 가지고 있다면
foo() { echo bar; }; export -f foo
export foo=bar
bash
둘 다 환경에 기꺼이 넣을 것이지만(예, 동일한 변수 이름을 가진 항목) 많은 도구(많은 쉘 포함)는 이를 전파하지 않습니다.
어떤 사람들은 BASH_
환경 변수가 bash에만 관련되기 때문에 bash가 이를 위해 네임스페이스 접두사를 사용해야 한다고 생각합니다. 비슷한 기능을 가진 접두사를 rc
사용하세요 .fn_
이를 달성하는 더 좋은 방법은 내보낸 모든 변수의 정의를 변수에 넣는 것입니다. 예를 들면 다음과 같습니다.
BASH_FUNCDEFS='f1() { echo foo;}
f2() { echo bar;}...'
이것은 여전히 정리가 필요하지만 적어도 $BASH_ENV
더 이상 쉽게 악용될 수는 없습니다 $SHELLOPTS
...
bash
함수 정의 이외의 내용이 해석되지 않도록 하는 패치가 있습니다 (https://lists.gnu.org/archive/html/bug-bash/2014-09/msg00081.html)은 다양한 Linux 배포판에 적용된 모든 보안 업데이트 중 하나입니다.
그러나 bash는 여전히 그 안에 있는 코드를 해석하므로 해석기의 모든 버그가 악용될 수 있습니다. 그런 오류 하나발견되었습니다(CVE-2014-7169)이지만 그 영향은 훨씬 작습니다. 그래서 곧 또 다른 패치가 있을 예정입니다.
bash가 어떤 변수에서든 코드를 해석하는 것을 방지하는 강화된 수정 사항이 있을 때까지(예: BASH_FUNCDEFS
위의 방법 사용), 우리는 bash 구문 분석기의 버그에 의해 영향을 받지 않는다고 확신할 수 없습니다. 나는 그러한 강화된 수정 사항이 조만간 출시될 것이라고 믿습니다.
2014-09-28 편집
파서에서도 두 가지 버그가 발견되었습니다(CVE-2014-718{6,7})(대부분의 쉘은 특별한 경우를 대비해 파서에 버그가 있어야 하며 파서가 이를 수행하지 않으면 뭔가를 수행하지 않습니다). 신뢰할 수 없는 데이터에 노출되지 않고).
3가지 버그 7169, 7186, 7187이 모두 후속 패치에서 수정되었지만 Red Hat은 여전히 하드 픽스를 추진하고 있습니다. 패치에서는 기능을 BASH_FUNC_myfunc()
다소 선제적인 Chet 설계 결정이라는 변수로 내보내도록 동작을 변경했습니다.
나중에 쳇공식 업스트림 bash 패치로 수정 사항을 릴리스하세요..
이 강화 패치 또는 그 변형은 이제 대부분의 주요 Linux 배포판과 Apple OS/X에서 사용할 수 있습니다.
이제 파서의 다른 두 가지 취약점을 포함하여 이 벡터를 통해 파서의 임의 환경 변수를 악용하는 것에 대한 우려가 제거되었습니다(CVE-2014-627{7,8}).나중에 밝혀졌는데작성자: Michał Zalewski(CVE-2014-6278은 CVE-2014-6271만큼 위험함) 다행히도 대부분의 사람들은 강화 패치를 설치할 시간이 있습니다.
파서의 버그도 수정되지만 파서는 더 이상 신뢰할 수 없는 입력에 쉽게 노출되지 않으므로 더 이상 큰 문제가 되지 않습니다.
보안 취약점이 수정되었지만 이 영역에서는 일부 변경 사항이 있을 수 있습니다. CVE-2014-6271에 대한 초기 수정 사항은 해당 이름이 포함된 함수 가져오기를 중단했기 때문에 이전 버전과의 호환성이 손상 .
되었습니다 :
. /
이는 여전히 bash로 선언될 수 있지만 이로 인해 일관되지 않은 동작이 발생합니다. 해당 이름이 .
포함된 기능이 일반적으로 사용 되므로 :
패치는 최소한 환경에서 기능을 허용하도록 되돌아갈 가능성이 높습니다.
더 일찍 알아 보는 것은 어떨까요?
이것은 나도 알고 싶은 것입니다. 몇 가지 설명을 제공할 수 있습니다.
첫째, 보안 연구원(저는 전문 보안 연구원은 아닙니다)이 특별히 bash의 취약점을 찾고 있었다면 아마도 발견했을 것입니다.
예를 들어, 내가 보안 연구원이라면 내 접근 방식은 다음과 같습니다.
bash
입력을 어디서 받고 어떻게 처리하는지 확인하세요 . 그리고 환경도 한눈에 알 수 있습니다.bash
통역사가 호출되는 위치와 데이터를 확인하세요 . 이번에도 눈에 띕니다.- 수입내보내기 기능setuid/setgid 일 때 비활성화되는 기능 중 하나
bash
이므로 더욱 명확해집니다.
이제 나는 누군가 bash
(통역사)를 위협으로 보거나 위협이 그런 식으로 생성될 수 있다고 의심합니다.
인터프리터는 bash
신뢰할 수 없는 입력을 처리하기 위한 것이 아닙니다.
껍데기스크립트(통역사가 아닌) 보안 관점에서 면밀히 조사되는 경우가 많습니다. 셸 구문은 매우 어색하고 신뢰할 수 있는 스크립트를 작성하는 데 많은 주의 사항이 있으므로(나나 다른 사람들이 분할+글로브 연산자를 언급하는 것을 본 적이 있거나 변수를 인용해야 하는 이유는 무엇입니까?) 처리하는 동안 보안 허점을 찾는 것이 매우 어렵습니다. 스크립트. 신뢰할 수 없는 데이터.
이것이 CGI 쉘 스크립트를 작성해서는 안 된다거나 대부분의 Unices에서 setuid 스크립트가 비활성화되어 있다는 말을 자주 듣는 이유입니다. 또는 전역적으로 쓰기 가능한 디렉터리에 있는 파일을 처리할 때는 각별한 주의를 기울여야 합니다(참조:CVE-2011-0441예를 들어).
초점은 인터프리터가 아닌 쉘 스크립트에 있습니다.
eval
사용자 제공 파일에서 호출하여(해석을 위한 쉘 코드로 외부 데이터 제공) 쉘 인터프리터를 신뢰할 수 없는 데이터에 노출시킬 수 있지만 이를 악용하기 .
위해 취약점이 필요하지는 않습니다 . bash
분명히 해석을 위해 원시 데이터를 셸에 전달하면 셸이 이를 해석할 것입니다.
따라서 쉘은 신뢰할 수 있는 컨텍스트에서 호출됩니다. 해석할 고정된 스크립트를 제공하고 일반적으로 (신뢰할 수 있는 스크립트를 작성하는 것은 매우 어렵기 때문에) 처리할 고정된 데이터를 제공합니다.
예를 들어 웹 컨텍스트에서 셸은 다음과 같이 호출될 수 있습니다.
popen("sendmail -oi -t", "w");
무엇이 잘못될 수 있나요? 문제가 발생하면 셸 명령줄 자체를 구문 분석하는 방법이나 셸에 추가 데이터가 공급되는 방식이 아니라 sendmail에 공급되는 데이터에 관한 것입니다. 쉘에 전달된 환경 변수를 고려할 이유가 없습니다. 이렇게 하면 이름이 "HTTP_"로 시작하는 모든 환경 변수는 잘 알려진 CGI 환경 변수이거나 쉘 또는 sendmail과 아무 관련이 없다는 SERVER_PROTOCOL
것을 알게 됩니다.QUERYSTRING
setuid/setgid를 실행하거나 sudo를 통해 실행하는 경우와 같은 권한 에스컬레이션 컨텍스트에서는 환경이 고려되는 경우가 많으며 과거에도 셸 자체가 아니라 권한을 상승시키는 항목에 대해 많은 취약점이 있었습니다. sudo
(예를 들어 참조CVE-2011-3628).
예를 들어, bash
setuid에 의해 호출되거나 setuid 명령( mount
예: 도우미 프로그램 호출)을 통해 호출되면 환경이 신뢰되지 않습니다. 특히 내보낸 함수는 무시됩니다.
sudo
깨끗한 환경 수행: 기본적으로 화이트리스트에 포함된 환경을 제외한 모든 환경이 나열되며, 그렇게 하지 않도록 구성한 경우 쉘이나 다른 방식(예: PS4
, BASH_ENV
... SHELLOPTS
)에 영향을 미치는 것으로 알려진 일부 환경이 나열됩니다. 또한 환경 변수를 블랙리스트에 추가합니다.콘텐츠(이것이 CVE-2014-6271이 를 통한 ()
권한 상승을 허용하지 않는 이유입니다 sudo
).
그러나 이는 환경을 신뢰할 수 없는 컨텍스트에도 적용됩니다. 즉, 해당 컨텍스트에서 악의적인 사용자가 이름과 값을 가진 모든 변수를 설정할 수 있습니다. 이는 웹 서버/ssh 또는 환경이 제어되는 CVE-2014-6271을 이용하는 모든 벡터에는 적용되지 않습니다(적어도 환경 변수의 이름은 제어됩니다...).
같은 변수를 차단하는 것이 중요 echo="() { evil; }"
하지만 쉘 스크립트나 명령줄이 이를 명령으로 호출하지 않기 HTTP_FOO="() { evil; }"
때문에 그렇지 않습니다. apache2는 OR 변수를 HTTP_FOO
설정하지 않습니다 .echo
BASH_ENV
그것은 명백하다일부상황에 따라 환경 변수를 블랙리스트에 추가해야 하는 경우도 있습니다.이름하지만 자신의 상황에 따라 블랙리스트에 올라야 한다고 생각하는 사람은 아무도 없습니다.콘텐츠(와는 별개로 sudo
). 즉, 임의의 환경 변수가 코드 삽입의 벡터가 될 수 있다고 생각하는 사람은 아무도 없습니다.
기능이 추가되었을 때 수행된 광범위한 테스트에서 이를 포착할 수 있었는지 여부에 대해서는 그럴 가능성이 낮다고 생각합니다.
테스트할 때특징, 기능을 테스트합니다. 이 기능은 잘 작동합니다. 한 호출에서 함수를 내보내면 bash
다른 호출에서 가져올 수 있습니다. 매우 철저한 테스트를 통해 동일한 이름의 변수 및 함수를 내보낼 때 또는 함수를 내보냈을 때와 다른 로케일로 가져올 때 문제가 드러날 수 있습니다.
그러나 취약점을 찾기 위해 기능 테스트를 수행할 필요는 없습니다. 보안 측면이 주요 초점이 되어야 하며 기능을 테스트하는 것이 아니라 메커니즘과 그것이 남용될 수 있는 방법을 테스트해야 합니다.
이것은 개발자(특히 1989년)가 자주 생각하는 것이 아니며 쉘 개발자는 자신의 소프트웨어가 네트워크에 의해 악용될 가능성이 없다고 생각할 수도 있습니다.
답변2
NIST의 NVD 데이터베이스에 따르면(http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-6271), 1.14.0으로 시작하는 모든 버전의 bash는 취약합니다.
RedHat에 취약점이 통보되었습니다.9월 14일.
2014년 9월 26일 Mr.Ramey(bash 관리자)가 발표한 패치로 다음 문제가 해결되었습니다.CVE-2014-7169 오류.
해당 bash 소스에 다음 패치와 이전 패치를 모두 적용합니다.
- http://ftp.gnu.org/pub/gnu/bash/bash-2.05b-patches/bash205b-010
- http://ftp.gnu.org/pub/gnu/bash/bash-3.0-patches/bash30-019
- http://ftp.gnu.org/pub/gnu/bash/bash-3.1-patches/bash31-020
- http://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-054
- http://ftp.gnu.org/pub/gnu/bash/bash-4.0-patches/bash40-041
- http://ftp.gnu.org/pub/gnu/bash/bash-4.1-patches/bash41-014
- http://ftp.gnu.org/pub/gnu/bash/bash-4.2-patches/bash42-050
- http://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-027
Bash의 추가 취약점
- https://access.redhat.com/security/cve/CVE-2014-7186
- https://access.redhat.com/security/cve/CVE-2014-7187
이 오류의 기록에 대한 자세한 내용은 (제공:맥사이프)
원천:http://www.linuxmisc.com/12-unix-shell/e3f174655d75a48b.htm
1994년에 Chet Ramey는 이것이 내보낸 함수를 지정하는 이전 POSIX 2 사양보다 앞서 있다고 설명했습니다. 아니면 적어도 그가 bash 메커니즘을 설명하는 방법은 다음과 같습니다. 당시에도 지금처럼 결함이 있었는지 모르겠습니다. 그는 또한 이 스레드에서 rc의 함수 내보내기에 대해서도 논의합니다.