Secure your app with Memory integrity Enforcement (메모리 무결성 강화로 앱 보호하기)
메모리 무결성 강화를 통해 앱을 보호하는 방법.

Memory corruption
: Most common vulnerability (메모리 손상) > 공격자는 메모리 버그를 이용해 앱의 제어권을 장악하고 사용자의 민감한 데이터를 훔칠 수 있음.


예를 들어 버퍼 오버플로우는 버퍼의 경계를 넘어 다른 할당의 메모리를 손상시킴.
: 이런 경우에 다른 포인터가 메모리를 읽을 때 데이터 손상과 재현하기 어려운 충돌이 발생할 수 있음.
Use-after-free memory corruption

앱이 메모리 chunk를 할당 해제했지만 해당 메모리에 dangling pointer가 남아 있는 경우를 가정해보자.
: 앱이 메모리의 동일한 위치에 새로운 할당을 생성할 경우, A의 dangling pointer를 통해 읽거나 쓰면 메모리가 손상됨.
Use memory-safe languages


Swift와 같은 안전한 언어를 사용하거나 메모리 안전 언어는 메모리를 관리하여 프로그래밍 실수로 인해 메모리가 손상되는 것을 방지함.
: 기존 코드 기반의 일부로 C 및 C++ 코드가 여전히 포함되어 있거나 메모리 안전성을 제공하지 않는 언어로 외부 라이브러리에 의존할 수도 있음.

메모리 무결성 강화는 메모리 손상 버그를 악용하는 것을 매우 어렵게 만드는 새로운 기술.

Memory Integrity Enforcement
: 이는 하드웨어, 운영체제, 컴파일러가 함께 작동하여 프로그램 실행을 안전하게 중단함으로써 잘못된 메모리에 대한 접근을 방지하는 메모리 안전성의 주요 발전 사항임.
: 지원 기기는 iPhone 17, iPhone Air, iPhone 17 Pro 및 Pro Max 부터 가능함.

메모리 무결성 강화에 따라 시스템 할당자는 각 힙 할당에 태그를 지정하고, 반환 포인터에 해당 태그를 인코딩 함.
: 메모리에서 로드하거나 저장할 때마다 하드웨어
는 포인터의 태그가 할당의 태그와 일치하는지 확인함.
: 예를 들어서 태그 A가 있는 포인터를 사용하여 태그 A가 있는 메모리를 읽거나 쓰는 경우 접근이 허용됨.


하지만, 사용 후 해제 시나리오에서는 dangling pointer A가 다른 태그로 표시된 새로운 할당에 접근하게 됨.
: 이는 태그 불일치로 인해 하드웨어가 프로그램 실행을 중단하여 공격자가 메모리를 손상시킬 수 없도록 함.
: 이러한 접근 방식은 할당자가 인접한 할당에 다른 태그를 지정하기 때문에 버퍼 오버플로 손상으로부터도 보호됨.


Xcode에서 메모리 무결성 적용을 통해 앱을 보호하려면 앱 Targets의 Siging & Capabilities에서 Enhanced Security를 추가함.
: 이를 통해 하드웨어 메모리 태깅을 포함한 여러가지 강력한 보안 보호 기능을 사용할 수 있음.
: 로컬 테스트를 위해 메모리 태깅을 위한 소프트 모드가 비활성화 되어 있는지 확인.

위 설정을 마친 후 재실행하여 크래시가 발생하면, 태그가 불일치하여 발생한 문제임을 파악할 수 있음.
Additional configuration options

“메모리 태그 순수 데이터” 옵션은 더광범위한 할당 세트로 보호 범위를 확장함.
앱에서 인터프리터나 JIT(Just-In-Time) 컴파일러를 사용하는 경우 “태그된 메모리 수신 방지”를 활성화
Ensure Typed Allocator를 활성화하여 악용을 방지하는데 강력한 이점을 제공함.

앱이 충돌하는 것을 방지하려면 기본적인 메모리 손상 버그를 수정해야 함.
Xcode는 앱이 사용자에게 영향을 미치기 전에 개발 환경에서 버그를 찾아 수정하는 데 도움이 됨
Edit Scheme > Diagnostics 에서 Hardware memory Tagging을 활성화

