OSSCA Chromium

기여 목록 / 8468307

FileSystem: Prioritize permission errors for isolated sibling paths

ContentfixMerged

드래그앤드롭으로 등록한 isolated 파일 시스템에서 복사·이동 권한이 없는데도 URL 오류가 먼저 반환되던 경우를 수정했습니다. 문법적으로 유효한 같은 파일 시스템의 최상위 형제 경로에 한해 권한 오류를 우선하고, 잘못된 URL의 기존 오류 처리는 유지합니다.

문제 설명

드래그앤드롭으로 등록한 파일과 같은 디렉터리에 새 이름을 지정하면, 그 목적지는 isolated 파일 시스템에 아직 등록되지 않은 최상위 형제 항목일 수 있습니다. 이때 목적지 URL을 내부 파일 시스템 경로로 해석하는 CrackURL()이 실패합니다.

기존 FileSystemManagerImpl::Copy()와 Move()는 권한을 확인하기 전에 목적지 URL 검증 오류를 반환했습니다. 따라서 읽기 권한만 부여된 파일을 복사하거나 이동하려 해도, copyTo()와 moveTo()에서는 권한 문제 대신 EncodingError가 보고됐습니다.

해결 내용

  1. 미등록 형제 경로를 제한적으로 판별

    IsUncrackedTopLevelSiblingInIsolatedFileSystem()으로 원본이 isolated 파일 시스템의 최상위 항목인지 확인합니다. 목적지도 같은 출처·파일 시스템 ID의 최상위 형제 경로여야 합니다.

    파싱된 경로만으로는 인코딩된 구분자나 NUL을 놓칠 수 있어 원래 URL의 경로도 검사합니다. 파일 이름을 디코딩한 뒤 비어 있지 않은 UTF-8인지 확인하고, /, \, NUL이 포함된 이름은 이 예외 처리에서 제외합니다.

  2. 복사와 이동의 권한을 각각 확인

    원본 URL 검증은 먼저 수행합니다. 목적지 검증이 실패한 경우 위 조건에 해당할 때만 ReplyToInvalidCopyOrMoveDestination()을 통해 UI 스레드에서 CanCopyFileSystemFile() 또는 CanMoveFileSystemFile()을 호출합니다.

    isolated 파일 시스템의 권한은 파일 시스템 단위로 부여되므로, 해석할 수 없는 목적지 대신 같은 파일 시스템의 원본 URL을 두 인자로 전달해 필요한 권한을 검사합니다.

  3. 오류 우선순위만 변경

    필요한 권한이 없으면 FILE_ERROR_SECURITY를 반환합니다. 권한이 있어도 미등록 목적지가 유효해지는 것은 아니므로 FILE_ERROR_INVALID_URL을 반환합니다. 문법이 잘못됐거나 같은 파일 시스템의 형제 경로가 아닌 목적지는 기존 검증 결과를 유지합니다.

테스트 방법

file_system_url_drag_drop_browsertest.cc에 IsolatedCopyMoveErrorPrecedence 브라우저 테스트를 추가했습니다. 드래그앤드롭 파일 시스템을 등록하고 실제 FileSystemManager Mojo 인터페이스로 복사와 이동을 호출합니다.

상황 검증 내용
읽기 권한만 있는 미등록 형제 경로 일반 이름과 공백을 인코딩한 이름 모두 FILE_ERROR_SECURITY를 반환합니다.
잘못된 목적지 미등록 파일 시스템 ID, 잘못된 파일 시스템 유형, 인코딩된 NUL·구분자·잘못된 UTF-8 등에 대해 FILE_ERROR_INVALID_URL을 유지합니다.
다른 문맥 다른 출처의 목적지 또는 다른 출처의 StorageKey에 바인딩한 receiver에서 기존 URL 검증이 유지되는지 확인합니다.
복사 권한만 부여 미등록 형제 경로로 복사하면 URL 오류를 반환하지만, 이동은 필요한 권한이 없어 보안 오류를 반환합니다.
이동에 필요한 권한까지 부여 권한 검사는 통과해도 미등록 목적지는 여전히 FILE_ERROR_INVALID_URL로 거절합니다.

기존에 해석 가능한 루트·하위 경로와 다른 등록 파일 시스템에 대한 권한 오류도 확인합니다. Gerrit 기록상 Patch Set 5는 2026년 9월 30일 UTC에 CQ dry run을 통과했습니다. 보고서 작성 과정에서 Chromium 브라우저 테스트를 별도로 실행하지는 않았습니다.

배운 점

  • 같은 요청이 URL 검증과 권한 검사를 모두 통과하지 못할 때는 검사 순서가 사용자에게 보이는 오류를 결정합니다.
  • 등록되지 않아 해석할 수 없는 경로와 문법 자체가 잘못된 URL을 구분해야 합니다. 파싱 결과와 원래 인코딩된 경로를 함께 확인하는 것이 중요합니다.
  • 복사와 이동은 필요한 권한이 다릅니다. 일부 권한만 부여한 상태를 테스트해야 두 작업의 오류 우선순위를 정확히 검증할 수 있습니다.

참고 자료