피드로 돌아가기
What 44 CVEs Tell You About Rust's Safety Boundary
Dev.toDev.to
Security

Rust의 타입 시스템이 해결하지 못한 uutils 내 44개 CVE 분석

What 44 CVEs Tell You About Rust's Safety Boundary

Arthur2026년 5월 19일13advanced

Context

GNU coreutils를 Rust로 재구현한 uutils가 Ubuntu 25.10 기본값으로 채택되었으나, 외부 감사 결과 44개의 CVE가 발견됨. Borrow Checker와 Clippy 등의 정적 분석 도구가 메모리 안전성은 보장했으나, OS 인터페이스 수준의 논리적 취약점은 식별하지 못한 한계 노출.

Technical Solution

  • TOCTOU 방지를 위해 fs::remove_fileFile::create를 호출하는 구조를 OpenOptions::create_new(true) 기반의 원자적 생성 방식으로 변경
  • 파일 생성 후 권한을 설정하는 fs::set_permissions 방식에서 OpenOptions::mode()를 통한 생성 시점 권한 부여 방식으로 전환
  • / 경로에 대한 단순 String 비교를 통한 Root 보호 로직을 Canonicalize 처리 및 경로 핸들 기반 검증 체계로 보완
  • String::from_utf8_lossyexpect() 호출 등 UTF-8 강제 변환 지점을 BufWriter::write_allOsStr 기반의 raw byte 처리 구조로 수정
  • Result 타입을 무시하여 마지막 파일의 상태만 반환하던 에러 핸들링 구조를 전체 프로세스 중 최악의 에러 코드를 추적하는 방식으로 개선
  • std::fs의 high-level Path API 대신 openat, fstatat 등 File Descriptor 기반의 *at family syscalls 활용 권장

- codebase 내 `unwrap()`, `expect()`, `from_utf8_lossy()` 호출 지점 전수 조사 - 파일 생성 및 권한 설정 시 생성 후 수정이 아닌, 생성 시점에 옵션을 지정하는 API 사용 여부 검토 - 경로 기반 API(`&Path`) 대신 파일 핸들/디스크립터 기반 API 사용을 통한 TOCTOU 취약점 제거 - 외부 입력값이 포함된 경로 및 파일명 처리 시 UTF-8 가정이 아닌 Raw Byte 처리를 기본 원칙으로 설정

원문 읽기