Информационная безопасность
Безопасность памяти
2022 год. NSA публикует: Shifting the Balance of Cybersecurity Risk. Цитата: NSA recommends memory safe programming languages. Microsoft: 70% CVE за 12 лет - memory safety. Google Chrome: те же 70%. CISA, NSA, FBI - все три агентства рекомендуют переход. Не через mitigation, не через процессы - через язык программирования. Признание: C/C++ не может быть сделан достаточно безопасным без смены инструмента.
- Chrome 2022: 70% critical bugs - UAF в C++ code. Google migrating to Rust, первый Rust в Chrome 2023
- Android kernel Rust 2021-2023: 0 memory safety CVE в Rust-written компонентах за 2 года vs постоянные CVE в C modules
- Cloudflare Pingora 2023: заменил C NGINX на Rust - 0 memory safety incidents + 50% меньше CPU
Use-After-Free: жизнь после free()
2014 год. Internet Explorer CVE-2014-1776. Use-After-Free в JavaScript engine. Атакующий контролирует время освобождения объекта и выделение нового на том же месте с другим типом. Remote code execution через crafted страницу. 70% Chrome critical bugs в 2022 году - use-after-free.
Chrome Security 2022: из 70 Critical bugs - 71% это use-after-free. Причина: V8 написан на C++. Google начал переписывать компоненты на Rust. Первый Rust код в Chrome - 2023.
C++ unique_ptr<Object> obj = make_unique<Object>(). Объект уничтожается при выходе из scope. Возможен UAF через obj?
Type Confusion: объект не того типа
Type Confusion - объект одного типа интерпретируется как другой. В C без RTTI и при UAF - частое явление. CVE-2021-1844 (Safari WebKit): JSC type confusion через DFG JIT - IntTypedArray обрабатывался как Float64Array. Remote code execution через crafted HTML.
RTTI в C++ (dynamic_cast<>), isinstance() в Python - runtime проверки типа. Языки с algebraic types (Rust, Haskell) делают type confusion невозможным на уровне системы типов на этапе компиляции.
Safari CVE-2021-1844: type confusion в JSC JIT. Какой слой защиты мог предотвратить?
Memory Safe Languages: язык как защита
NSA 2022: Shifting the Balance of Cybersecurity Risk. Рекомендация: переход с C/C++ на memory-safe языки. Microsoft: 70% CVE за 12 лет - memory safety bugs. Google Chrome: те же 70%. CISA, NSA, FBI - все три агентства. Один класс уязвимостей - половина всех критических CVE в индустрии.
| Ошибка | C/C++ | Rust | Go/Java |
|---|---|---|---|
| Buffer overflow | Undefined behavior | Compile error | Runtime panic/impossible |
| Use-After-Free | Silent corruption | Borrow checker error | GC: impossible |
| Double free | Heap corruption | Compile error | GC: impossible |
| Null pointer | Segfault | Option<T>: handled | NullPointerException |
| Data race | Undefined behavior | Compile error | Sync primitives |
Android kernel Rust с 2021. Google начал писать новые компоненты на Rust. Результат: 0 memory safety CVE в Rust-written компонентах за первые 2 года против постоянных CVE в C kernel modules.
Go имеет GC. Полностью ли устранены memory safety bugs?
Rust Borrow Checker: безопасность в compile time
Rust: memory safety без GC. Borrow Checker - компонент компилятора проверяет ownership и borrowing в compile time. Memory safety bugs становятся ошибками компиляции - не runtime segfault, не CVE.
Rust в production: Linux kernel (с 2022), Android Binder IPC driver, Firefox CSS engine Stylo (2017), Cloudflare Pingora HTTP proxy (заменил C NGINX в 2023), Discord Voice server (2020), Microsoft Azure IoT Edge.
Rust полностью безопасен - unsafe код никогда не нужен
unsafe необходим для FFI с C, raw pointer operations, syscalls. Цель: минимизировать и изолировать. Unsafe Rust + careful review всё равно значительно безопаснее C.
Большинство Rust программ имеют unsafe в зависимостях (libc, system bindings). Ключевое: unsafe код изолирован, легко находится grep/clippy, тщательно ревьюируется. В C - весь код потенциально unsafe без явной маркировки.
Rust unsafe block: unsafe { *ptr = 42; }. Borrow checker проверяет этот код?
Ключевые идеи
- UAF: объект используется после free(). 70% Chrome critical CVE. C++: smart pointers. Rust: borrow checker compile error. GC (Go/Java): невозможен
- Type Confusion: объект обрабатывается как другой тип. C union/JIT оптимизации особенно уязвимы. Строгие типы устраняют класс
- Memory Safe Languages: Go (GC), Rust (borrow checker), Java/Python. NSA/CISA/Microsoft рекомендуют для системных проектов
- Rust Borrow Checker: ownership + borrowing = memory safety без GC. unsafe - escape hatch, минимизировать и изолировать
Связанные темы
Memory safety - фундаментальный уровень system security:
- Exploit Development: Buffer Overflow — Buffer overflow и UAF - основные техники exploit development
- Linux Hardening — ASLR, NX, seccomp - OS mitigation для memory bugs в C/C++
- Безопасность контейнеров — Rust компоненты в container runtime снижают attack surface
Вопросы для размышления
- Какие компоненты написаны на C/C++? Есть ли план миграции критических на Rust?
- Используется ли AddressSanitizer в CI для C/C++ кода?
- При выборе языка для нового high-performance компонента - как взвешиваются memory safety vs производительность?
Связанные уроки
- sec-22 — Buffer overflow - основной класс memory safety уязвимостей
- sec-21 — OS mitigation (ASLR, NX) - защита от последствий memory bugs
- os-07-memory