PHP2Shell: PHP의 OOM 오류를 원격 코드 실행으로 바꾼 취약점 분석

PHP2Shell Deep Dive

PHP2Shell: PHP의 OOM 오류를 원격 코드 실행으로 바꾼 취약점 분석

2026년 공개된 CVE-2026-109618과 CVE-2026-109619는 PHP의 세션 처리와 메모리 부족(OOM) 오류가 맞물려 발생하는 use-after-free를 악용해 원격 코드 실행까지 이어지는 공격 체인을 보여준다. 이 심층 분석은 스택과 힙의 기본 개념부터 시작해 stale pointer, 힙 그루밍, zend_string 구조체 위조, pDestructor 하이재킹, 그리고 네 단계 파이프라인을 상세히 설명한다. 저자는 특정 PHP 빌드에 맞춰 모든 수치를 힙 분석으로 보정하며, 실제 운영 서버에서는 공격이 훨씬 어렵다고 강조한다.

PHP가 공격자에게 stale pointer를 일부러 건네주지는 않는다. 그 포인터는 합법적인 PHP 기능이 Zend Engine의 오류 처리 메커니즘과 상호작용하면서 생기는 미묘한 결함의 결과다.
  1. djad04

    이 글을 쓴 사람입니다. 원래 제가 직접 여기에 제출하려고 했는데 별로 성과가 없어서 다른 분이 공유해 주셔서 기쁘네요! 여기로 가져와 주셔서 감사합니다.

    또한 특정 빌드에 대해 작동하는 다른 PoC가 있다면 정말 감사히 공유해 주시면 좋겠습니다. 왜냐하면 익스플로잇이 작동하는 방식을 보면 다른 빌드에 대해 제가 찾은 다른 어떤 솔루션에서도 하지 않는 일을 하는데, 그 중 어느 것도 리사이즈로 자리를 잡고(키 "1050"이 두 번 전송됨) 다음 필드("1999")에서 중간 버퍼를 만들어 거기에 떨어뜨리는 방식을 사용하지 않습니다. 그런 식으로 반복 키를 사용하는 접근 방식은 제가 본 유일한 방법입니다.

    다른 빌드에 대한 솔루션처럼 그걸 달성할 더 직접적인 방법이 있는지 궁금합니다. 만약 있다면, 목표에 도달하는 방식보다는 메모리 조작 자체를 기준으로 서로 다른 접근 방식의 신뢰성을 비교하는 것이 흥미로울 것 같습니다.

  2. coderintherye

    훌륭한 글입니다! 시간을 따로 내서 실제로 깊이 파고들어 보세요.

  3. int122

    이 사이트를 읽다가 Firefox에서 결국 25GB RAM을 사용하게 됐네요. 뭐가 잘못된 거죠.

이 날의 다른 글

2026-11-10