1. 경로 조작(Path Traversal)의 위험성
CWE-22는 공격자가 입력값에 ../ (상위 디렉터리 이동 문자)와 같은 경로 제어 문자를 주입하여, 의도하지 않은 서버 내부 파일에 접근하는 취약점입니다. 이를 통해 공격자는 /etc/passwd와 같은 시스템 설정 파일이나 애플리케이션의 소스 코드, 로그 파일 등을 탈취할 수 있습니다. 이는 시스템의 기밀성을 완전히 파괴하는 치명적인 공격입니다.
2. 자원 삽입(Resource Injection)의 문제점
CWE-99는 사용자의 입력값이 파일 이름, 포트 번호, 스트림 등 시스템 자원을 식별하는 명칭으로 직접 사용될 때 발생합니다. 공격자가 이 값을 조작하면 시스템이 보호해야 할 중요한 자원을 임의로 수정하거나, 과도한 자원 할당을 유도하여 서비스 거부(DoS) 상태를 만들 수 있습니다. 경로 조작은 이 자원 삽입의 가장 대표적인 사례 중 하나입니다.
3. 실무적 대응: 경로 정규화와 화이트리스트 검증
가장 안전한 방법은 사용자가 파일의 경로를 직접 입력하게 하지 않는 것입니다.
• ID 매핑: 실제 경로 대신 데이터베이스의 ID(인덱스)를 전달받아 서버 내부에서 매핑된 경로를 찾습니다.
• 경로 정규화: 입력값에서 .., /, \ 등을 제거하거나, getCanonicalPath()를 사용하여 최종 도달 경로가 허용된 디렉터리 내에 있는지 반드시 확인해야 합니다.
• 화이트리스트: 접근 가능한 파일 목록을 미리 정의하고, 그 외의 요청은 즉시 차단합니다.
4. CWE-22/99 대응 및 안전한 로직 구현 자바 코드 예시
코멘트: 서버의 파일 시스템은 외부 사용자에게 절대 직접 노출되어서는 안 되는 성역입니다. 사용자의 입력을 경로의 일부로 쓸 때는 반드시 getCanonicalPath()를 통해 "최종적으로 도달하는 곳이 어디인지"를 검증하십시오. logger.debug()로 이상 접근 징후를 기록하되, 공격자가 시스템의 울타리를 넘으려는 시도를 원천 봉쇄하는 것이 시큐어 코딩의 핵심 방어 전략입니다.
댓글 달기