이전 태그 불일치로 진단된 부분의 더 자세한 내용은 할당 해제된 메모리 사용으로 인해 발생한다는 점을 알려줌.


스택을 따라서 process_image_message 메서드로 이동해보면 dellocate 시키고 있음.
하지만 문제는 비동기로 실행하면서 백그라운드 스레드가 메시지를 처리할 기회를 갖기 전에 메인 스레드가 메시지의 할당을 해제함.


문제를 해결하려면 메시지의 할당 해제를 메인스레드에서 비동기 블럭의 끝으로 코드롤 옮겨서. 처리가 완료된 후에만 할당 해제되도록 변경.
코드를 변경 함으로써 공격자에 의해서 악성 이미지를 받았지만 공격자는 이를 하이재킹 할 수 없었음.
Address heap memory corruption bugs

메모리 무결성 강화를 위해 앱을 준비하는 데 필요한 몇가지 고려 사항에 대해서 설명
Fix heap memory corruption in normal app usage
: 앱 정상적으로 사용할 때 오버플로우나 버그를 수정할 때 하드웨어 메모리 태깅 진단을 활성화해서 버그를 파악할 수 있음.
Enabled Hardware Memory Tagging diagnositics in Xcode Test plan
: 이를 통해 재현하기 어려운 메모리 손상 버그가 실행 가능한 컨플릭트로 변경될 것.
Use Address Sanitizer if supported hardware is unavailable
: 메모리 무결성을 강화를 지원하는 장치가 없는 경우 Address Sanitizer를 사용할 것

하드웨어 메모리 태깅을 할당을 보호하기 위해 포인트 상위 비트에 태그를 저장.
: 앱에서 해당 비트가 사용되거나 수정되지 않도록 해야함.
: 앱에서 사용자 정의 태그 포인터 체계를 사용하는 경우, 해당 정보를 다른 곳에 저장하도록 조정해야 함.

포인터에 대한 해시, 비교 또는 산술 연산을 수행할 때도 주의하는 것이 중요함.
: 메모리 태그 지정이 활성화 되면, 서로 다른 할당에 대한 포인터는 서로 다른 태그를 가지게 되고, 따라서 서로 다른 상위 비트가 설정됨.
: 이것이 포인터 값의 해시, 비교 또는 산술 연산을 수행할 때 어떤 영향을 미치는지 생각해보자.
: 생성된 포인터의 비교는 피하기.
: 필요한 경우 태그 부분을 마스크하여 가리기

소프트 모드는 앱에서 메모리 손상 버그를 찾아서 수정했는지 확인하는데 도움이 됨.
: 실제 상황에서 태그 불일치에 대한 원격 측정을 제공.
: 테스트 플라이트에서 이 기능을 활성화해서 메모리 손상 버그가 없다는 확신을 얻을 수 있음.
: 메모리 손상 버그가 수정되면 소프트 모드를 다시 비활성화.
앱이 검증되지 않은 입력을 처리하는 경우 메모리 무결성 강화를 도입해 사용자를 보호하기.
: 특히 메시징, 소셜 미디어, 브라우저 앱에 중요.

다음 단계
: 메모리 문제가 있는 앱을 준비하기
: 지정된 태그 비트를 다른 영역에서 수정하지 않는지 확인.
: 하드웨어 메모리 태깅 진단을 활성화해 앱을 테스트 하기
: 소프트 모드를 사용하여 수정 사항을 검증하고, 검증이 끝나면 다시 종료하기
(링크)
https://www.youtube.com/watch?v=iYUMr3Y9fAU&t=513s
'apple > WWDC' 카테고리의 다른 글
| Xcode 빌드에서의 병렬 처리에 대한 오해 해소(Demystify parallelization in Xcode builds) - WWDC22 (0) | 2025.12.30 |
|---|---|
| ARC in Swift: Basics and beyond - WWDC21 (0) | 2025.10.23 |
| Elevating an app with Swift concurrency (Swift 동시성으로 앱 수준 높이기) (0) | 2025.10.19 |
| 백그라운드에서 작업 완료하기 (Finish tasks in the background) -wwdc25 (3) | 2025.07.30 |
| Swift의 새로운 기능 (What's new in Swift) - WWDC25 (6) | 2025.07.21 |