Rust, 안전하다고? uutils 감사 결과로 본 시스템 코드의 새로운 보안 경계

by DD
1개월 전
조회수 6

Canonical社의 uutils 프로젝트 감사 결과, Rust 코드베이스에서도 다수의 보안 취약점(CVE)이 발견됨

파일 경로 조작(Path Manipulation), UTF-8 변환 오류(UTF-8 Conversion Errors) 등, Rust의 안전성 경계를 벗어나는 취약점 분석

파일 디스크립터(File Descriptor) 사용, 오류 처리(Error Handling) 강화 등, 방어적 프로그래밍 패턴 제시

GNU coreutils와의 호환성(Compatibility) 유지를 통해 기존 쉘 스크립트의 오작동 방지 필요성 강조

TOCTOU(Time-of-Check to Time-of-Use) 취약점과 해결

게시글에서는 TOCTOU(Time-of-Check to Time-of-Use) 취약점을 야기하는 `fs::metadata`, `File::create` 등, Rust 표준 라이브러리의 path 기반 API 사용의 위험성을 지적한다. 특히, `fs::remove_file`과 `File::create` 사이의 시간 간격 동안 공격자가 심볼릭 링크를 조작하여 임의의 파일을 덮어쓸 수 있는 취약점을 설명한다. 해결책으로 파일 디스크립터(File Descriptor)를 사용하고, `OpenOptions::create_new(true)`를 통해 파일 생성 시점의 권한 설정을 권장한다. 댓글에서는 이러한 문제에 대해 Rust의 `std::fs` API 설계가 부적절하다는 비판이 제기되었다.

경로 비교 시 문자열 비교의 위험성

게시글은 경로 비교 시 문자열 비교 대신 `fs::canonicalize`를 사용하여 경로를 정규화해야 함을 강조한다. 문자열 비교는 `/../`, `/./`과 같은 경로 조작에 취약하며, 심볼릭 링크를 통해 우회될 수 있다. 경로 정규화(Path Canonicalization)를 통해 이러한 문제를 해결할 수 있으며, GNU coreutils와 같이 (dev, inode) 쌍을 비교하는 것이 더 안전한 방법이라고 언급한다. 커뮤니티에서는 이러한 취약점에 대한 인식이 부족했음을 지적하며, 보안 코딩의 중요성을 강조한다.

UTF-8 변환 오류와 데이터 손실

게시글은 Unix 시스템에서 UTF-8 변환(UTF-8 Conversion)으로 인한 데이터 손실의 위험성을 지적하며, `String::from_utf8_lossy` 사용을 지양하고, `OsStr` 또는 `[u8]`을 사용하여 원시 바이트를 처리할 것을 권장한다. 특히, `comm` 유틸리티에서 UTF-8 변환으로 인해 바이너리 파일의 내용이 손상되는 사례를 제시한다. 댓글에서는 이러한 문제에 대해, Rust가 Unix 시스템 코드에 적합하지 않다는 의견이 제시되기도 한다.

오류 처리 및 예외 상황 관리

게시글은 `unwrap`, `expect`와 같은 함수 사용의 위험성을 경고하며, 잠재적인 서비스 거부 공격(Denial of Service)으로 이어질 수 있음을 강조한다. 대신, `?`, `get`, `checked_*`, `try_from`을 사용하여 오류를 처리하고, 오류 정보를 버리지 않도록 권장한다. 또한, GNU coreutils의 동작을 정확히 모방하여 호환성을 유지하는 것이 중요하다고 강조한다. 댓글에서는 이러한 오류 처리 방식이 Rust 코드의 안전성을 높이는 데 기여한다고 평가한다.

Bugs Rust Won't Catch