Apple Silicon - 하드웨어 기반 보안 기능 리뷰
얼마전 애플에서는 WWDC 2020을 통해서 Apple Silicon을 발표하였습니다. Apple Silicon은 Mac 기종들에서 자체 생산된 System-on-Chip (SoC)을 사용하는 것을 골자로 합니다. 이러한 새로운 칩으로의 전환을 통해서 애플 랩탑과 데스크탑 라인에 큰 변화가 생길 것으로 보입니다. CPU와 GPU task들을 위해서 하나의 통합된 메모리 아키텍쳐를 사용하여 맥 어플리케이션의 퍼포먼스 향상이 있을 예정입니다. Apple Silicon과 함께 그 동안 소프트웨어적으로 처리 되거나 존재하지 않았던 몇가지 보안 기능이 추가 되었습니다. 이 아티클에서는 이러한 몇가지 보안상의 기능 향상에 대해서 간략하게 분석해 보겠습니다.
보안과 관련된 추가 사항은 다음 영상의 6:44부터 참조하시기 바랍니다.
Explore the new system architecture of Apple Silicon Macs
W^X: Write XOR Execute
커널 보안에 있어서 중요한 컨셉 중의 하나가 W^X (Write XOR Execute) 컨셉입니다. 이 컨셉은 커널 메모리가 쓰기 (Write) 가능한 경우에는 실행 (Execute) 가능하지 않아야 하고, 실행 가능한 경우, 쓰기가 가능하지 않아야 한다는 것입니다. 이러한 원칙은 생각보다 지키기 어려워서 윈도우즈의 경우에도 지속적으로 W^X 원칙에 위반되는 커널 메모리 할당 행위들을 제거해 나가고 있습니다. W^X는 주로 쉘코드 등을 커널 등에 올려서 실행하려는 등의 행위, 악성 코드들이 올라가서 실행되지 않게 하기 위한 방법으로 사용됩니다.
이러한 개념은 유저 어플리케이션의 경우에는 더더욱 지키기가 어려워서, 윈도우즈의 경우에는 Arbitrary Code Guard (ACG)라는 개념을 도입하여 특정 프로세스에 대해서 쓰기 가능하면서 실행 가능한 메모리를 만들지 못하도록 제한을 거는 mitigation을 도입하기도 하였습니다. 예를 들어 Edge 브라우저의 경우 마이크로소프트 어플리케이션 중 최초로 ACG 를 디폴트 설정으로 세팅한 경우로서 Mitigating arbitrary native code execution in Microsoft Edge에서 좋은 성공 사례로 소개 되고 있습니다. 이는 어플리케이션 레벨에서 ACG에 호환되는 어플리케이션을 만드는 것이 얼마나 어려운지를 잘 보여 준다고 볼 수 있습니다.
특히 JIT 코드의 경우 많은 경우에 RWX 메모리를 생성하는 경우가 많기에 이러한 케이스는 모두 별도의 프로세스로 분리하는 과정이 필요합니다. 애플의 경우 Porting Just-In-Time Compilers to Apple Silicon 문서를 통하여 이러한 케이스를 pthread_jit_write_protect_np 함수를 사용하여 어떻게 새로운 Apple Silicon 아키텍쳐에 맞게 포팅해야 하는지를 잘 보여 주고 있습니다.
기존, 윈도우즈 플랫폼에서의 W^X 원칙과의 근본적으로 다른 점은 이러한 오퍼레이션을 하드웨어적으로 강제할 수 있다라는 것으로서 디폴트 설정에서 더더욱 강력한 보안 기능을 제공하게 됩니다. 반대로 생각하자면, 기존에 존재하는 어플리케이션을 W^X 호환되도록 제작하는 작업이 필요할 것으로 보이고, 거기에 많은 리소스와 노력이 필요할 가능성이 많다라는 것입니다.
KIP: Kernel Integrity Protection
두번째로 소개된 기능은 KIP라는 기능입니다. 영상 자체에서 제공해 주는 정보에 기반해서 보았을 때에 이 기능은 윈도우즈의 패치 가드 내지는 KPP (Kernel Patch Protection)나 아니면 Secure Kernel과 비슷한 형태의 Kernel의 코드에 대한 수정이나 새로운 코드를 로딩하는 것을 방지하는 기능으로 보입니다. 역시 인텔 기반의 윈도우즈와 다른 점은 윈도우즈의 경우 소프트웨어적인 코드를 통해서 구현되는데에 반해서, 이 경우에는 CPU 레벨에서 하드웨어적으로 통제를 가하는 것으로 보입니다. 이러한 경우 소프트웨어적인 취약점을 통해서 해당 보안 장치를 해제하는 것이 더더욱 어려워질 것으로 보입니다.
윈도우즈의 경우 몇년전부터 VBS (Virtualization-Based Security)라는 기조를 가지고 Hypervisor에 기반한 여러 보안 장치들을 제공하고 있습니다. 예를 들어 HVCI(Hypervisor-based Code Integrity)의 경우에는 커널로의 다이내믹 코드 인젝션을 방지한다거나 커널 드라이버 사이닝 정책을 통제하는 기능을 hypervisor 레벨에서 제공합니다.
윈도우즈의 Kernel Data Protection (KDP)의 경우에는 커널 내부의 민감한 데이타 구조체들을 보호하는 기능을 하는데, 데이타 커럽션을 통해서 권한 상승을 꽤하는 류의 익스플로잇들에 대한 방어책을 제공합니다. 예를 들어 Hardening Windows 10 with zero-day exploit mitigations에서 소개된 CVE-2016-7256 Open Type Font Elevation Of Privilege 익스플로잇의 경우 처럼 커널 내부의 토큰 구조체를 변경하는 행위들을 방지할 수 있습니다.
윈도우즈의 경우 또한 Secure Kernel을 통해서 커널 메모리 이미지가 변경되는 것을 방어할 수 있습니다. 역시나 새롭게 나온 Apple Silicon의 경우 이러한 소프트웨어적인 여러 방어책들을 하드웨어적인 기능으로 탑재해서 나온다라는 차이점을 가지고 있습니다.
PA: Pointer Authentication
인텔 플랫폼에서는 제공되지 않던 Pointer Authentication을 제공하게 됩니다. 포인터 자체의 값을 인코딩한 형태로 메모리에 저장함으로서 포인터 커럽션을 통한 명령 실행등을 방지할 수 있습니다. 포인터 값들은 PAC(Pointer Authentication Code) + Address 형태로 메모리에 저장되면 PAC을 통해서 해당 포인터의 변조 여부를 체크할 수 있습니다. 기존에 존재하는 어플리케이션들을 어떻게 PA에 호환되도록 빌드할수 있을지에 대해서는 Preparing Your App to Work with Pointer Authentication을 참조하시기 바랍니다.
역시, 인텔 플랫폼하의 윈도우즈 머신의 경우 PA에 미치지는 않지만, 포인터에 XOR을 가하는 방법으로 인코딩을 제한적으로 지원하고 있습니다. 하지만, 모든 포인터들이 글로벌하게 인코딩 되는 것이 아니라서 실제적인 환경에서는 Pointer Encoding을 통해서 공격이 방어되었던 케이스들은 거의 존재하지 않는 것으로 보입니다. Apple Silicon에서는 기본적으로 PA를 지원함으로서 기존의 포인터 커럽션류의 익스플로잇 방법론에 대한 좋은 방어책으로 작동할 것으로 보입니다.
Device Isolation
Apple Silicon의 경우 IOMMU를 각 디바이스별로 분리 되도록 조치하고 있습니다. 인텔 플랫폼의 경우 IOMMU를 여러 디바이스들이 공유함으로 인해서 PCILeech와 같은 툴을 사용하여 Firewire 등을 통해서 물리적으로 연결된 컴퓨터의 메모리를 읽어 내거나 변조하는 것이 가능한 경우가 있습니다. 윈도우즈의 경우 VBS 등을 통해서 PCILeech를 통한 메모리 접근을 어느 정도 제한 가능한 것으로 보입니다. 이제 IOMMU를 디바이스 별로 분리하는 설계로 인해서 이러한 류의 하드웨어를 통한 시스템 접근이 더더욱 어려워 질것으로 보입니다.
결론
최근 인텔에서는 Intel Tiger Lake 발표를 통해서 2020년 말까지 쉐도우 스택 등을 지원하는 CET 보안 기능을 내재한 CPU 라인을 출시할 것을 발표했습니다. 이번 애플에서의 Apple Silicon에서도 보듯이 점점 더 많은 보안 기능이 실리콘에 직접적으로 구현되는 것이 새로운 트렌드로 보입니다. 공격자의 경우에는 새롭게 넘어야 할 장애물들이 생기게 되지만, 방어자의 입장에서도 기존에 존재하는 여러 어플리케이션들의 호환성을 유지하면서도 최신 플랫폼에서의 보안 기능을 최대한 활용하도록 소프트웨어들을 리팩토링해야 하는 과제를 가지게 되었습니다. 다음 몇년간의 윈도우즈와 맥 두 플랫폼에서 이러한 전환이 어떻게 일어 나는지에 대해서 고민하고 행동 할 수 있는 좋은 기회가 될 것으로 보입니다.
References
- Windows 10 Mitigation Improvements - 2016
- Advancing Windows Security - PSEC 2019
- Windows 10 RS5 introduces a new Software PTE type
- Examining Pointer Authentication on the iPhone XS - Friday, February 1, 2019
- a way to use an arbitrary kernel read/write primitive to forge kernel PAC signatures for the A keys, which is sufficient to execute arbitrary code in the kernel using JOP