메뉴 건너뛰기

app

서버의 경계를 넘나드는 위험: CWE-22 경로 조작 및 CWE-99 자원 삽입

suritam92026.01.17 17:51조회 수 2댓글 0

    • 글자 크기

1. 경로 조작(Path Traversal)의 위험성

CWE-22는 공격자가 입력값에 ../ (상위 디렉터리 이동 문자)와 같은 경로 제어 문자를 주입하여, 의도하지 않은 서버 내부 파일에 접근하는 취약점입니다. 이를 통해 공격자는 /etc/passwd와 같은 시스템 설정 파일이나 애플리케이션의 소스 코드, 로그 파일 등을 탈취할 수 있습니다. 이는 시스템의 기밀성을 완전히 파괴하는 치명적인 공격입니다.

2. 자원 삽입(Resource Injection)의 문제점

CWE-99는 사용자의 입력값이 파일 이름, 포트 번호, 스트림 등 시스템 자원을 식별하는 명칭으로 직접 사용될 때 발생합니다. 공격자가 이 값을 조작하면 시스템이 보호해야 할 중요한 자원을 임의로 수정하거나, 과도한 자원 할당을 유도하여 서비스 거부(DoS) 상태를 만들 수 있습니다. 경로 조작은 이 자원 삽입의 가장 대표적인 사례 중 하나입니다.

3. 실무적 대응: 경로 정규화와 화이트리스트 검증

가장 안전한 방법은 사용자가 파일의 경로를 직접 입력하게 하지 않는 것입니다.

ID 매핑: 실제 경로 대신 데이터베이스의 ID(인덱스)를 전달받아 서버 내부에서 매핑된 경로를 찾습니다.

경로 정규화: 입력값에서 .., /, \ 등을 제거하거나, getCanonicalPath()를 사용하여 최종 도달 경로가 허용된 디렉터리 내에 있는지 반드시 확인해야 합니다.

화이트리스트: 접근 가능한 파일 목록을 미리 정의하고, 그 외의 요청은 즉시 차단합니다.

4. CWE-22/99 대응 및 안전한 로직 구현 자바 코드 예시

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
 
public class SecureFileProvider {
    private static final Logger logger = LoggerFactory.getLogger(SecureFileProvider.class);
    private static final String SAFE_DIRECTORY = "/app/data/uploads/";
 
    public void downloadFile(String fileName) {
        try {
            // [CWE-22/99 조치] 입력값에서 경로 제어 문자 제거 (기본 필터링)
            String filteredName = fileName.replaceAll("\\.\\.", "").replaceAll("[/\\\\]", "");
            
            File file = new File(SAFE_DIRECTORY, filteredName);
            String canonicalPath = file.getCanonicalPath();
 
            // [핵심 검증] 정규화된 최종 경로가 허용된 디렉터리 하위에 있는지 확인
            if (!canonicalPath.startsWith(SAFE_DIRECTORY)) {
                logger.debug("Security Violation: Path Traversal attempt detected! -> {}", fileName);
                throw new SecurityException("Illegal file access attempt.");
            }
 
            logger.debug("File access granted: {}", canonicalPath);
            // 파일 읽기 로직 수행...
 
        } catch (IOException e) {
            // [CWE-754, CWE-390] 파일 접근 오류 처리
            logger.debug("File I/O error: {}", e.getMessage());
        } catch (Exception e) {
            // [CWE-209] 상세 경로 노출 방지
            logger.debug("An unexpected error occurred during file access.");
        }
    }
}

코멘트: 서버의 파일 시스템은 외부 사용자에게 절대 직접 노출되어서는 안 되는 성역입니다. 사용자의 입력을 경로의 일부로 쓸 때는 반드시 getCanonicalPath()를 통해 "최종적으로 도달하는 곳이 어디인지"를 검증하십시오. logger.debug()로 이상 접근 징후를 기록하되, 공격자가 시스템의 울타리를 넘으려는 시도를 원천 봉쇄하는 것이 시큐어 코딩의 핵심 방어 전략입니다.

 
    • 글자 크기
서버의 통제권을 빼앗는 CWE-78 운영체제 명령어 삽입 (by suritam9) 시스템의 제어권을 빼앗는 CWE-94, CWE-95 코드 삽입 (by suritam9)

댓글 달기

첨부 (0)
위로