Shellshock (원격 익스플로잇 CVE-2014-6271 및 CVE-2014-7169)을 피하기 위해 Bash를 어떻게 다시 컴파일합니까?


368

Bash 3.2 (OS X에서 제공하는 버전)가 "Shell Shock"( CVE-2014-6271CVE-2014-7169 ) 로 알려진 원격 실행 익스플로잇에 취약한 경우 Bash를 다시 빌드하고 시스템을 안전하게 보호하는 방법 공식 애플 패치?

업데이트 : Apple은 이제 공식 패치를 발표했습니다. 자세한 내용은 아래 를 참조하십시오.


5
애플은 수정 프로그램을 발표했다 : support.apple.com/kb/DL1769
AT

1
위에서 언급 한 OS X bash 업데이트 1.0 패치는 OS X 10.9.5 이상에 해당합니다. 모두 OS X 10.7.5 (Lion), OS X 10.8.5 (Mountain Lion), OS X 10.9.5 ( 매버릭스).
l' L' l

예, 9 시간 전에 링크를 추가했지만 잘못 삭제되었습니다. apple.stackexchange.com/revisions/146849/10
AlBlue

gist.github.com/dnozay/395dcdef05c6b4b1836a 를 만들었습니다. 이 단계에는 대부분의 단계가 있으며 이미 패치가 포함되어 있습니다 (OSX 10.6에서 작동해야 함).
dnozay

@dnozay 감사합니다! 패치 55 및 56 (이미 만료 됨) 및 57 (곧 만료 예정)을 포함하도록 업데이트하십시오.
Old Pro

답변:


429

지위

Apple은 Shellshock 및 관련 취약점에 대한 Bash 보안 픽스를 " OS X bash Update 1.0 "으로 출시했습니다 . OS X Mountain Lion v10.8.5 또는 OS X Mavericks v10.9.5 ( 보안 업데이트 2014-005에 포함됨 )를 사용하는 사람들을 위해 일반 시스템 업데이트를 통해 설치할 수 있으며 수동으로 설치할 수도 있습니다. 공식 Apple 픽스는 OS X Lion v10.7.5 및 OS X Lion Server v10.7.5에서도 사용 가능하지만 수동 다운로드를 통해서만 제공됩니다. 보안 수정 사항은 운영 체제 버전에 따라 다른 URL을 통해 사용 가능합니다.

(새 패치가 릴리스 된 경우 여기에 배치하되 참조 할 수 있도록 기존 패치를 보관하십시오.)

Apple 패치는 Shellshock 및 기타 여러 가지 취약점을 해결하며 대부분의 사람들에게 적합합니다. tl; dr 사람들은 여기서 읽기를 중단 할 수 있습니다.

그러나 Shellshock 버그로 인해 bash가 주목 받게되면서 많은 연구자들이 bash를 열심히 살펴보고 점점 더 많은 (취약하기 어려운) 취약점이 발견되었습니다. 공개적으로 사용 가능한 웹 사이트를 호스팅하기 위해 OS X Server를 실행하고 있기 때문에 보안에 대해 크게 우려하는 경우 bash를 직접 컴파일하여 취약점과 패치를 계속 유지하려고 할 수 있습니다. 그렇지 않으면 걱정하지 마십시오.

먼지가 더 많은 취약점을 찾는 데 어려움을 겪을 때 Apple이 또 다른 업데이트를 발표 할 예정인지 확인하십시오.


CVE-2014-6271 및 CVE-2014-7169를 수정하는 Bash 3.2, 패치 52, 53 및 54 (Bash 4.3 패치 25, 26 및 27에 해당)의 공식 bash 자체 패치를 사용할 수 있습니다. 아래에 '게임 오버'가 표시됩니다. 이것은 나 ( @alblue )에 의해 테스트되었으며 게시물이 그에 따라 업데이트되었습니다 (그리고 추가 업데이트가 이루어졌습니다 : 패치 54에서 멈추는 게시물의 개정 41 참조 ).

bash에 대해 많은 추가 취약점이보고되었습니다. Michal Zalewski의 게시물 에 따르면 패치 54 (그리고 아마도 Apple의 공식 패치)를 가지고 있다면 "이러한 개별 버그의 상태에 대해 집착 할 필요는 없습니다. 더 이상 보안 위험이 없어야합니다."

  • CVE-2014-6271-Stephane에서 발견 한 원본 RCE bash43-025 및 다른 버전의 해당 9 월 24 일 항목으로 수정되었습니다.

  • CVE-2014-7169-Tavis에서 파일 생성 / 토큰 소비 버그를 발견했습니다. bash43-026 & co에 의해 수정되었습니다 (9 월 26 일)

  • CVE-2014-7186-Florian과 Todd가 발견 한 위험이없는 10+ here-doc 충돌. bash43-028 & co (10 월 1 일)에 의해 수정되었습니다.

  • CVE-2014-7187-Florian이 발견 한 충돌하지 않는, 아마도 위험하지 않은 위험이 있습니다. bash43-028 & co (10 월 1 일)에 의해 수정되었습니다.

  • CVE-2014-6277-초기화되지 않은 메모리 문제, 거의 확실하게 Michal Zalewski가 RCE를 발견했습니다. 아직 특정 패치가 없습니다.

  • CVE-2014-6278-Michal Zalewski가 명령 주입 RCE를 찾았습니다. 아직 특정 패치가 없습니다.

