경로 순회

OWASP 카테고리: MASVS-STORAGE: 저장소

개요

경로 순회 취약점은 유효성 검증 없이 파일 시스템 API로 전달되는 경로의 일부를 공격자가 제어할 수 있는 경우에 발생합니다. 이로 인해 승인되지 않은 파일 시스템 작업이 발생할 수 있습니다. 예를 들어, 공격자는 ../와 같은 특수문자를 사용하여 타겟팅된 디렉터리 외부를 순회하는 방식으로 리소스 타겟을 예기치 않게 변경할 수 있습니다.

영향

이 취약점의 영향은 작업 및 파일 콘텐츠에 따라 달라지지만, 일반적으로 파일 덮어쓰기(파일에 쓸 때), 데이터 유출(파일을 읽을 때) 또는 권한 변경(파일/디렉터리 권한을 변경할 때)으로 이어집니다.

완화 조치

File.getCanonicalPath()를 사용하여 경로를 표준화하고 접두사를 예상 디렉터리와 비교합니다.

Kotlin

@Throws(IllegalArgumentException::class)
fun saferOpenFile(path: String, expectedDir: String?): File {
    val f = File(path)
    val canonicalPath = f.canonicalPath
    require(canonicalPath.startsWith(expectedDir!!))
    return f
}

자바

public File saferOpenFile (String path, String expectedDir) throws IllegalArgumentException {
  File f = new File(path);
  String canonicalPath = f.getCanonicalPath();
  if (!canonicalPath.startsWith(expectedDir)) {
    throw new IllegalArgumentException();
  }
  return f;
}

추가적인 권장사항은 예상되는 결과만 발생하도록 유효성 검증을 사용하는 것입니다. 예를 들면 다음과 같습니다.

  • 우발적인 덮어쓰기가 이루어지지 않도록 파일이 이미 있는지 확인합니다.
  • 데이터 유출이나 올바르지 않은 권한 변경을 방지하기 위해 타겟팅된 파일이 예상된 타겟인지 확인합니다.
  • 작업의 현재 디렉터리가 표준 경로의 반환 값에 예상되는 것과 정확히 일치하는지 확인합니다.
  • 작업이 루트 권한으로 실행되고 있지 않은지 확인하는 등 권한 시스템의 범위가 해당 작업으로 명시되었는지 확인하고, 디렉터리 권한의 범위가 지정된 서비스 또는 명령어로 지정되었는지 확인합니다.