핵심 내용
최신 macOS 바이너리는 PIE, ASLR, 코드 서명과 같은 강력한 플랫폼 방어 기능을 포함해 배포되는 경우가 많습니다. 하지만 우리는 최신 애플리케이션이 수십 년 된 POSIX 룰을 위반하면 어떤 일이 발생하는지 궁금했습니다.
서명된 OpenSSL 래퍼 바이너리를 분석하는 과정에서, Akamai가 내부적으로 개발한 AI 리서치 툴인 “Hallucinator”를 사용해 중요한 신호 재진입성 취약점을 확인했습니다. 이는 레거시 TLS 기능이 비동기 컨텍스트에서 위험한 것으로 알려진 신호, stdio, 메모리 프리미티브와 함께 존재하는 경우입니다.
환경적 제약으로 인해 전체적인 악용을 확인할 수는 없었지만, 정적 및 동적 증거는 고위험 서비스 거부(DoS) 조건을 강하게 뒷받침하며, 불리한 타이밍 조건에서는 해제 후 사용(UAF)으로 확대될 가능성도 있습니다.
이 블로그 게시물에서는 확인된 증거를 세분화해 살펴보고, 합리적으로 추론할 수 있는 리스크를 검토하며, 보안 리더가 아키텍처 위협을 평가할 때 컴플라이언스 체크리스트만으로는 부족한 이유를 설명합니다.
대상 및 증거 범위
이 리서치가 엄밀하게 입증 가능한 범위 안에 머물도록, Akamai는 직접 관찰한 내용과 추가 런타임 계측이 필요한 내용을 의도적으로 구분하고 있습니다.
대상 메타데이터
대상: openssl(macOS Mach-O 유니버설 바이너리)
SHA-256: 5a7d226a379afa156ea96068abd51da74f5f86cd2eb5b6b17ac45ee002d340b4
확인된 정적 증거
레거시 TLS 기능: 심볼 증거를 통해 _TLSv1_client_method()의 존재가 확인되었습니다.
비동기 시그널 안전성이 없는 함수: 심볼 증거를 통해 _signal(), _fprintf(), _free()의 존재가 확인되었습니다.
프로덕션 체계: 코드 서명, 해시 아웃풋, 파일 메타데이터를 통해 이것이 합성 테스트 코드가 아니라 실제 서명된 macOS 아티팩트임이 확인되었습니다.
이 세 가지 요소는 재진입성 취약점 패턴의 신뢰도를 매우 높이며, 이를 일반적인 정적 분석 경고가 아니라 검증된 아키텍처 취약점으로 격상시킵니다.
잠정 점수(현재 증거 기준): CVSS v3.1 = 5.1(중간)
현재 방어 가능한 주장에 대한 권장 기본 기법:
CVSS:3.1/AV:L/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H
잠정 점수가 중간에 그치는 이유는 무엇인가요?
- 정적 취약점에 대한 강력한 증거는 있지만, 확인된 익스플로잇 체인은 없습니다.
- 영향은 주로 가용성 리스크, 즉 중단 또는 충돌 가능성에 집중됩니다.
- 현재로서는 악용 난도가 매우 높은 것으로 보입니다.
핵심 취약점: 신호에 의한 상태 혼동
많은 개발자가 워치독 타이머와 함께 결함 있는 설계 패턴을 사용합니다. 타이머가 트리거되면 애플리케이션은 다음 세 가지 작업을 순서대로 수행하려고 합니다.
이벤트 기록
메모리 정리
프로그램 종료
개발자는 시그널 핸들러 안에 간단히 fprintf(stderr, "Timeout...")를 작성하고 이어서 free()를 호출합니다. 단위 테스트에서는 완벽하게 작동하는 것처럼 보입니다.
하지만 시그널 핸들러 안에서 fprintf나 free 같은 함수를 호출하는 것은 POSIX의 기본적인 비동기 시그널 안전성 룰을 위반하는 것입니다.
OpenSSL이 실패한 TLS 연결을 정리하는 것과 같은 복잡한 상태 전환을 처리할 때는 시스템 메모리 할당자에 크게 의존합니다. 시그널 핸들러는 일반적인 제어 흐름과 비동기적으로 실행됩니다. 공격자가 네트워크 패킷의 타이밍을 조정해 응답을 SIGALRM 워치독이 트리거될 만큼만 지연시킬 수 있다면, 시그널 핸들러가 OpenSSL의 정리 처리 도중 갑자기 실행을 가로채게 됩니다.
세션 정리 중 메인 스레드가 아직 libmalloc 힙 잠금을 보유한 상태에서 fprintf가 버퍼 공간을 동적으로 할당하려고 하면, 프로그램 상태가 손상될 수 있습니다. 이러한 요소가 맞물릴 때 실제로 확인된 보안 영향은 심각한 불안정성, 프로세스 중단, 비동기 DoS입니다.
촉매 요인: 프로토콜 다운그레이드를 통한 실행 시간 창 확대
메모리 정리 중 극히 짧은 레이스 컨디션을 정확히 맞히는 것은 매우 어렵기로 악명 높습니다. 여기서 _TLSv1_client_method의 존재가 리스크 프로필을 바꿉니다.
레거시 TLS 핸드셰이크는 최신 TLS 1.3 구현보다 본질적으로 더 복잡하고 더 많은 상태 처리를 수반합니다. 레거시 암호 스위트의 오류 처리 및 세션 무효화 로직은 OpenSSL 내부 구조에서 더 광범위한 메모리 정리를 필요로 합니다.
공격자가 연결 다운그레이드를 적극적으로 유도하는 것은 반드시 암호화를 깨기 위해서가 아닙니다. 의도적으로 OpenSSL 상태 머신을 가장 오래되고 지연 시간이 가장 긴 코드 경로로 밀어 넣기 위한 것입니다. 이론적으로 이는 정리 처리 실행 시간을 늘려, 시그널 인터럽트를 성공적으로 발생시킬 가능성을 크게 높입니다.
악용 가능성 격차: DoS와 UAF 비교
현재 실행 환경에서는 검증 중 런타임이 강제로 종료되었으며(exit 137), lldb 연결도 제한되었습니다. 이러한 제약으로 인해 결정적인 교착 상태 트레이스를 캡처하거나, UAF 악용이 항상 재현 가능하다는 점을 확인할 수는 없었습니다.
- 리스크 수준: 높음(가용성 영향과 타이밍 스트레스 조건에서의 잠재적 무결성 리스크)
- 신뢰도: 취약점 패턴의 존재에 대해서는 중간에서 높음, 최악의 경우 메모리 손상 영향에 대해서는 중간
- 핵심 요약: 고위험 재진입성 패턴이 확인되었습니다. 서명된 최신 바이너리에서도 레거시 프로토콜 경로와 비동기적 가정이 충돌하면 고위험 취약점 체인이 노출될 수 있습니다.
증거 아웃풋(tmp.txt)에서 동일한 서명된 Mach-O 바이너리에는 _TLSv1_client_method와 함께 _signal, _fprintf, _free가 포함되어 있습니다. 이러한 공존이 핵심적인 기술 조건입니다. 즉, 레거시 TLS 지원 코드 경로, 비동기 시그널 처리 함수, 비동기 시그널에 안전하지 않은 libc 사용이 함께 존재하며, 이 조합은 고위험 재진입성 취약점 패턴을 뒷받침합니다.
Demo-openssl-glitch % otool -Iv openssl > tmp.txt 2>&1
Demo-openssl-glitch % cat tmp.txt | grep -En "_TLSv1_client_method| _signal| _fprintf| _free"
620:0x0000000100035c1c 3132 _TLSv1_client_method
919:0x0000000100036ecc 3440 _fprintf
922:0x0000000100036efc 3443 _free
923:0x0000000100036f0c 3444 _freeaddrinfo
924:0x0000000100036f1c 3445 _freezero
1004:0x000000010003741c 3527 _signal
#
1138:0x000000010004c318 3132 _TLSv1_client_method
1923:0x000000010004dba0 3445 _freezero
2010:0x000000010004de58 3440 _fprintf
2013:0x000000010004de70 3443 _free
2014:0x000000010004de78 3444 _freeaddrinfo
2048:0x000000010004df88 3527 _signal
CISO의 관점: 기술적 취약점을 비즈니스 리스크로 해석하기
복잡한 환경을 관리하는 보안 리더에게 이러한 취약점은 표준 컴플라이언스 점검으로는 포착하기 어려운 네 가지 고유한 과제를 제기합니다.
“유령 장애”와 급증하는 평균 해결 시간(MTTR)
“그린 대시보드”의 착시
악용 수단이 되는 레거시 기술 부채
AI가 증폭시키는 위협(복잡한 악용 기술의 대중화)
“유령 장애”와 급증하는 평균 해결 시간(MTTR)
명확한 세그멘테이션 오류(SIGSEGV)를 발생시켜 크래시 덤프를 생성하는 일반적인 버퍼 오버플로와 달리, 힙 잠금 경합은 프로세스를 멈춰 세웁니다. 프로세스가 종료되는 것이 아니라, 단순히 요청 처리를 중단합니다. 표준 가동 시간 모니터링에서는 프로세스가 “실행 중”으로 표시될 수 있어 인시던트 대응이 지연됩니다. 엔지니어가 조사를 시작해도 크래시 로그가 없기 때문에 근본 원인 분석이 매우 어려워지고, 그 결과 MTTR이 크게 늘어납니다.
“그린 대시보드”의 착시
이 바이너리는 디지털 서명이 적용되어 있으며, 위치 독립 실행 파일(PIE)과 같은 최신 메모리 보호 기능을 사용합니다. 표준 컴플라이언스 대시보드나 기본 취약점 스캔에서는 이 자산이 안전한 것으로 보일 수 있습니다. 이 취약점은 기본적인 플랫폼 방어 기능에만 의존하는 것이 얼마나 위험한지 보여줍니다. OS 수준의 강화 조치만으로는 POSIX 동시성 위반과 관련된 깊은 아키텍처 논리 취약점을 막을 수 없습니다.
악용 수단이 되는 레거시 기술 부채
정보 보안팀은 “아무도 사용하지 않는다”거나 “중간자 복호화에만 위험하다”는 가정하에 TLS 1.0과 같은 레거시 프로토콜의 리스크를 수용하는 경우가 많습니다. 그러나 이 리서치는 레거시 기술 부채가 전혀 다른 유형의 공격을 가능하게 하는 수단으로 적극 악용될 수 있음을 보여줍니다. 오래된 TLS 구현은 단순히 암호화 수준이 약한 것에 그치지 않습니다. 공격자가 레이스 컨디션이 발생할 수 있는 시간 창을 늘리고 메모리 손상 공격을 실행하는 데 필요한 정확한 지렛대 역할을 합니다.
AI가 증폭시키는 위협(복잡한 악용 기술의 대중화)
이전에는 POSIX 동시성 위반을 발견하고, 이를 레거시 암호화 다운그레이드와 연결해 상태 머신 동기화 불일치를 유발하는 일은 뛰어난 취약점 연구자들의 영역이었습니다. 그러나 오늘날에는 공격용 AI 툴과 대규모 언어 모델(LLM) 기반 리버스 엔지니어링이 폭발적으로 확산되면서 진입 장벽이 크게 낮아졌습니다.
이제 공격자는 이처럼 잘 드러나지 않는 아키텍처상의 교차 지점을 대규모로 자동 탐지할 수 있습니다. 공격자가 이러한 취약점을 탐지하고 공격에 활용하는 데 필요한 인지적 복잡성이 낮아질수록, 다단계 논리 취약점을 패치하지 않고 방치할 때 기업이 감수해야 하는 리스크는 기하급수적으로 증가합니다.
방어 전략
이 복잡한 익스플로잇 체인을 무력화하려면 코드 수준의 근본 원인과 이를 가능하게 하는 아키텍처 요인을 모두 해결해야 합니다.
- 안전하지 않은 핸들러 리팩터링
- 엣지 환경에서 레거시 프로토콜 차단
- 심층 라이브니스 프로브로 업그레이드
- CTEM 및 AI 검증으로의 발전
안전하지 않은 핸들러 리팩터링(근본 원인)
개발자는 시그널 핸들러에서 비동기 시그널에 안전하지 않은 함수(free, fprintf)를 반드시 제거해야 합니다. 복잡한 정리 로직을 메인 애플리케이션 이벤트 루프로 안전하게 지연시키기 위해 “self-pipe trick”을 의무적으로 적용해야 합니다.
엣지 환경에서 레거시 프로토콜 차단(촉매 요인)
로컬 애플리케이션 설정에 의존해서는 안 됩니다. 공격자가 이러한 극히 짧은 레이스 컨디션을 노리는 데 필요한 지연 시간 조작을 악용하지 못하도록, 외부 경계 지점인 웹 애플리케이션 방화벽 또는 부하 분산기에서 TLS 1.2 이상만 엄격하게 허용해야 합니다.
심층 라이브니스 프로브로 업그레이드(운영 안정성)
표준 가동 시간 모니터링만으로는 힙 잠금 경합을 포착할 수 없습니다. 메모리 할당과 프로세스 상태를 능동적으로 검증하는 합성 트랜잭션을 배포해, 교착 상태에 빠진 “유령” 프로세스가 즉시 표시되고 재시작되도록 해야 합니다.
CTEM 및 AI 검증으로의 발전(전략)
기존 정적 애플리케이션 보안 테스트(SAST)는 이러한 아키텍처상의 교차 지점을 놓칩니다. 지속적 위협 노출 관리(CTEM) 주기에 AI 기반 동적 테스트를 통합해, 공격자가 다단계 논리 체인을 공격에 활용하기 전에 이를 선제적으로 매핑하고 차단해야 합니다.
태그