꽤 혼란스러워집니다. 다행히도 공식적인 bash 관리자 인 Chet Ramey는 CVE와 패치 매핑을 게시했습니다 . 그의 게시물은 bash 4.3의 패치를 언급하며, I (@OldPro)는 OS X에 적용 가능한 bash 3.2의 패치로 변환했습니다. 또한이 포스트 이후로 패치 57을 릴리스했기 때문에 아래에 추가했습니다.

 bash32-052      CVE-2014-6271                           2014-09-24
 bash32-053      CVE-2014-7169                           2014-09-26
 bash32-054      exported function namespace change      2014-09-27 ("Game Over")
 bash32-055      CVE-2014-7186/CVE-2014-7187             2014-10-01
 bash32-056      CVE-2014-6277                           2014-10-02
 bash32-057      CVE-2014-6278                           2014-10-05

타임 라인과 자세한 내용은 David A. Wheeler의 게시물 을 참조하십시오 .

@alblue는 패치 55를 통해 빌드 지침을 게시했습니다. I (@OldPro)는 지침 56에 패치 56 및 57을 추가했지만 테스트하지는 않았습니다.

원래 취약점 테스트

이 테스트를 실행 하여 CVE-2014-6271 의 원래 문제에 취약한 지 확인할 수 있습니다 .

$ env x='() { :;}; echo vulnerable' bash -c 'echo hello'
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
hello

위 출력은 취약점이없는 bash버전 의 예입니다 . vulnerable해당 명령의 출력에 단어 가 표시되면 bash취약하므로 업데이트해야합니다. 다음은 OS X 10.8.5의 취약한 버전입니다.

10.8.5의 취약점을 보여주는 bash 터미널의 스크린 샷

새로운 취약점 테스트

가 발생했습니다 원래의 게시물에 대한 업데이 트 (1은) 여전히에 정의 된 취약점의 변화에 취약하고 배쉬 3.2.52 CVE-2014-7169

$ rm -f echo
$ 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

위 출력은 취약한 bash버전 의 예입니다 . 해당 명령의 출력에 날짜가 표시되면 bash취약한 것입니다.

"게임 오버"를 방지하기 위해 자동 가져 오기 기능 비활성화

연구원들은 취약점을 취약점으로 분류하지 않고 스크립트가 자동 가져 오기 기능을 사용하여 서브 쉘에서 기능을 가로 챌 수 있다고 지적했습니다.

$ env ls="() { echo 'Game Over'; }" bash -c ls
Game over

영향을받는 시스템의 위 코드 Game Over는 예상 디렉토리 목록 대신 표시 됩니다 ls. 분명히, echo 'Game Over'당신이 원하는 어떤 사악한 코드로 대체 될 수 있습니다. 이것은 "게임 오버"버그로 알려졌습니다.

패치 54를 사용하기 전에 NetBSDFreeBSD 는 기본적으로 자동 가져 오기 bash 기능을 비활성화하여 부분적으로 "Game Over"를 방지하지만 파서 ( CVE-2014-7169 와 같은)에 추가 오류 가있을 수 있습니다. 계속 발견되고 새로운 명령 행 플래그가 추가되었습니다.--import-functions이전 기본 동작을 다시 활성화하십시오. 나 (@alblue)는 다른 사람들이이 동작을 채택하고 아래에 포함시키고 자 할 때 사용할 수있는 패치 (3.2.53)를 준비했습니다. 기본적으로이 패치는 아래 빌드 스크립트에서 활성화되어 있지 않습니다. 나 (@OldPro)는이 패치가 더 이상 필요하지 않거나 좋은 생각이라고 생각합니다. 하위 호환성을 손상시키고 패치로부터 보호하는 취약점은 패치 54 및 이전 패치에서 잘 해결되며이 비공식 패치를 활성화하면 향후 패치가 적용되지 않습니다 .

(질문 편집자 참고 사항 : 비공식 패치이므로 기본적으로 활성화하지 마십시오.)

a0c5c4d66742fddd0a35001cb91798a5fbf8a2f5 import_functions.patch

