Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
uaf-2023-28205 — PoC CVE-2023-28205: Apple WebKit 사용 후 해제 취약점 | Kitploit
도구/GitHubGitHub/seregonwar/uaf-2023-28205
Vulnerability AnalysisExploitationWeb Application ExploitationLearning & EducationPayload DevelopmentBinary Exploitation
GitHubseregonwar/uaf-2023-28205

uaf-2023-28205

PoC CVE-2023-28205: Apple WebKit 사용 후 해제 취약점

저장소 보기
87개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
웹사이트

CVE-2023-28205: Apple WebKit Use-After-Free 취약점

이 취약점은 Apple WebKit에 영향을 미치며, 악의적으로 조작된 웹 콘텐츠를 통해 WebKit 프로세스 컨텍스트에서 임의 코드 실행이 가능해질 수 있습니다.

이 리포지토리에서 분석된 영향받는 WebKit 빌드는 WebKit-613.1.17.1 (PlayStation / Safari 15.4 계열)을 기반으로 합니다.


설명

PoC(Proof of Concept)는 구조화된 복제 작업 중 Map 및 Date와 같은 JavaScript 객체의 등록을 의도적으로 지연시켜 사용 후 해제(Use-After-Free, UAF) 조건을 유발합니다.

이러한 타이밍 창을 통해 JavaScriptCore 가비지 컬렉터(GC) 가 논리적으로 여전히 사용 중인 객체를 회수하여, 계속 실행되는 동안 오래된 포인터가 역참조됩니다.


기술적 근본 원인 (CVE-2023-28205)

영향을 받는 구성 요소

  • SerializedScriptValue
  • CloneDeserializer::deserialize()

근본 원인

취약점은 구조화된 복제 역직렬화 로직, 특히 재귀적 역직렬화 중 새로 생성된 JavaScript 객체가 추적되는 방식에 있습니다.

SerializedScriptValue.cpp에서 역직렬화기는 다음과 같은 표준 WebKit 컨테이너를 사용합니다:

root@kitploit:~
Vector<JSObject*, 32> outputObjectStack;
Vector<JSMap*, 4> mapStack;
Vector<JSSet*, 4> setStack;

이러한 Vector 컨테이너는 가비지 컬렉터가 스캔하지 않습니다. 역직렬화 중에 가비지 컬렉션 사이클이 트리거되면(예: 메모리 압력 또는 재진입 JS 실행으로 인해), 이러한 컨테이너에 의해서만 참조되는 객체가 잘못 수집될 수 있습니다.

그러나 역직렬화기는 계속해서 이러한 댕글링 포인터를 사용하여 사용 후 해제 조건이 발생합니다.

누락된 수정 사항

공식 WebKit 보안 패치(커밋 c9880de)는 이러한 컨테이너를 GC 인식 구조인 MarkedVector로 대체하여 해당 내용을 GC 루트로 적절히 등록합니다.

분석된 빌드에서:

  • MarkedVector는 구현되지 않음
  • CloneDeserializer는 여전히 Vector를 사용
  • GC는 이러한 임시 객체 스택을 스캔하지 않음

이는 해당 빌드가 CVE-2023-28205에 완전히 취약함을 확인해줍니다.


크래시 분석

다음 크래시는 PoC에 의해 안정적으로 발생했으며, GC 후 오래된 포인터 역참조와 일관됩니다.

주요 지표

  • 시그널: SIGSEGV (11)
  • 오류 주소: 0x0000000000000068
  • 프로세스: SceNKWebProcess
  • 모듈: libSceNKWebKit.sprx

오류 주소 0x68은 객체-필드 오프셋이 있는 NULL 기본 포인터 역참조를 나타내며, 이는 해제된 JavaScript 객체에 접근하는 전형적인 특징입니다.

레지스터 상태가 다음을 확인합니다:

  • RAX = 0x0 (NULL 객체 베이스)
  • 실행이 전적으로 WebKit 사용자 공간 내부
  • 커널 또는 시스템 호출 개입 없음

이러한 크래시 동작은 위에서 설명한 CloneDeserializer UAF의 직접적인 발현입니다.


크래시 덤프

