Bash 3.2 (OS X에서 제공하는 버전)가 "Shell Shock"( CVE-2014-6271 및 CVE-2014-7169 ) 로 알려진 원격 실행 익스플로잇에 취약한 경우 Bash를 다시 빌드하고 시스템을 안전하게 보호하는 방법 공식 애플 패치?
업데이트 : Apple은 이제 공식 패치를 발표했습니다. 자세한 내용은 아래 를 참조하십시오.
Bash 3.2 (OS X에서 제공하는 버전)가 "Shell Shock"( CVE-2014-6271 및 CVE-2014-7169 ) 로 알려진 원격 실행 익스플로잇에 취약한 경우 Bash를 다시 빌드하고 시스템을 안전하게 보호하는 방법 공식 애플 패치?
업데이트 : Apple은 이제 공식 패치를 발표했습니다. 자세한 내용은 아래 를 참조하십시오.
답변:
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의 취약한 버전입니다.
가 발생했습니다 원래의 게시물에 대한 업데이 트 (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를 사용하기 전에 NetBSD 와 FreeBSD 는 기본적으로 자동 가져 오기 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 및 향후 패치가 비활성화 됩니다.
트위터 에서 @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 패치에 의존하는 것보다 안전합니다.
그러면 취약점 (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
bash
일반적으로 OS X에서 제공되는 모든 장소에 대한 수정 사항을 나열해야합니다. 따라서 시스템 수정, Homebrew 및 MacPorts 수정. 아마도 핑크도 가능합니다. 이것이 @AlBlue의 답변을 편집하여 만든 경우 개인적으로 선호합니다. 이것이 가장 정확하고 정답입니다.
공식 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 바이너리와 동등한 보안이 포함됩니다. 불행한 혼란의 지점이지만 그것이 바로 그 것입니다. 애플의 수정은 반 구워지지 않았습니다. 문제를 완전히 해결 한 것으로 보입니다. 따라서 바닐라 bash
와 sh
GNU 소스 를 컴파일하기위한 아래의 로드맵 은 역사적인 유물로 간주되어야하며 필요할 경우 패치를 수행하는 방법에 대한 템플릿으로 참조해야합니다.
참고 : vanilla GNU 소스의 sh
경우 Adobe Flash와 같은 다양한 설치 프로그램에서 오류를 발생시키는 권한 상승 문제가 있습니다. Apple에서 패치 한 바이너리를 사용하는 것이 좋습니다. 이 패치 체계는 더 이상 사용되지 않으며 잘못 권장됩니다.
다음 수정 사항을 설명하는 새로운 GNU bash 3.2.55 패치가 있습니다.
버그 설명 :
parse.y에는 두 개의 로컬 버퍼 오버플로가있어 단일 명령 또는 많은 중첩 루프에 첨부 된 여기에 많은 문서가 제공 될 때 셸에서 코어를 덤프 할 수 있습니다.
Apple이 공식적으로 패치 한 바이너리와 함께 앉아 있거나 새로운 익스플로이 트를 처리하기 위해 자신의 롤업을 할 것인지 결정하기 위해 독자에게 맡깁니다. 개인적으로 저는 Apple 바이너리를 고수 할 것입니다.
이 게시물은 바닐라 bash
와 sh
OS 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 --version
3.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의 차이점 bash
과 sh
차이점 에 대한 자세한 내용은 여기를 참조하십시오.
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
이제 sh
Apple과 거의 똑같이 만들었습니다 .
마지막 참고 사항 : 일부 (전체?) 시스템에서 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
READLINE_LIB = /usr/local/lib/libreadline.a
클린 컴파일을 설정 하고 수행하십시오. 그런 다음 벗기고 위에 새로운 bash는 바이너리를 복사 /bin/bash
하고/bin/sh
HISTORY_LIB = /usr/local/lib/libhistory.a
. 그렇지 않으면 bash는 / usr / local 버전의 libhistory에 동적으로 연결됩니다.
bash
, 커널이 다르기 때문에 바닐라 가 어떻게 행동하지 못하는지 알 수 없습니다 . 어쨌든 나는 나의 해결책이 일시적이라고 생각한다. 결국에 컴파일에 대한 내 주된 이유이다 (애플은이 문제를 패치 주위에 얻을 것이다 내 컴파일 된 바이너리가 대체됩니다 /bin
처음에.
9 월 29 일 기준으로 소스에서 컴파일하는 데 어려움을 겪고있는 모든 사람을 위해 Apple은 공식적으로 Mac OS X 10.9.5, 10.8.5 및 10.7.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
이전 bash
과 sh
여전히이 존재 /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를 대체하는 훨씬 더 정교한 답변이 있습니다.
/bin/bash
하고 /bin/sh
그 가능성 브루의 최신 배쉬로 업그레이드보다 적은 문제가 발생합니다.
@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를 업그레이드하는 유일한 방법입니다.
sh
도 하지 않습니다. 업데이트 도해야합니다. /bin/sh
! = /bin/bash
. /bin/sh
시스템 명령을 실행할 때 많은 도구가 사용됩니다. system()
예를 들어, Ruby의 호출 /bin/sh
은 문자열에서 확장해야하는 쉘 확장 문자가있을 때 사용 합니다. 시스템 바이너리 IMO를 업데이트하기 위해 Homebrew를 사용하여지는 게임을하고 있습니다. 시스템 바이너리를 올바르게 업데이트하는 bash
것 외에도 Homebrew를 업데이트해야 합니다.
xcodebuild
있습니까? 그렇다면 나는 그것을 경험하지 못했습니다. bash 빌드가 여러 개 있는지 확인하고 정리 (brew 제거)를 고려하고 xcode를 다시 설치하십시오 ... 그런 다음 패치 프로세스를 새로 시작하십시오.
여기의 지시를 따를 수 : https://github.com/tjluoma/bash-fix는 기본적으로, 터미널에서 다음을 수행합니다 :
curl -s https://raw.githubusercontent.com/tjluoma/bash-fix/master/bash-fix.sh | zsh -f