export ADD_IMPORT_FUNCTIONS_PATCH=YES빌드를 실행 하기 전에 실행하여 패치를 활성화 할 수 있습니다 . 향후 패치가 비공식 패치와 호환되지 않을 수 있으므로이 패치활성화하면 패치 54 및 향후 패치가 비활성화 됩니다.

Apple Patch에는 Game Over 취약점이 있습니다.

트위터 에서 @ake_____가 지적한 것처럼 공식 Apple 패치는 여전히 실행 파일의 환경 복제에 취약합니다.

$ env '__BASH_FUNC<ls>()'="() { echo Game Over; }" bash -c ls
Game Over

사용자는 이것이 얼마나 중요한지 스스로 결정해야합니다. 나 (@OldPro)는 일반적으로 권한이없는 원격 공격자 가 환경 변수 의 이름 을 설정할 수없고 권한이있는 공격자가이 동작에 대한 알려진 악용이 없기 때문에 걱정할 필요가 없다고 생각합니다 (CVE 식별자도 제공 되지 않음). 이것을 사용하여 그들이 아직 가지고 있지 않은 권한을 얻습니다 (적어도 추가 취약점을 악용하지 않으면 서).

약간의 배경 지식을 제공하기 위해 bash를 사용하면 함수를 정의 할 수 있으며 명령을 통해 해당 함수 를 서브 쉘로 내보낼 수 있습니다 export -f. 이전에는 값을 함수 정의로 설정 한 함수와 이름이 같은 환경 변수를 작성하여 구현했습니다. 그래서

$ ls () { echo 'Game Over'; }
$ export -f ls
$ echo $ls
Game Over

export -f ls라는 환경 변수가 생성 되었기 때문에 발생했습니다 ls. "게임 오버"취약점은 함수를 먼저 정의하지 않고도이 환경 변수를 직접 만들 수 있다는 것입니다. 즉, 올바른 변수 이름을 삽입 할 수 있으면 명령을 가로 챌 수 있습니다. Apple은 올바른 이름으로 변수를 작성하기 어렵게하여이 문제를 해결하려고했습니다. 공식 bash 패치 54는 실제로 변수 이름에 %허용되지 않는 문자 를 포함하여 변수 이름을 사용하여 올바른 이름으로 변수를 작성하는 것을 불가능하게하며 , 내 보낸 함수 정의를 다른 예약 된 네임 스페이스에 효과적으로 넣습니다.

위의 어느 것도 당신에게 의미가 없다면 걱정하지 마십시오. 지금은 Apple 패치를 사용하는 것이 좋습니다.

시스템 바이너리

OS X 10.9.5 (현재 최신 안정 릴리스)는 Bash v3.2.51과 함께 제공됩니다.

$ bash --version
GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.

Xcode가 설치되어 있고 라이센스를 수락하기 전에 적어도 한 번 실행 한 경우 다음과 같이 Bash 확보하고 다시 컴파일 할 수 있습니다 xcodebuild.

$ # If you want to disable auto-imported functions, uncomment the following
$ # export ADD_IMPORT_FUNCTIONS_PATCH=YES
$ mkdir bash-fix
$ cd bash-fix
$ curl https://opensource.apple.com/tarballs/bash/bash-92.tar.gz | tar zxf -
$ cd bash-92/bash-3.2
$ curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-052 | patch -p0    
$ curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-053 | patch -p0  
$ # See note above about ADD_IMPORT_FUNCTIONS_PATCH
$ [ "$ADD_IMPORT_FUNCTIONS_PATCH" == "YES" ] && curl http://alblue.bandlem.com/import_functions.patch | patch -p0
$ [ "$ADD_IMPORT_FUNCTIONS_PATCH" == "YES" ] || curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-054 | patch -p0
$ [ "$ADD_IMPORT_FUNCTIONS_PATCH" == "YES" ] || curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-055 | patch -p0
$ [ "$ADD_IMPORT_FUNCTIONS_PATCH" == "YES" ] || curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-056 | patch -p0
$ [ "$ADD_IMPORT_FUNCTIONS_PATCH" == "YES" ] || curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-057 | patch -p0
$ cd ..
$ # Note: DO NOT ADD SUDO TO XCODEBUILD HERE
$ xcodebuild
$ build/Release/bash --version # GNU bash, version 3.2.57-release
$ build/Release/sh --version   # GNU bash, version 3.2.57-release
$ sudo cp /bin/bash /bin/bash.old
$ sudo cp /bin/sh /bin/sh.old
$ sudo cp build/Release/bash /bin
$ sudo cp build/Release/sh /bin

(참고 : 위의 코드 블록을 복사하여 붙여 넣은 다음 터미널로 이동 한 다음 실행 하여이 작업을 수행 할 수 있습니다 pbpaste | cut -c 2- | sh. 인터넷에서 임의의 스크립트를 실행할 때는 항상주의하십시오 ...)

