unsafe의 존재만으로 Rust를 배제하고 Fil-C만 안전하다고 보는 기준은 실제 소프트웨어의 적용 범위와 기술적 절충을 놓침- Fil-C는 C/C++의 잘못된 메모리 접근을 패닉으로 바꾸지만, ABI 비호환성, 일부 상황에서 수배의 성능 저하, GC 도입이라는 비용이 따름
- Android의 약 500만 줄 Rust 코드에서는 출시 전 수정된 잠재적 메모리 안전성 취약점 1건이 발견돼 100만 줄당 0.2건으로 추산됐으며, C/C++의 과거 데이터인 약 1,000건보다 1,000배 이상 낮았음
- 모든 프로그램에서 문제의 99.9%를 막는 기술과 90%의 프로그램에서 100%를 막는 기술 중 하나만 고를 필요는 없으며, Fil-C의 제약을 수용하기 어려운 소프트웨어에는 Rust 같은 대안이 적합함
- 메모리 안전성은 성능·ABI·GC·데이터 경쟁 방지를 함께 고려해야 하며, Rust도 불충분하다고 비판한다면 일반 C/C++와 비 Fil-C Zig에는 적어도 같은 기준을 적용해야 함
Rust와 기존 시스템 언어의 책임 모델
- 비 GC 시스템 프로그래밍 언어의 메모리 안전성 논의는 주로 Rust와 C/C++/Zig의 책임 모델 차이를 중심으로 진행돼 왔음
- Rust는 안전할 수도 있는 일부 프로그램까지 거부하는 비용을 감수하면서, 메모리 안전성 문제를 일으킬 수 있는 프로그램의 컴파일을 막으려 함
unsafe는 원시 포인터 역참조 등을 허용해 일부 보장을 우회하는 탈출구임- C 계열 언어는 메모리 안전성 보장을 대부분 프로그래머에게 맡김
- C++의 RAII와 스마트 포인터, Zig의
defer처럼 언어별 지원 수준에는 차이가 있지만, 잘못된 메모리 접근 자체를 원칙적으로 차단하지는 않음
Fil-C가 추가한 선택지
- Fil-C는 C와 C++ 코드를 메모리 안전하게 실행하는 새로운 접근을 제공함
- 범위 밖 접근이나 해제 후 사용처럼 잘못된 메모리 접근이 발생하면 패닉을 일으킴
- GC와 포인터가 접근할 수 있는 메모리를 추적하는 InvisiCaps를 결합함
- Zig에도 Fil-C에서 영감을 받은 새로운 컴파일 모드가 제안됨
- 인기 C/C++ 프로젝트 일부가 Fil-C로 컴파일한 릴리스를 제공한다면 메모리 안전성 취약점을 줄일 선택지가 늘어날 수 있음
Rust를 안전하지 않다고 보는 기준
- Fil-C 개발자는 Twitter에서
unsafe로 일부 보장을 우회할 수 있다는 이유로 Rust를 메모리 안전하지 않은 언어라고 평가해 왔음 - Zig 개발자 Andrew Kelley도 관련 이슈 제목에서 Fil-C에 영감을 받은 모드를 “Rust와 달리 실제로 메모리 안전한” 컴파일 모드라고 표현함
- 일부 논의는 Rust 사용자가 진정으로 메모리 안전성을 중시한다면 Rust를 버리고 더 안전한 Fil-C를 홍보해야 한다고 요구함
- 이 기준은 Fil-C의 현실적 비용을 제외한 채 Rust와 Fil-C를 비교하며, Rust 커뮤니티가 종종 받는 광신적이라는 비판과 유사한 태도를 보임
Fil-C의 적용 제약
- Fil-C는 비용 없는 드롭인 대체재가 아님
- 비 Fil-C로 컴파일된 프로그램과 ABI가 호환되지 않음
- 일부 상황에서는 수배 느릴 수 있음
- GC를 도입함
- 단순 유틸리티처럼 성능 저하를 체감하기 어렵거나 동적 링크가 필요 없는 프로그램에는 이런 제약이 결정적이지 않을 수 있음
- 반대로 GC와 ABI 비호환성을 받아들일 수 없는 인기 프로젝트도 많으며, 현재 형태의 Fil-C를 적용하기 어려운 프로그램은 종종 Rust에 잘 맞음
실제 Rust 코드의 취약점 데이터
- Rust의 실질적인 보안성을 판단할 데이터는 아직 많지 않지만, Rust 소프트웨어에서 악용 가능한 메모리 안전성 취약점이 많이 발견되지는 않았음
- Android의 500만 줄 이상 Rust 코드에서는 잠재적 메모리 안전성 취약점 1건이 발견됐고 출시 전에 수정됨
- 추산 취약점 밀도는 100만 줄당 0.2건임
- Android의 과거 C/C++ 데이터는 100만 줄당 약 1,000건임
- Rust 코드의 밀도는 C/C++보다 1,000배 이상 낮게 추적되고 있음
- 프로젝트마다 수치는 달라질 수 있지만, 실제 환경에서 Rust가 메모리 안전성 문제의 도입 위험을 크게 낮춘다는 근거가 됨
하나만 선택할 필요가 없는 이유
- 모든 프로그램에서 문제의 99.9%를 막는 기술과 90%의 프로그램에서 문제의 100%를 막는 기술을 비교하는 가상의 선택은 적용 범위와 예방 수준이 모두 중요함을 보여줌
- 실제 비율은 알 수 없지만 두 접근 가운데 하나만 선택할 필요는 없음
- 절충을 수용할 수 있는 C/C++/Zig 프로젝트는 Fil-C 바이너리를 제공할 수 있음
- Fil-C를 사용할 수 없는 소프트웨어는 메모리 안전성 취약점의 위험을 완전히 또는 대부분 제거하는 언어로 작성할 수 있음
GC를 쓸 수 있어도 Rust를 선택하는 이유
- Go나 Fil-C 같은 GC 기반 선택지가 있어도 Rust를 사용하는 것은 타당함
- GC 기반 언어로 작성할 수 있는 프로그램은 흔히
unsafe가 필요 없고,unsafe가 필요한 프로그램은 흔히 GC를 사용할 수 없음 - 작은 메모리 안전성 위험보다 데이터 경쟁 방지 같은 다른 언어 보장과 기능을 더 중요하게 평가할 수 있음
- Fil-C는 기존 C/C++의 메모리 안전성 취약점을 크래시로 바꿈
- 보안 취약점보다는 낫지만, 100만 줄당 약 1,000건의 과거 밀도가 그대로라면 수정해야 할 크래시가 많이 남음
- 과거에는 공격자가 프로그램을 크래시할 수 있는 능력을 이용한 보안 취약점도 있었음
일관된 메모리 안전성 기준
- Rust의 100만 줄당 0.2건조차 허용할 수 없다면 일반 C/C++와 비 Fil-C Zig에도 같거나 더 엄격한 비판을 적용해야 함
- Rust보다 안전성이 낮은 대안을 허용하면서 Rust만
unsafe때문에 배제하는 태도는 메모리 안전성 절대주의를 일관되게 적용하지 못함