Rust vs C/C++: 메모리 안전성 CVE, 근본적 차이는?

by DD
11시간 전
조회수 4

Rust는 안전한 코드(Safe Code)에서 발생하는 메모리 오류를 라이브러리 버그로 간주, CVE 보고

C/C++는 API의 잘못된 사용(Wrong Usage)으로 인한 문제는 라이브러리 결함으로 보지 않음

Rust의 'unsafe' 키워드와 엄격한 컴파일러 검사가 메모리 안전성 확장성의 핵심

CVE 수치 비교는 오해의 소지, 언어 설계 철학의 차이를 이해하는 것이 중요

Rust의 '안전한 Rust'와 CVE 보고 기준

커뮤니티에서는 Rust의 안전한 코드(Safe Rust)에서 메모리 안전성 버그가 발생하면, 이는 라이브러리 자체의 사운드니스(Soundness) 문제로 간주되어 CVE로 보고된다고 설명합니다. 예를 들어, `hyper` 라이브러리의 `foo(None)` 호출 시 segfault가 발생하면 이는 `hyper`의 버그라는 것입니다. 이는 개발자가 `unsafe` 블록을 사용하지 않는 한, 메모리 오류의 책임이 사용자에게 있지 않음을 보장하는 Rust의 핵심 설계 원칙을 반영합니다.

C/C++의 '잘못된 사용'과 CVE의 모호성

반면 C/C++에서는 `curl_getenv(NULL)`과 같이 API의 명시적인 계약(Contract) 위반으로 인한 메모리 오류는 라이브러리 자체의 CVE로 보기 어렵다는 논의가 있습니다. 이는 C/C++의 제한적인 타입 시스템(Limited Type System)암묵적인 UB(Undefined Behavior) 허용 때문입니다. 수많은 잠재적 UB를 모두 CVE로 보고하는 것은 비실용적이므로, 실제 악용 사례(Exploitation Case)가 발견되거나 명백한 라이브러리 결함이 있을 때 CVE가 부여되는 경향이 있습니다.

UB 정의와 최적화의 트레이드오프

토론에서는 C/C++의 UB(Undefined Behavior)가 언어 표준화 및 컴파일러 최적화에 중요한 역할을 한다는 점이 지적됩니다. 예를 들어, 부호 있는 정수 오버플로우(Signed Integer Overflow)를 UB로 두는 것은 컴파일러가 성능 최적화(Performance Optimization)를 수행할 수 있게 합니다. Rust는 이러한 UB를 대부분 `unsafe` 블록으로 격리하여 안전한 코드와 저수준 제어 간의 명확한 분리를 제공하는 반면, C/C++는 이 경계가 모호하다는 분석입니다.

CVE 수치 비교의 함정과 언어 설계 철학

결론적으로, Rust와 C/C++의 CVE 수치만을 비교하는 것은 오해의 소지가 크다는 점이 강조됩니다. Rust는 잠재적 메모리 안전성 문제 자체를 더 엄격하게 식별하고 보고하는 반면, C/C++는 실제 악용 가능성이나 명백한 라이브러리 결함에 초점을 맞추는 경향이 있습니다. 이는 두 언어의 근본적인 메모리 안전성 보장 방식의 차이에서 비롯됩니다.

How memory safety CVEs differ between Rust and C/C++