그런 다음 Bash 버전은 v3.2.57이어야합니다.

$ bash --version
GNU bash, version 3.2.57-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.

보안을 유지하고 테스트를 마친 후에 chmod -x는 이전 버전이 재사용되지 않도록하거나 백업 사이트로 옮기는 것이 좋습니다.

$ sudo chmod a-x /bin/bash.old /bin/sh.old

다른 답변에는 MacPorts 또는 Homebrew를 사용하는 사람들을위한 솔루션이 있습니다. 이들은 문제를 해결하지 않고 추가 버전의 Bash 만 설치합니다. 구체적으로 업그레이드하려면 해당 답변을 참조하십시오.

감사

bash를 돌보고이 패치를 사용할 수있게 해준 Chet에게 감사합니다. 이에 대해 의견을 말하고 시간이 지남에 따라 개선 한 다른 모든 사람들에게 감사합니다.

이제 Apple은 실제 수정 사항을 발표했지만 여전히 유용 할 수 있습니다. Lion 및 up에 대한 픽스 만 릴리스했으며 공식 패치는 GNU bash 버전 3.2.53 (1)-릴리스 (x86_64-apple-darwin13)를 제공하지만 Game over 버그는 여전히 다소 취약합니다. 이 시점에서 3.2.57에 대해 자신의 Bash 버전을 다시 빌드하는 것은 잘못하지 않는 한 Apple 패치에 의존하는 것보다 안전합니다.


18

맥 포트

그러면 취약점 (CVE-2014-6271 및 CVE-2014-7169)과 이후에 발견 된 취약점을 모두 패치 한 bash 버전 4.3.28 (1)이 제공됩니다. Macports bash를 사용하여 버전 4 기능을 사용하도록 쉘을 변경 한 경우에 유용합니다.

표준 OS 스크립트 문제를 가지고 #!/bin/sh있거나 #!/bin/bash첫 번째 줄로 해결하지는 않습니다 . 이런 종류의 문제는 Macports가 더 빨리 업데이트되는 경향이 있으므로 Macports가 Apple에서 제공 한 프로그램 버전을 사용하지 않는 이유입니다.

Homebrew 답변에서와 같이 터미널에서 이것을 사용할 수 있습니다

macports를 설치하려면 다음같은 지침 을 따르십시오
. 1. Xcode 및 Xcode 명령 행 도구 설치
2. 터미널의 Xcode 라이센스에 동의하십시오. sudo xcodebuild -license
3. OS X 버전에 맞는 MacPorts pkg 다운로드 : 링크는
4 페이지에 있습니다. pkg를 실행

macports가 설치되어 있으면 최신 버전이 필요합니다.

sudo port selfupdate

최신 바이너리를 다시 컴파일하거나 가져옵니다.

sudo port upgrade outdated

5
이것은 기존 바이너리의 보안 취약점을 수정하는 것과 관련이 있으며, 이는 취약한 바이너리를 대체 / 수정하지 않으므로, 이것이 어떻게 문제를 해결하는지 알 수 없습니다.
AlBlue

그것은 macports 버전을 여우 고-실제로 IanC의 의견을 요청했습니다
Mark

예. 우리는 bash일반적으로 OS X에서 제공되는 모든 장소에 대한 수정 사항을 나열해야합니다. 따라서 시스템 수정, Homebrew 및 MacPorts 수정. 아마도 핑크도 가능합니다. 이것이 @AlBlue의 답변을 편집하여 만든 경우 개인적으로 선호합니다. 이것이 가장 정확하고 정답입니다.
Ian C.

2
@ InaC는 답변이 다르고 하나의 큰 답변을 확인할 수 없으므로 분리해야합니다. 실제로 그들은 별도의 질문입니다
Mark

@AlBlue의 답변에 대한 편집 내용을 참조하십시오. 나는 이것들이 분리되어야한다는 것에 동의하지 않습니다.
Ian C.

17

공식 Apple OS X bash 업데이트 1.0에 대한 참고 사항 :이 소프트웨어 업데이트는 공식 Apple bash 버전 만 3.2.53으로 가져옵니다. 3.2.54 패치 개정판은 다음 변경 사항을 제공합니다.

이 패치는 쉘 변수와의 충돌을 피하고 쉘 변수로 해석할지 여부를 결정하기 위해 환경 변수의 내용에만 의존하는 것을 피하기 위해 내 보낸 함수에 사용하는 인코딩 bash를 변경합니다.

