Информационная безопасность

Безопасность памяти

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++RustGo/Java
Buffer overflowUndefined behaviorCompile errorRuntime panic/impossible
Use-After-FreeSilent corruptionBorrow checker errorGC: impossible
Double freeHeap corruptionCompile errorGC: impossible
Null pointerSegfaultOption<T>: handledNullPointerException
Data raceUndefined behaviorCompile errorSync 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
Безопасность памяти

0

1

Войти