크래시 덤프를 보려면 클릭
root@kitploit:~
#
# A user thread receives a fatal signal
#
# signal: 11 (SIGSEGV)
# thread ID: 101395
# thread name: SceNKWebProcessMain
# proc ID: 88
# proc name: SceNKWebProcess
# reason: page fault (user read data, page not present)
# fault address: 0000000000000068
#
# registers:
# rax: 0000000000000000  rbx: 0000000000000000
# rcx: 000000020017e000  rdx: ffffffff00000000
# rsi: fffe000000000002  rdi: 0000000201d8c000
# rbp: 00000007eeff9f20  rsp: 00000007eeff9dc0
# r8 : 0000000200194c60  r9 : 00000002005ddc70
# r10: 0000000000000004  r11: 0000000000000000
# r12: 0000000200200000  r13: 0000000201d8c000
# r14: 0000000200880a00  r15: 0000000201d8c000
# rip: 0000000804d03bc1  eflags: 00010206
# BrF: 000000080424da9b  BrT: 0000000804d03aa0
#
# backtrace:
copyin: SceNKWebProcessMain has nonsleeping lock
# 000000080424daa0
# 00000008052127b1
# 0000000805224b1b
# 0000000805224b1b
# 0000000805224b92
# 0000000805224b1b
# 0000000805208549
# 00000008037cd403
# 0000000803ed90a5
# 0000000804c48bd2
# 00000008045e2295
# 0000000804073b3b
# 000000080337f214
# 0000000802c62f61
# 0000000803e2b04b
# 0000000804645f82
# 000000080306ddc0
# 0000000803a06adb
# 0000000802e77528
# 0000000804281a70
# 0000000803bff887
# 0000000000405181
# 0000000000403d84
# 00000000004045ef
# 0000000000000000
#
# dynamic libraries:
# /goHvLUnT0D/common/lib/NKWebProcess.self
#  text: 0000000000400000:0000000000408000 r-x
#  data: 000000000040c000:0000000000410000 rw-
#  fingerprint: 9f75275c0c9e6a8f512c46351676ba9c00000000
# /goHvLUnT0D/common/lib/libkernel_web.sprx
#  text: 0000000800000000:0000000800050000 r-x
#  data: 0000000800054000:000000080008c000 rw-
#  fingerprint: 5cc7d026be64eb384dc8edd813cf5dff00000000
# /goHvLUnT0D/common/lib/libSceLibcInternal.sprx
#  text: 000000080008c000:00000008001c0000 r-x
#  data: 00000008001c8000:00000008001e4000 rw-
#  fingerprint: 10c2fb20aecfba270ab36512cc6bcd3c00000000
# /goHvLUnT0D/common/lib/libSceSysmodule.sprx
#  text: 00000008001e4000:00000008001f0000 r-x
#  data: 00000008001f4000:0000000800200000 rw-
#  fingerprint: d53329218364300cfc9ac1ce2f5f319000000000
# /goHvLUnT0D/common/lib/libScePosixForWebKit.sprx
#  text: 0000000800200000:0000000800204000 r-x
#  data: 0000000800208000:000000080020c000 rw-
#  fingerprint: 2540b10c69fafebe19bf6c817f06a5dd00000000
# /goHvLUnT0D/common/lib/libcairo.sprx
#  text: 000000080020c000:0000000800318000 r-x
#  data: 0000000800320000:0000000800324000 rw-
#  fingerprint: 66924f66c3b2bcfd5877f0b6b53b17c800000000
# /goHvLUnT0D/common/lib/libcurl.sprx
#  text: 0000000800324000:00000008003d0000 r-x
#  data: 00000008003d4000:00000008003d8000 rw-
#  fingerprint: d07498e9ec79386fc781c8feeea9aa2800000000
# /goHvLUnT0D/common/lib/libfontconfig.sprx
#  text: 00000008003d8000:0000000800450000 r-x
#  data: 0000000800454000:0000000800458000 rw-
#  fingerprint: f588f705527618061e0a9e633018197300000000
# /goHvLUnT0D/common/lib/libfreetype.sprx
#  text: 0000000800458000:0000000800500000 r-x
#  data: 0000000800508000:000000080050c000 rw-
#  fingerprint: 55f0bf21e56f35c305acd791696e05b100000000
# /goHvLUnT0D/common/lib/libharfbuzz.sprx
#  text: 000000080050c000:00000008005cc000 r-x
#  data: 00000008005d0000:00000008005d4000 rw-
#  fingerprint: 0e11f91a091308d571226554af07ce4000000000
# /goHvLUnT0D/common/lib/libicu.sprx
#  text: 00000008005d4000:0000000802504000 r-x
#  data: 0000000802524000:0000000802528000 rw-
#  fingerprint: 1ef63fd860c70ff5f8744411e1ba581800000000
# /goHvLUnT0D/common/lib/libpng16.sprx
#  text: 0000000802528000:000000080255c000 r-x
#  data: 0000000802560000:0000000802564000 rw-
#  fingerprint: 1bb1e4c3acb314d2dd52df2ca6a7a03e00000000
# /goHvLUnT0D/common/lib/libSceIpmi.sprx
#  text: 0000000802564000:0000000802570000 r-x
#  data: 0000000802574000:0000000802588000 rw-
#  fingerprint: d5f95ff9044c26f90ff63c82fb0bbf5c00000000
# /goHvLUnT0D/common/lib/libSceSysCore.sprx
#  text: 0000000802588000:0000000802590000 r-x
#  data: 0000000802594000:0000000802598000 rw-
#  fingerprint: d577567a554a7563ef2327c820bf0ee200000000
# /goHvLUnT0D/common/lib/libSceNet.sprx
#  text: 0000000802598000:00000008025d0000 r-x
#  data: 00000008025d4000:00000008026e8000 rw-
#  fingerprint: 979f14da6d4c7aa75cdd4d4b2f3281c900000000
# /goHvLUnT0D/common/lib/libSceNetCtl.sprx
#  text: 00000008026e8000:00000008026f0000 r-x
#  data: 00000008026f4000:00000008026f8000 rw-
#  fingerprint: 162fbdf7aa83706cc0992108ca3393ae00000000
# /goHvLUnT0D/common/lib/libSceRandom.sprx
#  text: 00000008026f8000:00000008026fc000 r-x
#  data: 0000000802700000:0000000802704000 rw-
#  fingerprint: 976d3ebefe3870b97bfa1d8e82f1df2d00000000
# /goHvLUnT0D/common/lib/libSceLibreSsl3.sprx
#  text: 0000000802704000:000000080288c000 r-x
#  data: 00000008028ac000:00000008028b0000 rw-
#  fingerprint: bd895ec678ab2becafd45e954fba828400000000
# /goHvLUnT0D/common/lib/libSceRegMgr.sprx
#  text: 00000008028b0000:00000008028b4000 r-x
#  data: 00000008028b8000:00000008028bc000 rw-
#  fingerprint: 50fe32bc796e1dbda2337287e42091d100000000
# /goHvLUnT0D/common/lib/libSceSystemService.sprx
#  text: 00000008028bc000:00000008028f8000 r-x
#  data: 00000008028fc000:0000000802908000 rw-
#  fingerprint: 6fead8bbcbbf7002bee44d4d2104c8d300000000
# /goHvLUnT0D/common/lib/libSceMbus.sprx
#  text: 0000000802908000:0000000802914000 r-x
#  data: 0000000802918000:000000080291c000 rw-
#  fingerprint: eaf5e1ec79a60c0293ad42c039a9ff1a00000000
# /goHvLUnT0D/common/lib/libSceAvSetting.sprx
#  text: 000000080291c000:0000000802928000 r-x
#  data: 000000080292c000:0000000802930000 rw-
#  fingerprint: 6a745bdbf97da42d23745852daa2afc700000000
# /goHvLUnT0D/common/lib/libSceVideoOut.sprx
#  text: 0000000802930000:0000000802948000 r-x
#  data: 000000080294c000:0000000802950000 rw-
#  fingerprint: 504c9ecf78fdc9adf3fcd3721dc3975100000000
# /goHvLUnT0D/common/lib/libSceVideoCoreServerInterface.sprx
#  text: 0000000802950000:0000000802960000 r-x
#  data: 0000000802964000:000000080296c000 rw-
#  fingerprint: 4613f400001d613dda147326d8ef133900000000
# /goHvLUnT0D/common/lib/libSceNKWebKitRequirements.sprx
#  text: 000000080296c000:0000000802bdc000 r-x
#  data: 0000000802be0000:0000000802be8000 rw-
#  fingerprint: aa200eff9a5fd90b0c6f12853aa1cbd200000000
# /goHvLUnT0D/common/lib/libSceNKWebKit.sprx
#  text: 0000000802be8000:00000008060b8000 r-x
#  data: 00000008062c0000:00000008062f8000 rw-
#  fingerprint: bc8a78e3ddb906f6d0de352329701c2600000000
# /goHvLUnT0D/common/lib/libSceGLSlimClientVSH.sprx
#  text: 00000008062f8000:0000000806318000 r-x
#  data: 000000080631c000:0000000806320000 rw-
#  fingerprint: 1cea1ecf4ffd91dc02ca2b7bc92c3c0a00000000
<118>[Syscore App] App Crash : PID=0x58, reason=0xb
<118>[Syscore App] Syscore Event Queue Push : SCE_SYSCORE_EVENT_APP_CRASH
<118>[Syscore App] Syscore Event Queue Pop : SCE_SYSCORE_EVENT_APP_CRASH
<118>[SceLncService] AppCrash: pid={0x00000058} appId={0x60000201} appLocalPid={0x102012a5}
<118>[SceLncService] getCoredumpSequence() isDebuggable={0} isKeepProcess={1} isUserDebugRequest={0} isLimitKeepProcess={0} enableCrashReport={1}
<118>[SceLncService] CoredumpSequence = {DUMP_PROCESS}
<118>[SceLncService] getCoredumpMode() isSystem={0x00000001}, reason={0x0000000b}
<118>[SceLncService] notifyAppCrash() pid={0x00000058}, appId={0x60000201}, appLocalPid={0x102012a5}, coredump.path,name,mode={/user/data/sce_coredumps/NPXS20001_1767544376/,NPXS20001_1767544376.sorbisdmp,1}, enableCrashReport={1}, skipVshDump={0}
<118>[SceLncService] enableCrashReport={1}, crashReportMode={1}, isAllowed={0}
<118>[SceLncService] kick coredump is disabled.
<118>[Syscore App] Kill process: 0x58
<118>[VCS]closeSession() [APP->VCS] clientPid = 0x58.
<118>[Syscore App] EVFILT_PROC NOTE_EXIT received : pid=0x58
<118>[Syscore App] Kill process: 0x58 => 0
<118>[Syscore App] process delete event : pid=0x58
<118>[AppMgr Trace]: pid=0x58, deleted.
<118>[Syscore App] Syscore Event Queue Push : SCE_SYSCORE_EVENT_ON_PROCESS_UNLOADED
<118>[AppMgr] checkAppTerminated pid=0x2a is still alive in 0x60000201
<118>[Syscore App] Syscore Event Queue Pop : SCE_SYSCORE_EVENT_ON_PROCESS_UNLOADED
<118>[SceShellUI] W/PSM.UI : ** NOTICE: LoadSync : Parent_BrowserMain : FrameModalScene
<118>[SceShellUI] I/PSM.UI : OnFocusActiveSceneChanged [BrowserMain : MainScene] -> [Parent_BrowserMain : FrameModalScene]
<118>[SceShellUI] I/PSM.UI :      Scene [Parent_BrowserMain : FrameModalScene] : Alive
<118>SetDeviceIndexBehavior: mode=SpecificUser, param=0x1a599820
<118>[Theme/I] : Apply [RED] : [Option:111111]: with preloaded user
<118>[SceShellCore] Libc Heap Status: free 38%, in-use 3794.3 KB, trend +18.1 KB/min, peak 4267.3 KB, when 19698 [sec]
<118>[SceShellCore] VM Stats: RSS 533.4, kernel 271.1, wire count 332.2, swap out 24.2, page table CPU 2526/6144 GPU 271/2048