이미 3.2.54 바이너리로 시스템을 패치 한 사용자의 경우 컴파일 된 바이너리를 Apple 패치로 바꾸거나 그대로 둘 수 있지만 잘못 권장됩니다. Apple은 바이너리 버전을 3.2.53으로 유지 했지만 Apple 패치 DOES에는 아래 악용 테스트에 대한 수정 사항이 포함되어 있습니다.

env X='() { (a)=>\' sh -c "echo date"; cat echo

즉, Apple 공식 3.2.53 바이너리에는 vanilla GNU 3.2.54 바이너리와 동등한 보안이 포함됩니다. 불행한 혼란의 지점이지만 그것이 바로 그 것입니다. 애플의 수정은 반 구워지지 않았습니다. 문제를 완전히 해결 한 것으로 보입니다. 따라서 바닐라 bashshGNU 소스 를 컴파일하기위한 아래의 로드맵 은 역사적인 유물로 간주되어야하며 필요할 경우 패치를 수행하는 방법에 대한 템플릿으로 참조해야합니다.

참고 : vanilla GNU 소스의 sh경우 Adobe Flash와 같은 다양한 설치 프로그램에서 오류를 발생시키는 권한 상승 문제가 있습니다. Apple에서 패치 한 바이너리를 사용하는 것이 좋습니다. 이 패치 체계는 더 이상 사용되지 않으며 잘못 권장됩니다.

다음 수정 사항을 설명하는 새로운 GNU bash 3.2.55 패치가 있습니다.

버그 설명 :

parse.y에는 두 개의 로컬 버퍼 오버플로가있어 단일 명령 또는 많은 중첩 루프에 첨부 된 여기에 많은 문서가 제공 될 때 셸에서 코어를 덤프 할 수 있습니다.

Apple이 공식적으로 패치 한 바이너리와 함께 앉아 있거나 새로운 익스플로이 트를 처리하기 위해 자신의 롤업을 할 것인지 결정하기 위해 독자에게 맡깁니다. 개인적으로 저는 Apple 바이너리를 고수 할 것입니다.


이 게시물은 바닐라 bashshOS X 를 컴파일하고 설치하는 방법을 자세히 설명합니다. Apple 고유의 소스를 사용하여 자세히 설명하는 다음 예제에서 올바른 패치 개정판을 남기지 않았 으므로이 경로를 선택했습니다. YMMV. 그러나이 바닐라 설치는 OS X 바이너리를 대체하여 Apple이 마침내 보안 업데이트를 출시 할 때 적절한 바닐라 대체품으로 대체됩니다.

내 기본 구성은 다음과 같습니다

모든 명령 줄 유틸리티가 설치된 OS X Lion 10.7.5 및 Xcode 4.6.3.

이 문제를 해결하기위한 단계는 다음과 같습니다.

3.2.48 용 기본 bash 소스 코드를 다음에서 다운로드하십시오.

https://ftp.gnu.org/gnu/bash/bash-3.2.48.tar.gz

다음에서 bash3.2.49, .50, .51, .52, .53, .54 및 .55 패치를 다운로드하십시오.

https://ftp.gnu.org/gnu/bash/bash-3.2-patches/

bash3.2.50.patch와 같이 $ filename.patch로 저장했습니다.

다운로드 디렉토리에 CD를 넣고 ...

기본 소스 분기의 압축을 푸십시오.

tar xzvf bash-3.2.48.tar.gz

cd bash-3.2.48

앞에서 설명한대로 다운로드 한 패치 파일의 이름을 변경했다고 가정하면,

