경로 조작 (Path Traversal)
Path Traversal
설명
Path Traversal은 사용자 입력을 파일 경로에 그대로 사용해 상위 디렉터리(../) 등으로 탈출하여 애플리케이션이 의도하지 않은 위치의 파일을 읽거나 쓰게 되는 취약점입니다. 공격자는 ../../ 등의 패턴이나 절대경로를 이용해 시스템 파일, 애플리케이션 소스, 설정 파일 등을 접근할 수 있습니다. 업로드/압축해제(zip) 처리에서는 Zip Slip 기법으로 상위 디렉터리에 임의 파일을 덮어쓸 수 있습니다.
잠재적 영향
민감정보 노출: ../../ 등을 통해 /etc/passwd, 앱 설정/소스코드를 읽어 비밀값(토큰, DB 비밀번호) 유출
임의 파일 덮어쓰기(Zip Slip): 업로드/압축해제 시 상위 디렉터리 파일을 덮어써 백도어 심기 가능
서비스 장애: 로그/설정 파일 변조로 서비스 중단, 데이터 손상 유발
간접적 권한 상승: authorized_keys, crontab 등 특정 파일을 덮어쓰면 명령 실행로 이어질 수 있음
해결 방법
고정 루트 디렉터리(Base Dir) 강제: 처리할 모든 경로는 미리 정한 절대경로(baseDir) 하위여야 합니다. filepath.Join으로 결합 후 strings.HasPrefix로 baseDir 내부인지 확인합니다(경로 구분자 고려).
파일명만 필요할 때: filepath.Base로 디렉터리 성분 제거. fs.ValidPath를 병행 사용.
절대경로/상위 이동 차단: 입력값에 절대경로, .., NUL 등 금지. Clean은 보조 수단이며 단독 사용만으로는 충분치 않습니다.
심볼릭 링크 주의: 디스크에 쓸 때는 필요 시 EvalSymlinks로 최종 목적지가 baseDir 내부인지 재검증.
확장자/화이트리스트: 허용된 확장자와 최대 길이, 경로 깊이 제한.
zip 처리(Zip Slip 방지): 각 엔트리에 대해 filepath.Base 또는 baseDir prefix 검증 후에만 쓰기. 절대경로/.. 포함 시 즉시 중단하고 전체 작업 실패 처리.
에러 시 중단 및 로깅: 하나라도 검증 실패 시 작업을 중단하고 감사 로그를 남깁니다.
취약한 코드 및 안전한 코드 예시
취약한 코드
안전한 코드
설명:
취약한 코드: 사용자 입력을 filepath.Join으로만 결합하여 사용했습니다. Join은 Clean을 수행하므로 ../../ 등을 정규화하지만, 그 결과가 baseDir 바깥 경로가 될 수 있어 상위 디렉터리로 탈출(Path Traversal)이 가능합니다. 따라서 공격자가 시스템 임의 파일을 읽을 수 있습니다.
안전한 코드: 항상 고정된 baseDir와 결합한 뒤, 정규화(clean)된 최종 경로가 baseDir 하위인지 접두사 검사(strings.HasPrefix + 경로 구분자)로 검증합니다. 필요하면 파일명만 사용하도록 filepath.Base를 적용하고, 확장자 화이트리스트 등 추가 검증을 수행합니다. 이로써 상위 디렉터리 탈출과 Zip Slip 류의 경로 조작을 효과적으로 차단합니다.
참조
Last updated