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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
POC-for-CVE-2023-41993 | Kitploit
도구/GitHubGitHub/po6ix/poc-for-cve-2023-41993
Vulnerability AnalysisExploitationWeb Application ExploitationPayload DevelopmentBinary Exploitation
GitHubpo6ix/poc-for-cve-2023-41993

POC-for-CVE-2023-41993

저장소 보기
202372년 전Kitploit 검토 완료

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2023-41993

CVE-2023-41993용 PoC 익스플로잇입니다. addrof/fakeobj까지만 작성되어 있습니다. 신뢰성은 좋지 않습니다. 더 개선하고 싶다면 structure ID를 스프레이해 보세요.

POC 링크

https://po6ix.github.io/POC-for-CVE-2023-41993/pwn.html

여러 요청이 있어서 github pages로 호스팅하기로 결정했습니다.
github가 저를 차단하지 않길 바랍니다...

알려진 영향 받는 버전

  • MacOS 14.0
  • iOS 17.0, 17.1 beta 1
  • iPadOS 17.0

알려진 영향 받지 않는 버전

  • iOS 16.1.1, 16.2, 16.5, 16.5.1, 16.6 beta 1, 16.6.1, 16.7.1, 17.1 RC
  • iPadOS 17 beta 1

Q/A

그냥 크래시만 발생해요

pwn 함수에 정의된 factor 값이 여러분의 기기와 맞지 않기 때문입니다.
그러한 경우를 위해 87에서 1088 사이의 임의 값을 사용하도록 만들었습니다.
그러니 그냥 여러 번 새로고침하면 올바른 factor 값을 찾을 수 있습니다.
확률적으로 100회 안에 동작해야 합니다.
성공한 경우 표시되는 정보를 보내주시면 더 좋을 것 같습니다.

그럼 이걸로 무엇을 할 수 있나요?

이것은 safari webcontent 프로세스에 대한 r/w 프리미티브를 제공합니다.
하지만 실제로 유용하게 만들려면 다른 컴포넌트와 체이닝해야 합니다.

간단한 설명

이에 대한 상세한 writeup을 원하실 수도 있습니다. 하지만 안타깝게도 그것을 작성할 시간이 없습니다. 그래서 여기에 몇 가지 메모를 적어 두니 작동 방식을 이해하는 데 도움이 되길 바랍니다.

커밋을 보면 HeapLocation에 대한 변경 사항입니다. 노드들이 같은지 여부를 알기 위한 새로운 factor가 추가되었습니다. GetByOffset, MultiGetByOffset 같은 노드들이 혼동될 수 있다고 알려줍니다. 하지만 실제로는 offset에만 관련된 것입니다. 서로 다른 offset을 가진 두 개의 GetByOffset 노드가 있다고 가정해 봅시다. 그중 하나는 CSE되고 남은 하나가 대신 사용됩니다. 그래서 기본적으로 offset 혼동이지만 임의의 offset에 대한 접근을 제공하지는 않습니다. 왜냐하면 그러한 유형의 노드를 CSE하려면 LICMPhase에 의해 hoist되어야 하기 때문입니다. 쓰기 작업을 수행하는 노드 종류는 이 단계에서 hoist가 허용되지 않습니다. 따라서 PutByOffset, MultiPutByOffset 노드에는 동일한 혼동이 발생하지 않습니다. 또한 GetByOffset이 hoist될 때 safeToExecute 함수가 호출되어 노드가 실행 가능한지 확인하고 storage 용량(inline/ool)보다 작은 offset에만 접근하도록 허용합니다. 그래서 이 취약점을 악용하기 위한 아이디어는 GetterSetter였습니다. Object.__defineGetter__를 호출하여 속성을 정의하면 GetterSetter 객체가 생성되지만 속성 저장소에 저장되며 일반적으로 접근할 수 없습니다. 하지만 여러분이 가진 이 offset 조작으로 접근할 수 있습니다. 그런 다음 Object 함수를 호출하여 타입 혼동을 트리거합니다.

root@kitploit:~
JSObject* JSCell::toObjectSlow(JSGlobalObject* globalObject) const
{
    Integrity::auditStructureID(structureID());
    ASSERT(!isObject());
    if (isString())
        return static_cast<const JSString*>(this)->toObject(globalObject);
    if (isHeapBigInt())
        return static_cast<const JSBigInt*>(this)->toObject(globalObject);
    ASSERT(isSymbol());
    return static_cast<const Symbol*>(this)->toObject(globalObject);
}

이것은 GetterSetter를 내부 값으로 갖는 SymbolObject를 생성합니다. 그리고 이것은 잘못된 것입니다. SymbolObject의 내부 값은 GetterSetter가 아닌 Symbol 인스턴스여야 하기 때문입니다.

root@kitploit:~
let getterSetter = jitme(1);
let symbolObject = Object(getterSetter);

symbolObject.description; // getter 호출
root@kitploit:~
String Symbol::description() const
{
    auto& uid = m_privateName.uid();
    return uid.isNullSymbol() ? String() : uid;
}

그런 다음 description getter를 호출하면 String 인스턴스가 반환됩니다. 이것은 Symbol.m_privateName과 GetterSetter.m_getter 사이의 타입 혼동입니다. 이 getter를 호출할 때마다 0x0 오프셋에 있는 m_privateName.m_uid의 참조 카운터 필드가 증가합니다. 이것은 매우 유용합니다. 왜냐하면 이 오프셋이 getter 함수의 structure ID가 있는 위치이기 때문입니다. 이 함수를 여러 번 호출하면 JSFunction 인스턴스의 structure ID를 변경할 수 있습니다. 저는 많은 속성을 가진 다른 타입을 준비했습니다. 그런 다음 structure ID를 그것과 동일하게 동기화하면 속성 저장소에 oob 쓰기를 할 수 있습니다. 이것은 직접적으로 addrof/fakeobj 프리미티브를 제공합니다.

참고

  • Int64 모듈: https://github.com/saelo/jscpwn
도구 다운로드