← All issues

[11] libpas MTE Lockdown Mode initialization bypass

Severity: Medium | Component: libpas (bmalloc) MTE configuration | 1b1e4d0

Lockdown Mode를 활성화한 사용자 환경에서도 CaptivePortal WebContent process의 MTE hardening이 조용히 비활성화되는 문제입니다. 직접적인 exploitation으로 이어지는 결함은 아니지만, 신뢰할 수 없는 네트워크 트래픽을 처리하는 process에서 defense-in-depth mitigation이 약화된다는 점에서 Medium으로 평가합니다.

process에 적용된 sandbox 제한으로 인해 Lockdown Mode 상태를 확인하는 sysctl 호출이 항상 0을 반환하는 문제가 있었습니다. 이 fix에서는 CaptivePortal WebContent process를 대상으로 process 이름을 확인하는 fallback 로직이 추가되었습니다.

Source/bmalloc/libpas/src/libpas/pas_mte_config.c

uint64_t ldmState = 0;
size_t sysCtlLen = sizeof(ldmState);
- if (sysctlbyname("security.mac.lockdown_mode_state", &ldmState, &sysCtlLen, NULL, 0) >= 0 && ldmState == 1)
+ const char* lockdownModeProcName = "com.apple.WebKit.WebContent.CaptivePortal";
+ bool isLockdownModeWebContentProcess = !strncmp(getprogname(), lockdownModeProcName, strlen(lockdownModeProcName));
+ if ((sysctlbyname("security.mac.lockdown_mode_state", &ldmState, &sysCtlLen, NULL, 0) >= 0 && ldmState == 1) || isLockdownModeWebContentProcess)
config->is_lockdown_mode = true;
else
config->is_lockdown_mode = false;

getprogname()으로 얻은 process 이름이 "com.apple.WebKit.WebContent.CaptivePortal"과 일치하는 경우, sysctl 결과와 무관하게 is_lockdown_modetrue로 설정하는 보조 조건이 추가되었습니다. 두 조건은 OR로 연결됩니다.

권한이 제한된 system call의 silent failure로 인해 security hardening 기능이 무조건적으로 비활성화되는 패턴.

ARM MTE(Memory Tagging Extensions)는 메모리 할당에 무작위 태그를 부여하고 모든 접근 시 이를 검증하는 하드웨어 기능으로, use-after-free와 out-of-bounds 접근을 하드웨어 수준에서 탐지합니다. Lockdown Mode(LDM)는 고위험 사용자를 위해 추가적인 hardening을 활성화하는 iOS/macOS의 선택적 보안 모드입니다.

WebKit의 libpas allocator에서는 성능상의 이유로 WebContent process의 MTE tagging이 기본적으로 비활성화되어 있습니다. 다만 Lockdown Mode가 활성 상태이거나 process가 EnhancedSecurity 변형인 경우에는 "hardened" 상태로 간주하여 MTE가 다시 활성화됩니다. CaptivePortal WebContent process는 captive portal 네트워크 인증 흐름에서 표시되는 web content를 처리합니다. 이는 신뢰할 수 없는 네트워크 환경으로, exploitation 위험이 상대적으로 높습니다.

security.mac.lockdown_mode_state를 조회하는 sysctlbyname 호출은 WebContent process에 적용된 sandbox 정책에 의해 차단되었습니다(commit 메시지에도 이 내용이 명시되어 있습니다). 이 호출은 항상 음수 값을 반환했으므로 >= 0 조건이 항상 실패했고, ldmState는 실제로 읽히지 않았습니다. 결과적으로 기기가 실제로 Lockdown Mode 상태에 있더라도 config->is_lockdown_mode는 항상 false로 설정되었습니다.

is_lockdown_mode는 이후 MTE tagging 활성화 여부를 결정하는 데 사용됩니다. 이 값이 false에 고정되면서 CaptivePortal WebContent process는 MTE hardening을 전혀 적용받지 못했고, Lockdown Mode 사용자에게 제공되어야 할 핵심 exploit mitigation이 무력화되었습니다.

🔒

Explores the downstream impact of this silent mitigation failure and what it means for exploit difficulty in the affected process

더 확인하려면 구독해 주세요

🔒

Multiple audit patterns identified around silent security-feature initialization failures in sandboxed processes

더 확인하려면 구독해 주세요