피드로 돌아가기
Dev.toSecurity
원문 읽기
Rust의 타입 시스템이 해결하지 못한 uutils 내 44개 CVE 분석
What 44 CVEs Tell You About Rust's Safety Boundary
AI 요약
Context
GNU coreutils를 Rust로 재구현한 uutils가 Ubuntu 25.10 기본값으로 채택되었으나, 외부 감사 결과 44개의 CVE가 발견됨. Borrow Checker와 Clippy 등의 정적 분석 도구가 메모리 안전성은 보장했으나, OS 인터페이스 수준의 논리적 취약점은 식별하지 못한 한계 노출.
Technical Solution
- TOCTOU 방지를 위해
fs::remove_file후File::create를 호출하는 구조를OpenOptions::create_new(true)기반의 원자적 생성 방식으로 변경 - 파일 생성 후 권한을 설정하는
fs::set_permissions방식에서OpenOptions::mode()를 통한 생성 시점 권한 부여 방식으로 전환 /경로에 대한 단순 String 비교를 통한 Root 보호 로직을 Canonicalize 처리 및 경로 핸들 기반 검증 체계로 보완String::from_utf8_lossy및expect()호출 등 UTF-8 강제 변환 지점을BufWriter::write_all및OsStr기반의 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 처리를 기본 원칙으로 설정