
CVE-2026-82531에 대한 Python PoC 및 익스플로잇 체인: 위조된 SmartyNocache 마커를 통한 Smarty 템플릿 캐시 포이즈닝으로 PHP 코드 실행에 이르게 하며, 검사, 페이로드, Docker 랩을 포함합니다.
CVE-2026-82531 — smarty-php/smarty — extends + 템플릿 캐시 재생성 시 위조된 SmartyNocache 마커를 통한 코드 인젝션(CWE-94) → 캐시 include()에서의 RCE에 대한 Python 3 PoC입니다.
| 필드 | 값 |
|---|---|
| CVE | CVE-2026-82531 |
| 제품 | Smarty PHP 템플릿 엔진 |
| 영향 받는 버전 | < 4.5.8; 5.0.0 – 5.8.4 |
| 수정 버전 | 4.5.8, 5.8.5 |
| CWE | CWE-94 — 코드 생성의 부적절한 제어 |
| CVSS 4.0 | 9.2 Critical (CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N) |
| CVSS 3.1 | 8.1 High |
| PoCbit 카탈로그 | https://pocbit.org/pocs/ |
| PoCbit 페이지 | https://pocbit.org/pocs/cve-2026-82531 |
| 검증 마커 | POCBIT-82531-OK (HTTP 본문에 포함된 base64 명령 출력) |
| 권고문 | GHSA-3w63-v7pm-cq9x |
익스플로잇 초점: poc.py exploit은 워밍 → 캐시 삭제 → 포이즈닝(POST name=) → 트리거 순으로 실행합니다. check, payload, Docker lab/(Smarty 5.8.4)도 포함됩니다. 출력 파일: hits.txt, exploited.txt.
Smarty는 템플릿을 PHP로 컴파일하며 캐시된 출력을 기록할 수 있습니다. 템플릿이 extends: / 블록 상속을 사용할 때, 새로운 PHP 워커가 디스크에서 컴파일된 파일을 로드한 후 최상위 컴파일 함수가 nocache_hash를 설정하지 않은 채로 남길 수 있습니다.
캐시 재생성 중에 Smarty_Internal_Runtime_UpdateCache는 "nocache" 영역을 분할하는 정규식을 생성합니다. null 해시는 빈 정규식 대안을 만들어내므로, 공격자가 제어하는 assign() 데이터가 다음을 위조할 수 있습니다:
/*%%SmartyNocache:%%*/ <?php ... ?> /*/%%SmartyNocache:%%*/
해당 블록은 생성된 캐시 PHP 파일에 그대로(verbatim) 복사됩니다(일반적인 PHP 태그 무력화는 건너뜁니다). 캐시 파일을 include하는 다음 요청이 주입된 PHP를 실행합니다 → 원격 코드 실행.
exploit 하위 명령)| 단계 | 동작 |
|---|---|
| 1 워밍 | 무해한 name=world → 컴파일 + 초기 캐시 |
| 2 초기화 | 캐시 파일만 제거(컴파일된 템플릿은 유지) — 랩에서 ?lab_clear_cache=1 노출 |
| 3 오염 | name=<위조된 SmartyNocache + PHP shell_exec> → 오염된 캐시 기록됨 |
| 4 트리거 | 무해한 name=benign → include()가 주입된 PHP를 실행; 본문에 POCBIT-82531-OK:<base64> 포함 |
실제 대상에는 다음이 필요합니다: 캐싱 활성화, extends 템플릿, 사용자 제어 할당, 컴파일 디렉터리가 채워진 상태에서의 캐시 미스(TTL, 재시작 또는 관리자 플러시).
Smarty extends: / 상속 + 캐시를 사용하는 애플리케이션에서 nocache_hash가 null일 때, 공격자가 assign한 위조 SmartyNocache 블록이 캐시 PHP 파일에 원시 PHP로 기록됩니다. 다음 요청에서 include → RCE. PoCbit 패키지: Docker 랩 + exploit 전체 체인.
cd CVE-2026-82531
pip install -r requirements.txt
docker compose up --build -d
python poc.py check http://127.0.0.1:8088
python poc.py exploit --url http://127.0.0.1:8088 -c "id"
python poc.py exploit -i targets.example.txt -w 10 -c id
python poc.py payload -c "id"
패치 후: 모든 템플릿 캐시 파일을 삭제/재생성하세요.
승인된 보안 연구 및 본인이 소유하거나 테스트 권한을 가진 시스템에만 사용하세요.
NocacheHashInjectionTest.php (Smarty 5.8.5)CVE-2026-82531 — Smarty <4.5.8 / 5.x<5.8.5 cache-poisoning RCE (CWE-94, CVSS 4.0 9.2 AT:P). PoCbit PoC: extends+inheritance null nocache_hash → forged SmartyNocache marker in assign() → PHP in cache include. check/exploit/payload, Docker lab 5.8.4, hits.txt & exploited.txt. Fix 4.5.8 / 5.8.5. Marker POCBIT-82531-OK. https://pocbit.org/pocs/cve-2026-82531