Searchlight Cyber wp2shell WordPress RCE discovered with GPT‑5.6 Sol Ultra for $25

Searchlight Cyber wp2shell WordPress RCE discovered with GPT‑5.6 Sol Ultra for $25

TL;DR

Searchlight Cyber는 GPT‑5.6 Sol Ultra를 활용해 WordPress의 Batch API에서 사전 인증 SQL 인젝션을 찾아내고, 이를 캐시 포이즈닝, 임베드 남용, 악성 customize_changeset와 연결해 기본 WordPress 설치에서 원격 코드 실행(RCE)을 달성했습니다—계산 비용은 대략 $25에 불과합니다. 이 익스플로잇은 왜 익스플로잇 브로커들이 WordPress RCE에 $500 k를 지불할 의향이 있는지를 보여줍니다.


The Prompt That Started the Hunt

연구자는 OpenAI의 Cycle Double Cover (CDC) 프롬프트를 변형한 6시간 분량, 4에이전트 프롬프트를 GPT‑5.6 Sol Ultra에 제공했습니다. 프롬프트는 모델에게 다음을 지시했습니다:

  • WordPress 소스 트리를 폐쇄된 코드베이스(인터넷, changelog 없음)로 취급한다.
  • 다양한 공격 표면(입력 파싱, 직렬화, 레이스 컨디션 등)을 탐색한다.
  • 최대 4개의 에이전트를 적극적으로 생성하고, 진행 상황에 따라 동적으로 노력 배분을 재조정한다.
  • 일반적인 MySQL 기반 배포에서 /flag를 읽을 수 있는 완전한 사전 인증 RCE 체인을 만든다.

연구자는 최신 안정 버전 WordPress를 wordpress‑ctf/main/에 복제하고 third_party/를 비워 두어 모델이 핵심 코드만을 사용하도록 강제했습니다.

The Core Bug: Batch API Validation Desynchronisation

WordPress의 REST Batch API는 모든 하위 요청을 첫 번째 루프에서 검증하고, 두 번째 루프에서 실행합니다. 검증 루프는 두 개의 병렬 배열 $matches(핸들러 참조)와 $validation(검증 결과)을 채웁니다. 요청이 is_wp_error($single_request)에 걸리면 코드는 계속 진행하면서 $matches에 해당 항목을 추가하지 않습니다:

if ( is_wp_error( $single_request ) ) {
    $has_error    = true;
    $validation[] = $single_request;
    continue;               // <-- $matches not updated
}

이 오프‑바이‑원 이동으로 인해 인덱스 i의 검증 결과가 인덱스 i+1의 핸들러에 적용될 수 있습니다. 공격자는 무해한 요청을 검증하고, 다른 취약한 요청의 핸들러로 실행시킬 수 있게 됩니다.

The First Exploit Primitive: A Pre‑Auth SQL Injection

GET /wp/v2/posts 엔드포인트는 author__not_in 파라미터를 사용해 SQL WHERE 절을 구성합니다. 파라미터가 스칼라 문자열인 경우 WordPress는 이를 이스케이프 없이 직접 삽입합니다:

$author__not_in = implode(',', (array) $query_vars['author__not_in']);
$where .= " AND {$wpdb->posts}.post_author NOT IN ($author__not_in) ";

보통 REST 스키마는 author__not_in을 배열로 강제하고, 각 요소를 absint로 정제합니다. Batch API 동기화 오류를 이용하면 공격자는 스칼라 문자열(예: "0) OR 1=1 -- ")을 다른 요청의 검증에 전달하고, 실행GET /wp/v2/posts 핸들러에서 이루어져 고전적인 SQL 인젝션을 발생시켜 모든 행을 반환합니다.

Payload Example (recursive batch call)

POST /wp-json/batch/v1
{
  "requests": [
    {"method":"POST","path":"http://:"},
    {"method":"POST","path":"/wp/v2/posts","body":{
      "requests":[
        {"method":"GET","path":"http://:"},
        {"method":"DELETE","path":"/wp/v2/posts/1","body":{"author_exclude":"0) OR 1=1 -- "}},
        {"method":"GET","path":"/wp/v2/posts"}
      ]
    }},
    {"method":"POST","path":"/batch/v1"}
  ]
}

외부 요청이 HTTP 메서드 검증을 비동기화하고, 내부 요청이 author_exclude 파라미터를 비동기화해 인젝션을 전달합니다.

From SQLi to RCE: Chaining Gadgets

