
RootPipe (CVE-2015-1130) 및 Phoenix (CVE-2015-3673) 취약점 테스트 유틸리티 (Mac OS X 10.2.8 이상)

RootPipe Tester는 Mac(Mac OS X 10.2.8 이상, PowerPC 및 Intel 모두)에서 실행되는 작은 응용프로그램으로, RootPipe(CVE-2015-1130) 및 Phoenix(CVE-2015-3673) 취약점을 사용하여 권한 상승을 시도합니다.
Mac이 취약한지 여부는 실행 중인 Mac OS X 버전에 따라 달라지지만, 설정한 환경 설정에도 영향을 받습니다.
RootPipe Tester를 통해 광범위한 테스트와 시도 없이도 취약한지 여부를 확인할 수 있는 원클릭 솔루션을 만들었습니다.
이 저장소의 릴리스 페이지에서 디스크 이미지를 다운로드하거나, 원한다면 직접 컴파일하십시오.
디스크 이미지를 마운트하고 그 안에 있는 응용프로그램을 실행하십시오(디스크 이미지에서 RootPipe Tester를 실행해도 안전합니다).
"Start Test"를 클릭하고 테스트가 완료될 때까지 기다리십시오(창 제목의 "Running…"으로 완료 여부를 알 수 있습니다).
정확한 결과를 얻으려면 Mac을 재부팅하고 "새 로그인" 상태에서 다시 테스트를 실행하는 것이 좋습니다.
테스트 실행 중 하나라도 취약한 시스템이 감지되면 PANIC 섹션을 확인하십시오.
아니요! 진정하고 시스템 버전에 맞는 안내를 읽으십시오.
참고: 사용자 인증에서 취약하지 않음은 시스템이 액세스를 허용하지 않거나 관리자 사용자로 인증하라는 대화 상자를 표시한다는 의미입니다.
어느 정도 이것도 권한 상승입니다. admin 그룹은 root만큼 많은 권한을 가지고 있지 않지만, 기본 sudo 구성에서 "admin" 그룹의 모든 사용자는 비밀번호를 입력하여 root를 얻을 수 있으므로, 단순히 sudo를 실행하여 동일한 효과를 얻을 수도 있습니다.
가능한 한 빨리 10.10.3으로 업그레이드하여 시스템이 writeconfig 바이너리에 대한 entitlements를 올바르게 적용하도록 하십시오. (적어도 Apple은 그렇게 말합니다)
어떤 이유로 10.10.3으로 업그레이드할 수 없다면 OS X 10.9 Mavericks 섹션을 확인하십시오.
Mavericks는 공격자가 nil 인증으로 통과할 수 있게 하므로 이전 Mac OS X 버전보다 훨씬 더 어려운 상황에 있습니다.
can_I_suid를 살펴보는 것이 좋습니다.
테스트 결과:
취약함
보안 환경설정 패널에서 "각 시스템 환경설정 패널을 잠금 해제하려면 암호 필요"를 활성화해야 합니다.
테스트 결과:
취약하지 않음
축하합니다! 가장 안전한 Mac OS X 버전 중 하나를 사용하고 있습니다(적어도 RootPipe와 관련해서는).
이 시스템에서는 보안 환경설정 패널의 "각 시스템 환경설정 패널을 잠금 해제하려면 암호 필요"(Tiger의 경우 "각 보안 시스템 환경설정을 잠금 해제하려면 암호 필요")가 제대로 작동하며 반드시 활성화해야 합니다!
참고: "암호 필요" 체크박스가 해제된 경우 시스템은 매번 로그인할 때마다 보안 환경설정 패널을 잠금 해제합니다. 관리자 계정을 사용하는 경우 각 로그인 후 시스템 환경설정에서 잠금을 수동으로 닫을 때까지 시스템이 취약해집니다.
테스트 결과:
취약하지 않음
이후 시스템과 달리 Panther에서는 보안 환경설정 패널의 "각 보안 시스템 환경설정을 잠금 해제하려면 암호 필요" 체크박스가 이 취약점이 작동하는 것을 완전히 막지 못합니다. 그래도 체크하는 것을 권장합니다.
시스템을 보호하려면 강력히 표준 사용자 계정만 사용하고, 시스템 환경설정에서 환경설정을 변경한 후 항상 수동으로 "잠금을 닫을" 것을 권장합니다.
시스템 환경설정을 그냥 닫는 것만으로는 인증이 제대로 무효화되지 않으며, 표준 사용자로서 시스템 환경설정 GUI에 닫힌 자물쇠가 표시되더라도 이 취약점은 로그아웃할 때까지 작동합니다.
테스트 결과:
취약하지 않음
이후 시스템과 달리 Jaguar는 "각 보안 시스템 환경설정을 잠금 해제하려면 암호 필요" 체크박스를 제공하지 않지만, 모든 관리자 사용자에 대해 로그인 시 보안 환경설정 패널을 잠금 해제합니다.
시스템을 보호하려면 강력히 표준 사용자 계정만 사용할 것을 권장합니다.
참고: Jaguar는 시스템 환경설정이 종료될 때 보안 환경설정 패널을 잠그지 않으므로 항상 수동으로 잠그십시오. 그렇게 하지 않으면 로그아웃할 때까지 취약점이 작동합니다.
참고: 표준 사용자 계정으로 전환할 수 없는 경우 로그인 항목으로 보안 환경설정 패널을 잠그는 간단한 AppleScript로 해결할 수 있습니다.
참고: 일반 버전의 RootPipe Tester는 Jaguar에서 실행되지 않습니다. Jaguar에서 실행하려면 RootPipe Tester의 레거시 버전을 다운로드하십시오.
레거시 버전의 RootPipe Tester는 기능적으로 일반 버전과 동일하지만 GCC 4.0 대신 GCC 3.1을 사용하여 컴파일되었습니다.
테스트 결과:
취약하지 않음
Puma에 대한 취약점은 가능해 보입니다. 시스템 환경설정을 인증하는 동일한 단계를 사용하고 필요한 대부분의 구성 요소가 있기 때문입니다.
취약점을 방해하는 유일한 점은 Puma에 이후 버전에서 인증에 사용되는 SecurityFoundation.framework가 없다는 것입니다. 대신 NIInterface.framework라는 PrivateFramework를 사용하는데, 이를 먼저 리버스 엔지니어링해야 합니다.
어쨌든 좋은 소식: 거의 존재하지 않는 사용자 기반을 공격하는 데 시간을 투자할 사람은 아무도 없습니다.
보안을 강화하려면 표준 사용자 계정만 사용하고 수동으로 보안 환경설정 패널을 잠그는 것을 여전히 권장합니다.
참고: 이 내용은 확실하지 않습니다. 실제로 무슨 일이 일어나는지 알아내기 위해 최선을 다했지만, 모든 것이 PrivateFramework이기 때문에 이 메서드들이 정확히 무엇을 하는지, 특히 제가 다루려는 Mac OS X의 여러 버전에 걸쳐 100% 알 수는 없습니다.
RootPipe 취약점이 작동하는 방식은 기본적으로 시스템 환경설정이 설정 파일을 쓰는 방식(따라서 WriteConfig라는 이름)과 동일하지만, 이 취약점의 사용자는 시스템 환경설정 애플리케이션이 아니어야 한다는 차이점이 있습니다.
지금까지는 그렇게 끔찍하지 않으며, 실제로 전체 취약점도 그렇게 끔찍하지 않습니다.
하지만 코드를 살펴보겠습니다.
// Authorization
SFAuthorization auth = [SFAuthorization authorization];
id authenticator = [Authenticator sharedAuthenticator];
[authenticator authenticateUsingAuthorizationSync:auth];
// Profit?
id sharedLiaison = [ToolLiaison sharedToolLiaison];
id tool = [sharedLiaison tool];
보시다시피 이것은 "구식" 코드이지만, 새 스타일의 원리는 거의 동일합니다.
이 코드 조각의 처음 세 줄은 인증이고 마지막 두 줄이 실제 재미있는 부분입니다.
시스템 환경설정의 환경설정 패널이 권한이 필요한 작업을 수행해야 하는 경우, 왼쪽 하단에 SFAuthorizationView(자물쇠 기호)를 배치합니다. 이 SFAuthorizationView는 system.preferences 권한의 획득 및 폐기를 처리합니다.
여기까지는 좋습니다만, 이 system.preferences는 무엇일까요?
Apple이 사용하는 권한과 구성 방식은 시간이 지남에 따라 변경되었지만, 원칙은 동일하게 유지되었습니다. 아래에서 Authorization Services Policy Database의 일부를 볼 수 있습니다.
10.5.8의 system.preferences
{
"allow-root" = 1;
class = user;
comment = "Checked by the Admin framework when making changes to certain System Preferences.";
group = admin;
shared = 1;
}
보시다시피 공유 권한입니다. 즉, 이 권한이 한 번 획득되면 어떤 프로세스든 세션이 종료될 때까지(로그아웃 시) 사용할 수 있습니다.
이 자체로는 그렇게 나쁘지 않습니다. 애플리케이션이 처음으로 system.preferences를 사용하려면 인증을 받아야 하기 때문입니다. 불행히도 시스템은 로그인 시 (관리자 사용자의 경우) 자동으로 인증을 수행합니다.
이는 RootPipe Tester가 인증을 받을 필요 없이 시스템의 인증을 사용할 수 있다는 것을 의미합니다.
표준 사용자는 시스템이 로그인 시 system.preferences 권한을 인증하지 않기 때문에 안전합니다.
적절한 인증을 획득하면 임의의 권한으로 설정 파일(또는 다른 파일)을 쓰는 것은 매우 쉬운 게임이 됩니다.
ToolLiaison은 기꺼이 writeconfig에 대한 NSDistantObject를 설정해 주고, writeconfig는 기꺼이 파일을 써 줍니다. 왜냐하면 그들의 관점에서는 사용자가 제대로 인증했기 때문입니다.
시스템 환경설정에서 "각 시스템 환경설정 패널을 잠금 해제하려면 암호 필요" 체크박스를 선택하면 Mac OS X 10.4 ~ 10.8의 모든 버전에서 RootPipe가 수정됩니다.
이 체크박스를 선택하면 system.preferences 권한이 수정되어 shared가 false로 설정됩니다.
권한이 공유되지 않으면 각 프로세스가 자체 인증을 받아야 합니다. 인증을 받으려면 사용자가 관리자의 비밀번호를 입력해야 하므로 공격을 사용자가 인지할 수 있습니다.
또한 단순히 sudo를 실행하는 것도 동일한 효과를 가지므로 이 공격은 무용지물이 됩니다.
그렇지 않습니다. 언뜻 보기에는 PrivateFramework에서 root로 실행되면서 적절한 인증을 수행하지 않기 때문에 백도어처럼 보일 수 있습니다.
그러나 실제 문제는 설계 결함에 가깝습니다. Apple은 모든 관리자 사용자가 시스템 환경설정을 완전히 사용할 수 있도록 보장하려고 했고, Unix에서는 모든 것이 설정 파일을 필요로 하며 이러한 파일은 (대부분 root로) 기록되어야 합니다.
누군가는 이것이 나쁜 생각이라고 주장할 수 있습니다(저도 동의합니다)만, 인증이 제대로 작동하고 모든 관리자가 어차피 sudo를 통해 root를 얻을 수 있기 때문에 백도어라고 생각하지는 않습니다.
주된 문제는 Apple이 보안보다 편의성을 중시한 것이지만, 이것이 그들에게 특별히 특별한 일은 아닙니다.