-
메모리 무결성 강화로 앱 보호하기
하드웨어, 운영 체제, 컴파일러가 연동하여 유효하지 않은 메모리에 대한 액세스를 방지하고, 취약점이 악용되기 전에 프로그램 실행을 안전하게 중단하는 새로운 보안 기술인 메모리 무결성 강화(MIE)를 살펴보세요. MIE로 어떻게 공격자가 메모리 손상 버그를 악용하는 것이 훨씬 더 어려워지는지 확인해 보세요. 앱에 MIE를 도입하여 사용자와 데이터를 보호하는 동시에, 코드베이스에서 찾기 어려운 메모리 문제도 해결하는 방법을 알아보세요.
챕터
- 0:05 - 소개
- 1:29 - 메모리 오버플로 및 UAF(Use-After-Free) 취약점
- 3:08 - 메모리 무결성 강화
- 4:42 - 데모: 메모리 손상 UAF(Use-After-Free) 버그
- 5:52 - 하드웨어 메모리 태깅 활성화하기
- 6:20 - 데모: 악용 시도를 방해하는 하드웨어 메모리 태깅
- 6:44 - 추가 구성 옵션
- 7:25 - 데모: 메모리 손상 버그 수정하기
- 9:32 - 추가 고려 사항
- 10:10 - 포인터의 태그 비트
- 10:30 - 포인터 값의 해싱, 비교 및 산술
- 11:02 - 소프트 모드
- 11:31 - 다음 단계
리소스
- Memory Integrity Enforcement: A complete vision for memory safety in Apple devices
- Enabling enhanced security for your app
관련 비디오
WWDC15
-
비디오 검색…
안녕하세요 저는 줄리안이라고 합니다 Developer Security Tools 팀의 엔지니어입니다 이 비디오에서는 메모리 무결성 강화로 앱을 보호하는 방법을 설명하겠습니다 앱은 우리 삶의 많은 부분과 관련되며 누구나 개인적인 세부 정보를 믿고 맡기는 필수 도구입니다 위치와 방문 기록, 사진, 메시지 연락처, 금융 현황 등입니다 동시에 앱은 인터넷에 연결되므로 앱의 보안 취약점으로 인해 사용자가 공격에 노출될 수 있죠 개인에 대한 공격으로 인한 비용은 사기와 신원 도용부터 협박과 생명 위협까지 다양합니다 사용자는 데이터가 비공개로 안전하게 보호되기를 기대합니다 그 약속이 지켜지지 않는다면 신뢰를 저버리는 것이 됩니다 보안은 개인정보 보호를 가능하게 하는 기술 기반입니다 메시지, 소셜 미디어, 브라우저 앱은 보안이 특히 중요합니다 이들 앱은 신뢰할 수 없는 대량의 입력을 처리하고 도달 범위가 넓어 공격자가 피해자를 정밀하게 타겟팅할 수 있는 경우가 많죠 가장 흔한 보안 취약점 중 하나는 메모리 손상입니다 공격자는 메모리 버그를 악용해 앱 제어력을 하이재킹하고 사용자의 민감한 데이터를 탈취할 수 있습니다
예를 들어 버퍼 오버플로 손상은 버퍼의 경계를 넘어 다른 할당의 메모리를 손상시키죠 그러면 다른 포인터가 해당 메모리를 읽을 때 데이터 손상과 재현하기 어려운 충돌이 발생할 수 있습니다 하지만 더 심각한 점은 공격자가 교묘하게 조작한 쓰기로 앱을 속여 자신이 제어하는 임의의 코드를 실행할 수 있다는 것입니다 공격자가 UAF(Use-After-Free) 버그를 악용할 수도 있습니다 앱이 메모리를 할당 해제하지만 댕글링 포인터가 남는다고 해 보죠 그런 다음 앱이 새 할당을 생성할 때 이 할당이 우연히 메모리의 동일한 위치에 배치됩니다 앱이 실수로 해당 댕글링 포인터를 통해 읽거나 쓰면 메모리가 손상됩니다
메모리 손상 방지 최선책은 Swift 같은 메모리 안전 언어의 사용이죠 메모리 안전 언어는 메모리를 관리하여 프로그래밍 실수로 인해 메모리가 손상되는 일이 없도록 합니다
하지만 모든 새 코드를 Swift로 작성하더라도 기존 코드베이스의 일부로 앱에 C 및 C++ 코드가 있을 수 있죠 또는 메모리 안전성을 제공하지 않는 언어로 작성된 외부 라이브러리에 의존할 수도 있습니다 메모리 무결성 강화는 공격자가 메모리 손상 버그를 악용하는 것을 매우 어렵게 만드는 새로운 기술입니다 메모리 안전성이 크게 발전한 기술로 하드웨어, 운영 체제, 컴파일러가 모두 연동하여 프로그램 실행을 안전하게 중단해 유효하지 않은 메모리에 대한 액세스를 방지하죠 처음 지원되는 기기는 iPhone 17 iPhone Air, iPhone 17 Pro 및 Pro Max입니다 ‘Enabling enhanced security for your app’에서 지원되는 다른 Apple 기기를 확인하시기 바랍니다 작동 방식은 다음과 같습니다 메모리 무결성 강화에서 시스템 할당자는 각 힙 할당에 태그를 할당하고 해당 태그를 반환 포인터에 인코딩합니다 메모리에서 로드하거나 저장할 때마다 하드웨어는 포인터의 태그가 할당의 태그와 일치하는지 확인합니다 예를 들어 태그 A가 할당된 포인터를 사용하여 A로 태깅된 메모리를 읽거나 쓰는 경우 액세스가 허용됩니다
하지만 UAF 시나리오에서는 댕글링 A 포인터가 다른 태그로 표시된 새 할당에 액세스합니다 이 태그 불일치로 하드웨어가 프로그램 실행을 중단하여 공격자가 메모리를 손상시킬 수 없게 됩니다 이 접근 방식을 사용하면 버퍼 오버플로 손상도 방지됩니다 할당자가 인접 할당에 서로 다른 태그를 할당하기 때문입니다 메모리 손상 취약점이 포함된 데모 앱을 살펴보겠습니다 앱 자체는 Swift로 작성되나 이미지분석에 외부 C 라이브러리도 사용하며, 여기에 UAF 버그가 있는 듯하나 어디인지는 모르겠습니다 앱을 실행하겠습니다
메시지를 하나 받은 것 같네요 사진을 보고 싶으니 탭합니다
이런, 어떻게 된 거죠? 귀여운 강아지 사진이 아니라 악의적인 공격자가 보낸 교묘하게 조작된 이미지였네요 실제로 이 이미지는 UAF 버그를 악용해 제 개인 메시지들을 인터넷의 서버로 전송했습니다
정말 무섭네요 저는 이러한 악용의 시각적 효과를 과장해 보았습니다 공격자는 일반적으로 활동을 가능한 한 보이지 않게 숨깁니다
더 현실적 공격에선 사용자 데이터가 사용자 모르게 손상되죠 Xcode에서 메모리 무결성 강화로 앱을 보호하려면 앱 타겟의 Signing & Capabilities 편집기로 이동해 기능 추가 메뉴를 클릭하고 Enhanced Security를 선택합니다
그러면 여러 강력한 보안 보호 기능이 활성화되며 여기에는 하드웨어 메모리 태깅이 포함됩니다
로컬 테스트 시, 메모리 태깅용 소프트 모드를 비활성화합니다 소프트 모드에 대해서는 나중에 자세히 살펴보죠 하드웨어 메모리 태깅을 활성화하고 앱을 재실행했습니다 해당 악의적인 이미지를 다시 탭합니다
이제 공격자의 메시지 탈취를 허용하는 대신에 앱이 종료됩니다 종료 이유를 클릭하면 태그 불일치 때문에 앱이 중단됐다고 표시되죠
하드웨어 메모리 태깅에 대한 몇몇 추가 구성 옵션이 있습니다 ‘Memory Tag Pure Data’ 옵션은 보호를 더 많은 할당으로 확장하죠 앱이 인터프리터나 JIT 컴파일러를 사용하는 경우 ‘Prevent Receiving Tagged Memory’를 활성화합니다 Enhanced Security Type Allocator 활성화를 확인합니다 이 기능은 UAF 버그 악용을 방지하는 강력한 이점을 제공하며 메모리 태깅과 결합되어 최상의 보호를 구현할 수 있습니다 앱의 메모리 태깅 준비 확인용 소프트 모드 옵션도 있습니다 제 데모 앱에서는 공격자의 악용이 이제 방지됩니다
하지만 사용자 경험은 좋지 않습니다 앱이 충돌하는 것을 방지하려면 아직 기본 메모리 손상 버그를 수정해야 합니다 Xcode는 사용자에게 영향을 미치기 전에 개발 환경에서 이 버그를 찾아 수정하는 데 도움이 됩니다 스키마 편집기의 진단 패널에서 하드웨어메모리 태깅을 활성화하죠 하드웨어 메모리 태깅 진단을 활성화하고 앱을 재실행했습니다 해당 이미지를 탭해 버그를 다시 한번 트리거합니다
앱이 다시 종료되지만 이제 Xcode에서 문제 파악에 유용한 추가 정보를 제공합니다 먼저, 태그 불일치는 할당 해제된 메모리 사용 때문임을 알려 줍니다 UAF죠
디버그 탐색기에 메모리가 할당 해제된 위치를 보여 주는 유용한 스택 추적이 표시됩니다
이 경우엔 함수 process_image_message네요
충돌 지점으로 돌아가면 비동기 디스패치 블록이라고 표시되죠
이제 무엇이 문제인지 알겠습니다 백그라운드 스레드가 처리하기 전에 메인 스레드가 메시지를 할당 해제했네요 이 문제를 수정하기 위해 메시지 할당 해제를 메인 스레드에서 비동기 블록 끝으로 옮기겠습니다 그러면 메시지가 처리된 후에만 할당 해제됩니다
앱을 다시 실행해 이 변경으로 기본 버그가 수정됐는지 확인하죠
이미지를 다시 탭하겠습니다 예, 잘 수정된 것 같네요 앱이 악의적인 이미지를 받았지만 공격자는 이 이미지로 앱을 하이재킹할 수 없었습니다
다음으로, 메모리 무결성 강화를 위해 앱을 준비할 때의 몇 가지 추가 고려 사항을 살펴보겠습니다 이제 남아 있는 버퍼 오버플로 또는 앱을 정상적으로 사용하는 동안 발생하는 UAF 버그를 수정해야 합니다 테스트에서 하드웨어 메모리 태깅 진단을 활성화하면 이러한 버그를 찾아 파악할 수 있습니다
재현이 어려운 메모리 손상 버그가 조치 가능한 충돌로 바뀝니다 메모리 무결성 강화를 지원하는 기기가 없다면 Address Sanitizer를 대신 사용하세요 하드웨어 메모리 태깅은 포인터 상위 비트에 태그를 저장합니다 해당 비트를 앱이 사용 또는 수정하지 않도록 해야 합니다 맞춤 태깅 포인터 스키마 사용 시 이를 다른 곳에 저장하도록 하세요
포인터에 대한 해싱, 비교 또는 산술 수행 시에도 주의해야 합니다 메모리 태깅이 활성화되면 서로 다른 할당에 대한 포인터가 별개의 태그를 갖게 되며 따라서 각기 다른 상위 비트가 설정됩니다 포인터 값의 해싱, 비교 및 산술에 어떤 영향을 미칠지 고려하세요 서로 다른 할당의 포인터를 비교하는 것은 피하세요 필요한 경우 태그 비트를 마스크 오프하세요
소프트 모드는 앱에서 메모리 손상 버그를 찾아서 수정했는지 확인하는 데 도움이 됩니다 실행을 종료하지 않고도 시뮬레이션된 충돌 로그 형태로 태그 불일치에 대한 원격 측정을 제공합니다 TestFlight와 고객 모집단에서 이 기능을 활성화하면 메모리 손상 버그가 남아 있지 않다는 확신을 얻을 수 있습니다 버그가 수정되면 소프트 모드를 비활성화해 사용자를 보호하세요 다음 단계는 다음과 같습니다 앱이 비검증 입력을 처리하는 경우 메모리 무결성 강화로 보호하세요 메시지, 소셜 미디어, 브라우저 앱에 특히 중요합니다 알려진 메모리 손상 버그를 수정하여 앱을 준비하세요 앱이 다른 용도의 포인터 태그 비트를 사용하지 않도록 하세요 하드웨어 메모리 태깅 진단을 활성화해 앱을 테스트하세요 소프트 모드를 사용해 수정을 확인하세요 그런 다음 소프트 모드를 비활성화해 사용자를 보호하세요 시청해 주시고 메모리 무결성 강화를 도입해 주셔서 감사합니다
-