cp ../*.patch .

그런 다음…

for file in *.patch ; do
  patch -p0 < $file
done

다양한 파일의 패치가 성공적으로 표시되어야합니다. 그렇지 않은 경우 탐색 및 조사를 수행 할 준비를하십시오.

다음:

sudo cp /bin/bash /bin/bash_old
sudo cp /bin/sh /bin/sh_old
sudo chmod -x /bin/bash_old
sudo chmod -x /bin/sh_old

기본적으로 오래된 취약한 bash 및 sh 셸을 백업하고 실행 권한을 제거했습니다. 그러면 필요에 따라 명령을 복원 할 수 있지만 그 동안 손상을 줄 수있는 기능은 제거됩니다.

다음:

./configure --prefix=/ ; make ; sudo make install

새 bash 바이너리를 / bin에 올바르게 구성, 컴파일 및 설치해야합니다. 완료되면 터미널을 종료하고 다시 엽니 다.

행복하고 웃는 모든 것들이 bash --version3.2.55를 볼 수 있어야합니다 . 예를 들면 :

Gaia:Downloads trane$ bash --version
GNU bash, version 3.2.55(1)-release (i386-apple-darwin11.4.2)
Copyright (C) 2007 Free Software Foundation, Inc.

위 명령의 정확한 출력은 OS X 버전에 따라 다릅니다.

또한 취약점을 테스트하여 bash문제가 없는지 확인할 수 있어야합니다.

참고 : 지금까지 bash 만 수정했지만 /bin/sh실행 파일은 여전히 ​​취약한 상태입니다. 단순히 복사 bash꼭대기에하는 sh일을 리눅스 스타일입니다. OS X의 sh구현은와 약간의 차이가 bash있으므로 컴파일러를 다시 끌어 내고 싶을 것입니다. OS X의 차이점 bashsh차이점 에 대한 자세한 내용은 여기를 참조하십시오.

https://apple.stackexchange.com/a/89327/91441

다운로드 디렉토리에서 다음을 수행하십시오.

make clean

좋아하는 편집기에서 파일을 열고 Makefile.in바이너리 우리의 출력이되도록 우리는 프로그램 라인을 변경하는거야 99 행으로 스크롤 sh대신 bash과 같이 :

Program = sh$(EXEEXT)

저장 한 다음

./configure --prefix=/ --enable-xpg-echo-default --enable-strict-posix-default
make ; sudo make install

이제 shApple과 거의 똑같이 만들었습니다 .

마지막 참고 사항 : 일부 (전체?) 시스템에서 Apple은 일반적으로 bashbug실행 파일 을에 배치하는 것 같습니다 /usr/bin. 우리의 컴파일은 그것을 넣을 것이다 /bin. 마지막 단계는 다음과 같습니다.

sudo mv /usr/bin/bashbug /usr/bin/bashbug_old
sudo chmod -x /usr/bin/bashbug_old
sudo mv /bin/bashbug /usr/bin/bashbug

1
삐걱 거리는 소리가 나지 않지만 질문이 "배시를 다시 컴파일하는 방법"이고 내 대답이 "그 질문에 대한 답변에 대한 다음 링크를 클릭하면 요약 요구 사항이있는 것 같습니다.
Trane Francks

2
bash에 포함 된 readline 라이브러리는 10.6과 호환되지 않습니다. 대신 GNU readline을 설치 한 다음 bash makefile을 해킹하여 사용하십시오. readline을 설치하십시오. ftp.cwru.edu/pub/bash/readline-6.3.tar.gz bash의 구성을 수행 한 후 Makefile에서 READLINE_LIB = /usr/local/lib/libreadline.a클린 컴파일을 설정 하고 수행하십시오. 그런 다음 벗기고 위에 새로운 bash는 바이너리를 복사 /bin/bash하고/bin/sh
세스 노블

2
부록 : bash Makefile에서을 설정해야합니다 HISTORY_LIB = /usr/local/lib/libhistory.a. 그렇지 않으면 bash는 / usr / local 버전의 libhistory에 동적으로 연결됩니다.
세스 노블

1
Apple 오픈 소스 페이지에서 다운로드 할 수있는 버전에는 OSX에서 작동하도록 사용자 정의 된 변경 사항이 있습니다. 바닐라 업스트림 배쉬를 사용하지 않는 것이 좋습니다. 그렇지 않으면 비슷한 것을 대체하지 않습니다.
AlBlue

1
Apple은 시스템에서 오픈 소스 유틸리티를 최적화하기 위해 많은 사항을 변경합니다. 즉 bash, 커널이 다르기 때문에 바닐라 가 어떻게 행동하지 못하는지 알 수 없습니다 . 어쨌든 나는 나의 해결책이 일시적이라고 생각한다. 결국에 컴파일에 대한 내 주된 이유이다 (애플은이 문제를 패치 주위에 얻을 것이다 내 컴파일 된 바이너리가 대체됩니다 /bin처음에.
트레인 Francks

15

9 월 29 일 기준으로 소스에서 컴파일하는 데 어려움을 겪고있는 모든 사람을 위해 Apple은 공식적으로 Mac OS X 10.9.5, 10.8.5 및 10.7.5 용 패치를 출시했습니다.


1
감사! 많은 / 대부분의 재 컴파일보다 쉬울 수 있습니다.
AlBlue

@AlBlue 동의합니다. 또한 패치가 완전히 깨끗하지는 않지만 일부 패치에서 지적했듯이 이것은 아무것도 아닌 것보다 훨씬 낫습니다. 그리고 공황 상태에서 소스 코드를 컴파일하는 초보자보다 훨씬 안전합니다.
JakeGould

2
평소와 같이 소프트웨어 업데이트 전파 지연이 완전히 적용됩니다. 패키지가 표시되는 데 시간이 얼마나 걸리는지 궁금합니다. 애플이이 문제에 매우 빠르게 대응했다는 것을 알게 된 것은 상쾌합니다!
Trane Francks 2014 년

2
@TraneFrancks“일반적으로 Software Update 전파 지연이 완전히 적용됩니다.”저는 U2의 전체 앨범을 모든 iOS 사용자에게 푸시하는 조직이 어떻게 든 4MB 미만의 보안 업데이트로 질식 할 수 있는지 이해하지 못합니다.
JakeGould

@JakeGould : Heh. 네, 낄낄 거립니다. 이 Lion 시스템에서 소프트웨어 업데이트를 확인한 결과 시스템이 최신 상태라고 주장합니다. 다른 Mountain Lion 시스템과 동일합니다.
Trane Francks

5

먼저,이 취약점에 대해 bash 및 sh를 패치하면 Mac의 일부 스크립트가 손상 될 수 있습니다. Mac에서 직접 공용 인터넷에 웹 서비스를 제공하지 않는 한이 작업을 수행 할 필요가 없습니다. 따라서 실제로 필요하지 않은 경우 Apple의 공식 보안 업데이트가있을 때까지 기다리십시오.

경고 : Mavericks 10.9에서 Brew를 사용하여이 업데이트를 수행하는 방법에 대한 지침이 있습니다.

먼저 오래된 bash를 사용하고 있는지 확인하십시오.

$ which bash
/bin/bash
$ /bin/bash --version
GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.

가장 최근 배쉬는 4.3.25입니다

Xcode가 설치되어 있지 않으면 다음과 같이 설치할 수있는 Xcode 명령 줄 도구가 필요합니다.

$ xcode-select --install

또는 개발자 포털에서 .

Brew를 설치하려면 ( http://brew.sh ) :

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

그런 다음 수행하십시오.

$ brew doctor

문제가 있으면 지시 사항을 따르십시오. 많은 일반적인 문제 가 여기에서 해결됩니다 .

그런 다음 brew를 최신 패키지 목록으로 업데이트하십시오.

$ brew update

최신 bash 4.3.25를 얻으려면 :

$ brew install bash

이것은 bash를 /usr/local/Cellar/bash/4.3.25/bin/bash

이전 bashsh여전히이 존재 /bin하므로 설치 한 후 새 파일로 된 실행 파일의 이름을 바꿀 수 있습니다.

$ sudo mv /bin/bash /bin/bash_old
$ sudo mv /bin/sh /bin/sh_old

편집증이 매우 심하면 실행 권한을 제거 할 수 있습니다. bash_old

$ sudo chmod a-x /bin/bash_old /bin/sh_old

그런 다음 BREW가 설치된 새 bash 4.3.25에 대한 심볼릭 링크를 만듭니다.

$ sudo ln -s /usr/local/Cellar/bash/4.3.25/bin/bash /bin/bash
$ sudo ln -s /usr/local/Cellar/bash/4.3.25/bin/bash /bin/sh

재부팅하면 완료됩니다.

경고 — 이것은 bash 3.2 또는 Mac sh과 Linux 의 차이점에 의존하는 일부 기존 쉘 스크립트를 손상시킬 수 있습니다 sh. 동일한 스레드에서 @TraneFranks의 답변에서 소스와 bash 및 sh를 대체하는 훨씬 더 정교한 답변이 있습니다.


4
3.2.51에서 3.2.52로 패치하면 4.3.anything으로 업그레이드하는 것보다 피해가 적습니다.
AlBlue

필자는 일부 스크립트를 깨뜨릴 수 있다고 경고하지만 Brew가 현재 설치 한 버전은 4.3.25입니다. 처음부터 새로 설치하기 쉬운 버전을 제공하려고합니다. 또한 이전 실행 파일의 이름을 바꾸면 언제든지 복원 할 수 있습니다.
Christopher Allen

2
이 버그는 악의적 인 DHCP 서버 (예 : WiFi 핫스팟)에 의해 악용 될 수 있으며 컴퓨터를 완전히 전복시킬 수 있으므로 최대한 빨리 수정해야합니다. 다른 답변 교체에 대한 더 나은 교육을 /bin/bash하고 /bin/sh그 가능성 브루의 최신 배쉬로 업그레이드보다 적은 문제가 발생합니다.
Old Pro

Mac은 DHCP 공격에 취약하지 않을 수 있습니다.
Christopher Allen

10
DCHP 서버 공격은 DHCP 클라이언트가 OSX 구현이 아닌 Bash 스크립트를 사용하는 경우에만 가능합니다.
AlBlue

5

OS X 10.6.8-스노우 레오파드

@AlBlue의 게시물은 매우 완전합니다. 그러나 내 OS X 10.6.8 서버에서는 그의 수정이 작동하지 않습니다. Apple은 10.6.8에 대한 수정 사항이 없으며 @AlBlue가 설명하는 단계는 Xcode 3.2.6 (Snow Leopard의 최신 버전)에서 작동하지 않습니다. 오류가 발생했습니다.

** BUILD FAILED **

The following build commands failed:
sh:
    CodeSign /Users/bas/bash-fix/bash-92/build/Release/sh
bash:
    CodeSign /Users/bas/bash-fix/bash-92/build/Release/bash
(2 failures)

이런 이유로 나는 brew.sh 사용 하고 있습니다. OS X 10.6.8 Snow Leopard에 대한 더 나은 솔루션이 있으면 의견을 보내주십시오. @Jerome의 의견도 참조하십시오. 그는 @AlBlue의 솔루션을 사용하여 OS X 10.6.8 Snow Leopard에서 성공적인 패치를 받았습니다. 어쨌든:

먼저 다음 oneliner로 추출기를 설치하십시오.

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

최신 정보 brew

brew update

이제 최신 버전을 설치 bash하고 현재 버전을 교체하십시오.

brew install bash
sudo sh -c 'echo "/usr/local/bin/bash" >> /etc/shells'
chsh -s /usr/local/bin/bash
sudo mv /bin/bash /bin/bash-backup
sudo ln -s /usr/local/bin/bash /bin/bash

Command (complete path)환경 설정에서 Terminal.app에 대한 기본 로그인 쉘 ' '을 설정할 수 있습니다 ( Command,) 여기에 이미지 설명을 입력하십시오


참고 : 의견에서 일부 사용자는이 방법이 적합하다고 생각하지 않습니다. 그러나 이것은 OS X 10.6.8 Snow Leopard에서 BASH를 업그레이드하는 유일한 방법입니다.


1
일부 스크립트는 배쉬 3에 의존 작동하지 않습니다 내가 집에 양조가 업데이트이라고 가정 떠들썩한 파티 4 (MacPorts를 bash는 4.3.25을 고정하고있다
마크

2
업데이트 sh도 하지 않습니다. 업데이트 도해야합니다. /bin/sh! = /bin/bash. /bin/sh시스템 명령을 실행할 때 많은 도구가 사용됩니다. system()예를 들어, Ruby의 호출 /bin/sh은 문자열에서 확장해야하는 쉘 확장 문자가있을 때 사용 합니다. 시스템 바이너리 IMO를 업데이트하기 위해 Homebrew를 사용하여지는 게임을하고 있습니다. 시스템 바이너리를 올바르게 업데이트하는 bash 것 외에도 Homebrew를 업데이트해야 합니다.
Ian C.

1
OSX 10.8 및 10.9는 Bash 3.2를 사용하므로 직접적인 일관성을 위해 3.2를 버전으로 사용했습니다. 이것은 또한 이전 버전에 대한 Apple의 공식 빌드를 기반으로하며, 여기에는 확장 된 속성 인식 등과 같은 추가 기능이 포함될 수 있습니다.
AlBlue

1
모든 인스턴스에서 3.2.6을 실행 중입니다. 실행할 때 빌드가 실패한다는 것을 알고 xcodebuild있습니까? 그렇다면 나는 그것을 경험하지 못했습니다. bash 빌드가 여러 개 있는지 확인하고 정리 (brew 제거)를 고려하고 xcode를 다시 설치하십시오 ... 그런 다음 패치 프로세스를 새로 시작하십시오.
Jerome

1
내가 했어 심각한 손으로 내장 재고 강타 - 4.3 스노우 레오파드 (Snow Leopard)에 (I 이맥스를 시작하고 다음을 중단하면, 내가 'FG'로 복귀 할 수 없습니다)와 작업 제어 문제를. 나는 이후에서 bash에 대한 스노우 레오파드 (Snow Leopard) 소스를 다운로드 한 opensource.apple.com/release/mac-os-x-1068 에서 패치를 적용 ftp.gnu.org/gnu/bash/bash-3.2-patches , 및에 재건 훨씬 더 나은 효과.
mormegil

-6

여기의 지시를 따를 수 : https://github.com/tjluoma/bash-fix는 기본적으로, 터미널에서 다음을 수행합니다 :

curl -s https://raw.githubusercontent.com/tjluoma/bash-fix/master/bash-fix.sh | zsh -f

5
임의의 github 계정에서 임의의 셸 스크립트를 실행하는 것이 어떤 컴퓨터에서도보다 안전한 상황을 얻는 방법이 아닙니다. 엔드 포인트를 신뢰하려고합니다.
Ian C.

나는 이안에게 동의해야한다. 이러한 CVE가 설명하는 문제와 같이 신뢰할 수없는 쉘 스크립트를 통해 극적인 피해를 입히는 것은 정말 쉽습니다.
Trane Francks

이러한 FUD 확산에 크게 반대합니다. 모든 쉘 스크립트를 실행하기 전에 https : //에서만 읽으십시오.
dhchdhd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.