
CVE-2026-53767 + CVE-2026-53768 - Chyrp Lite ≤ 2026.01에서 uploads_path 차단 목록 우회 및 확장자 검증 누락을 통한 인증된 RCE
CVE-2026-53767 + CVE-2026-53768 - Chyrp Lite ≤ 2026.01("Iriomote")에서의 인증된 RCE
체인 공격:
uploads_path블록리스트 우회(CVE-2026-53768) +admin_update_upload()의 파일 확장자 검증 누락(CVE-2026-53767) →www-data권한으로 원격 코드 실행
Chyrp Lite ≤ 2026.01은 change_settings 및 edit_upload 권한(기본값: 관리자)을 가진 모든 사용자가 악용할 수 있는 인증된 원격 코드 실행 체인에 취약합니다.
| CVE | CVE-2026-53767 · CVE-2026-53768 |
| CVSS | 9.1 Critical (AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H) |
| 영향 범위 | xenocrat/chyrp-lite ≤ 2026.01 |
| 패치 | 커밋 1489dc9 |
| 보안 공지 | GHSA-8h86-c24h-5jp3 · GHSA-r9w7-5h94-wq5x |
| 제보자 | iltosec |
python chyrp_rce_poc.py -h
usage: chyrp_rce_poc.py [-h] -u URL -U USERNAME -P PASSWORD [-c CMD] [-i]
[--config CONFIG] [--restore RESTORE]
python chyrp_rce_poc.py -u http://127.0.0.1/chyrp -U admin -P 'fJ945@5:3s8v+X:'
python chyrp_rce_poc.py -u http://127.0.0.1/chyrp -U admin -P 'fJ945@5:3s8v+X:' -c 'cat /etc/passwd'
python chyrp_rce_poc.py -u http://127.0.0.1/chyrp -U admin -P 'fJ945@5:3s8v+X:' -i
1단계 - 인증
2단계 - uploads_path를 블록리스트에 없는 tools/로 변경
image
image
3단계 - tools/docgen.php 덮어쓰기(교체 파일에 대한 확장자 검사 없음)
image
image
4단계 - 실행
http://127.0.0.1/chyrp/tools/docgen.php?cmd=id
image
uploads_path 블록리스트includes/controller/Admin.php는 하드코딩된 블록리스트를 기준으로 uploads_path를 검증합니다:
admin | ajax | feathers | fonts | includes | modules | themes
Chyrp Lite에 포함되어 실행 가능한 .php 파일(docgen.php, gettext.php, triggers.php)을 포함하는 tools/ 디렉터리는 목록에 없습니다. uploads_path=tools를 제출하면 검증을 통과하고 config.json.php에 저장됩니다.
admin_update_upload()의 확장자 검증 누락upload_tester()(includes/helpers.php)는 PHP 업로드 오류 코드와 파일 크기만 확인하며, 교체 파일에 대한 확장자 검증을 수행하지 않습니다. 대상 파일 이름은 $_POST['file']에서 가져와 현재 uploads_path를 기준으로 확인됩니다. tools/docgen.php가 이미 존재하므로(is_file() 검사 충족) 임의의 내용으로 경고 없이 덮어써집니다.
참고:
--config플래그는 CSRF 토큰 계산을 위해config.json.php를 가리킵니다. 파일을 로컬에서 읽을 수 없는 경우 스크립트는 HTML 응답에서 토큰을 자동으로 추출하는 방식으로 대체합니다.
커밋 1489dc9 이상을 포함하는 버전으로 업데이트하세요.
두 가지 독립적인 수정이 적용되었습니다:
수정 1 - uploads_path 블록리스트에 tools(및 licenses) 추가:
// Before
"/^$qdir((admin|ajax|feathers|fonts|includes|modules|themes)$qdir|$)/"
// After
"/^$qdir((admin|ajax|feathers|fonts|includes|licenses|modules|themes|tools)$qdir|$)/"
수정 2 - admin_update_upload()에서 업로드된 파일의 확장자를 화이트리스트와 대조하여 검증:
$new_extension = strtolower(pathinfo($_FILES['upload']['name'], PATHINFO_EXTENSION));
$whitelist = upload_filter_whitelist();
if (!in_array($new_extension, $whitelist))
error(__("Error"), __("File type is not allowed."), code: 422);
이 PoC는 교육 및 연구 목적으로만 공개됩니다. 직접 소유하거나 명시적인 서면 허가를 받은 시스템에 대해서만 사용하세요. 저자는 어떠한 오용에 대해서도 책임을 지지 않습니다.