경로 조작 취약점(Path Traversal)

Path Traversal

설명

경로 조작 취약점은 부적절한 입력 검증으로 인해 애플리케이션이 제한 디렉터리 밖의 파일에 접근하거나 수정할 수 있는 보안 취약점입니다. 이로 인해 민감정보의 노출 또는 파일 손상 등이 발생할 수 있습니다.

잠재적 영향

  • 민감 데이터 노출: 제한 디렉터리를 벗어나 임의의 파일로 접근 가능.
  • 악의적 파일 조작: 파일 쓰기 및 덮어쓰기 취약점.

해결 방법

  • 사용자 입력을 경로 결합 함수에 전달 전에 정규화 및 검증하세요.
  • 파일명만 필요한 경우 path.basename()으로 최종 파일명 구성요소만 추출하되, 신뢰할 수 있는 기준 디렉터리와 함께 사용하세요.
  • 특수 문자나 허용되지 않은 디렉터리 경로를 필터링하고, 정규화된 결과가 기준 디렉터리 내부인지 확인하세요.
  • 프로세스의 파일 접근 권한을 필요한 범위로 제한하세요.

예시

변경 전

javascript
const path = require("path");
function unsafePathTraversal(user_input) {
  return path.join("/safeDir", user_input);
}

변경 후

javascript
const path = require("path");
function safePathTraversal(user_input) {
  const baseDir = path.resolve("/safeDir");

  // 파일명만 허용하는 경우: 디렉터리 구성요소를 제거하고 허용 문자만 통과
  const filename = path.basename(String(user_input || ""));
  if (!/^[a-zA-Z0-9._-]+$/.test(filename)) {
    return 'Access Denied';
  }

  const pathString = path.resolve(baseDir, filename);
  if (!pathString.startsWith(baseDir + path.sep)) {
    return 'Access Denied';
  }
  return pathString;
}

설명:

  • 변경 전: 입력값을 검증하지 않고 경로 결합에 사용하여, 공격자가 조작된 값을 통해 제한 디렉터리 밖의 영역을 접근할 수 있음.
  • 변경 후: 파일명만 필요한 흐름에서는 path.basename()으로 디렉터리 구성요소를 제거하고, 허용 문자 검증과 기준 디렉터리 내부 확인을 함께 수행하여 경로 문자열이 기준 디렉터리를 벗어나지 않게 합니다. 하위 경로를 허용할 때도 정규화된 결과의 포함 관계를 확인해야 합니다. 이 예시는 파일 시스템의 링크를 해석하지 않으므로, 실제 파일 접근에서는 심볼릭 링크와 검사 후 경로 변경도 고려해야 합니다.

참조