익스플로잇 참고 사항

이 취약점은 postMessage를 통해 접근 가능한 안정적인 UAF 프리미티브를 제공합니다:

  1. 복잡한 객체 그래프가 postMessage를 통해 전송됨
  2. 역직렬화가 재귀적 객체 생성을 트리거함
  3. 역직렬화 중에 GC 사이클이 강제됨
  4. GC 안전하지 않은 컨테이너에서만 참조되는 객체가 해제됨
  5. 역직렬화가 댕글링 포인터를 계속 사용함

이를 통해 JavaScriptCore 내부 구조(예: StructureID, 버터플라이 포인터)의 제어된 메모리 손상이 가능해지며, 이 버그는 적절한 힙 셰이핑을 통해 안정적인 익스플로잇에 강력한 후보가 됩니다.


참고 자료

  • WebKit 보안 패치: https://github.com/WebKit/WebKit/commit/c9880de4a28b9a64a5e1d0513dc245d61a2e6ddb

크레딧

CVE-2023-28205는 Clément Lecigne (Google 위협 분석 그룹)과 Donncha Ó Cearbhaill (국제사면위원회 보안 연구소)에 의해 발견되었습니다.

원본 PoC 아이디어를 제공한 abc에게 감사드립니다.

ntfargo의 PoC 리포지토리 uaf-2023-28205 기반

도구 다운로드