연구자는 GPT‑5.6이 SQLi 이후에도 계속 진행하도록 하여 다단계 체인을 만들었습니다:

  1. Cache Poisoning – WordPress는 요청당 WP_Post 객체를 캐시합니다. SQLi를 통해 조작된 행을 반환하면 공격자는 post_content를 포함한 메모리 내 포스트 표현을 제어합니다.
  2. Embed Abuse – 로컬 포스트([embed]/?p=10[/embed])를 임베드하면 데이터베이스에 oembed_cache 행이 생성됩니다. 공격자는 임의의 post_typepost_content를 가진 행을 만들 수 있습니다.
  3. Customize Changesetcustomize_changeset 포스트는 JSON diff를 저장하며, 페이로드에 포함된 user_id가 적용됩니다. user_id1(관리자)로 강제하면 WordPress가 일시적으로 관리자 권한으로 실행됩니다.
  4. Parent‑Cycle Gadget – WordPress는 포스트‑부모 계층에서 사이클을 감지하고, 발견 시 wp_update_post(['ID'=>X,'post_parent'=>0])를 호출합니다. 이 호출은 post_content를 덮어쓰지 않아 공격자가 제어한 콘텐츠가 지속됩니다.
  5. Hook Replay – 사이클 가젯을 이용해 parse_request 액션("{$new_status}_{$post_type}")을 트리거할 수 있습니다. do_action('parse_request', …)를 호출하면 전체 Batch API 요청이 가정된 관리자 권한으로 다시 실행됩니다.
  6. Admin Account Creation – 두 번째 패스에서 이전에 실패했던 새 관리자 사용자 생성 요청이 이제 관리자 권한으로 성공합니다.
  7. Back‑door Plugin Upload – 관리자 계정으로 악성 플러그인 ZIP을 업로드해 서버에 지속적인 코드 실행을 달성합니다.

Cost, Timeline, and Impact

  • Compute cost: $25 (≈ $200 주간 GPT‑5.6 Sol Ultra 구독 비용의 50 %).
  • Time to full chain: 모델 실행 10시간 이상 + 인간 분석 1일.
  • Scope: WordPress는 5억 개 이상의 사이트에 사용됩니다; 기본 설정에서의 사전 인증 RCE는 심각하고 고위험 취약점입니다.
  • Market value: 익스플로잇 브로커들은 신뢰할 수 있는 WordPress RCE에 $500 k를 지급한다는 보고가 있어 헤드라인 주장을 설명합니다.

Community Reaction (Hacker News Comments)

  • 일부 댓글러는 $500 k 수치에 의문을 제기하며, 기사에서 브로커 보상이 과장됐을 수 있다고 지적합니다.

    "There is no evidence that $500k has been paid or would be paid for an exploit like this one." – Zsfe510asG

  • 다른 이들은 기술적 깊이를 높이 평가하며, 과거 AI‑지원 익스플로잇과 비교해 글을 찬양합니다.

    "That was an incredible writeup! … LLMs level the field." – cadamsdotcom

  • 몇몇은 모델 가드레일과 AI‑생성 익스플로잇 윤리에 대해 우려를 표합니다.

    "I’m surprised GPT‑5.6 didn’t block that prompt due to guardrails." – raesene9

  • 회의론자들은 취약점 공개 여부와 패치 상태를 확인하려 합니다.

    "Is this real? … I’m not seeing any mention where they report this to WP or the patch." – tantalor

Why This Matters

  • Proof of concept: 이 체인은 최첨단 LLM이 최소한의 계산 비용으로 새로운 사전 인증 WordPress RCE를 발견할 수 있음을 증명합니다.
  • Economic incentive: $500 k 현상금은 이러한 제로데이에 대한 강력한 시장 수요를 보여주며, 방어자와 공격자 모두 AI‑지원 연구를 채택하도록 동기를 부여합니다.
  • Defensive implications: 기존 정적 분석으로는 Batch API 동기화 오류를 놓쳤으며, 방어자는 유사한 논리 결함을 탐지하기 위해 AI‑기반 코드 이해 도구를 도입해야 합니다.
  • Future of security research: LLM이 점점 더 강력해짐에 따라 병목 현상은 버그 탐색에서 프롬프트 엔지니어링, 익스플로잇 체이닝, 검증으로 이동합니다—다음 세대 보안 팀이 장악할 핵심 역량이 될 것입니다.

Mitigation steps (as of the publication date):

  1. Batch API 검증 버그가 패치된 최신 WordPress 릴리스로 업데이트합니다.
  2. 필요하지 않은 경우 Batch API (/wp-json/batch/v1)를 비활성화합니다.
  3. 인증 및 속도 제한을 적용해 REST API를 강화합니다.
  4. 예상치 못한 oembed_cache 행이나 customize_changeset 생성 여부를 모니터링합니다.
  5. 향후 코드에서 검증/실행 불일치를 탐지하기 위해 AI‑지원 정적 분석을 활용합니다.

전체 기술 세부 사항(정확한 페이로드와 GitHub‑스타일 PoC 포함)은 위에 링크된 Searchlight Cyber 연구 페이지에서 확인할 수 있습니다.

Sources