
공식 eml-parser 예제 스크립트의 경로 탐색 취약점을 시연하며, 조작된 첨부 파일 이름을 통해 임의 파일 쓰기를 허용하고, PoC 및 수정 사항을 포함합니다.
공식 예제 스크립트 examples/recursively_extract_attachments.py에는 의도된 출력 디렉터리 외부에 임의 파일을 쓸 수 있는 경로 탐색 취약점이 존재합니다. 파싱된 이메일에서 추출된 첨부 파일 이름이 어떠한 검증 없이 출력 파일 경로를 구성하는 데 직접 사용되어, 공격자가 제어하는 파일 이름이 대상 디렉터리를 벗어날 수 있습니다.
파일: examples/recursively_extract_attachments.py
줄: 61–64
for a in m['attachment']:
out_filepath = out_path / a['filename'] # No sanitization
print(f'\tWriting attachment: {out_filepath}')
with out_filepath.open('wb') as a_out:
a_out.write(base64.b64decode(a['raw']))
a['filename'] 값은 조작된 이메일 첨부 파일 헤더를 통해 공격자가 제어할 수 있습니다:
Content-Disposition: attachment; filename="../outside/pwned.txt"
쓰기 전에 경로 정규화나 경계 검증이 수행되지 않습니다.
.eml 파일을 생성합니다:Content-Disposition: attachment; filename="../outside/pwned.txt"
python recursively_extract_attachments.py -p ./emails -o ./safe
./safe/pwned.txt./outside/pwned.txt ← 의도된 디렉터리 외부에 쓰여짐가상 환경에서 pip으로 설치된 eml-parser를 사용하여 Kali Linux에서 검증했습니다.
이 취약점은 예제 스크립트에만 국한되며 핵심 eml-parser 라이브러리에는 영향을 미치지 않습니다. 그러나 이 스크립트는 공식 저장소의 일부이며 프로덕션 환경에 적용될 가능성이 높으므로, 공격자가 조작된 이메일을 제공하면 실행 컨텍스트 내에서 임의 파일 쓰기를 달성할 수 있습니다.
잠재적 공격 시나리오는 다음과 같습니다:
filename="../../etc/cron.d/backdoor"filename="../../var/www/html/shell.php"filename="../../home/user/.ssh/authorized_keys"import os.path
for a in m['attachment']:
filename = os.path.basename(a['filename'])
out_filepath = out_path / filename
if not out_filepath.resolve().is_relative_to(out_path.resolve()):
print(f'[!] Skipping suspicious filename: {a["filename"]}')
continue
print(f'\tWriting attachment: {out_filepath}')
with out_filepath.open('wb') as a_out:
a_out.write(base64.b64decode(a['raw']))