Операционные системы
Защита и безопасность
Каждый день появляется ~350,000 новых вредоносов. Ransomware парализует больницы, крадёт миллиарды. Уязвимости в процессорах (Spectre, Meltdown) позволяют читать чужую память. Операционная система - последний рубеж обороны между данными пользователя и хаосом интернета. Понимание механизмов защиты - не академическое упражнение, а ежедневная практика.
- **WannaCry (2017):** ransomware поразил 200,000+ компьютеров, включая NHS (британское здравоохранение). Операции отменялись, пациенты перенаправлялись в другие больницы. Ущерб: 4 млрд. Причина: неустановленный патч безопасности Windows.
- **Spectre/Meltdown (2018):** аппаратные уязвимости в CPU позволяли любой программе читать kernel memory. Затронуты миллиарды устройств. Патчи снизили производительность на 5-30%. Показали: даже железо небезопасно.
- **SolarWinds (2020):** backdoor в обновлении ПО дал доступ к 18,000 организаций, включая правительство США, Microsoft, Intel. Атакующие (APT29) находились в сетях 9+ месяцев незамеченными. Supply chain attack - новая реальность.
Цели урока
- Знать protection rings (ring 0 kernel, ring 3 user) и syscall как контролируемый переход
- Различать DAC (Unix permissions), MAC (SELinux, AppArmor), Linux capabilities
- Authentication vs authorization и атаки: password, MITM, replay, privilege escalation
- Понимать Spectre/Meltdown (2018): side-channel через speculative execution в CPU
- Применять principle of least privilege, defense in depth, seccomp-bpf
Домены защиты и уровни привилегий
**Домены защиты (Protection Domains)** - фундаментальный механизм изоляции в операционных системах. Идея проста: разные компоненты системы работают с разными уровнями привилегий. Ядро OS может всё, обычная программа - почти ничего.
Процессор аппаратно блокирует опасные операции в user mode. Попытка выполнить привилегированную инструкцию из Ring 3 вызывает **General Protection Fault** - программа будет убита OS.
Что произойдёт, если программа попытается обойти защиту?
Допустим, браузер пытается напрямую прочитать память другого процесса (например, банковского приложения). В user mode это невозможно: процессор проверяет каждое обращение к памяти через **Page Table**. Попытка доступа к чужой странице → **Segmentation Fault**. Программа крашится, но система остаётся в безопасности.
**Современные процессоры имеют ещё более тонкие механизмы:** - **Intel VT-x / AMD-V:** Ring -1 для гипервизоров (виртуализация) - **Intel SMM (System Management Mode):** Ring -2 для firmware (BIOS/UEFI) - **Intel ME (Management Engine):** Ring -3, работает независимо от OS, имеет доступ к сети даже когда компьютер "выключен" Это создаёт угрозы: вредонос в Ring -2 невидим для антивируса в Ring 0!
**Переключение между режимами (mode switching)** - дорогая операция. Каждый системный вызов требует: 1. Сохранить регистры user mode 2. Переключить CPU в kernel mode 3. Проверить права доступа 4. Выполнить запрошенную операцию 5. Вернуться в user mode
Почему sudo требует пароль?
Команда `sudo` запускает программу с правами root (Ring 0 эквивалент в userspace). Без пароля любая программа могла бы вызвать `sudo rm -rf /` и уничтожить систему. Пароль - аутентификация, что **человек** действительно хочет повысить привилегии, а не вредоносный скрипт.
Что произойдёт, если программа в user mode (Ring 3) попытается напрямую выполнить инструкцию IN/OUT для чтения с диска?
Контроль доступа (Access Control)
**Access Control** - механизм, решающий: может ли субъект (пользователь, процесс) выполнить операцию над объектом (файл, ресурс)? Две основные модели: **DAC (Discretionary)** и **MAC (Mandatory)**.
**DAC (Discretionary Access Control)** - владелец объекта сам решает, кто имеет доступ. Используется в UNIX/Linux через **permissions** (rwx) и **ACLs**.
**Проблема DAC:** пользователь может случайно (или намеренно) дать доступ кому угодно. Программа, запущенная от имени пользователя, наследует ВСЕ его права - если скачан вредонос, он может читать все файлы этого пользователя.
Атака через setuid: как получить root
**setuid bit** - механизм временного повышения привилегий. Файл с setuid выполняется от имени владельца, а не запустившего пользователя. Уязвимый пример: ```bash # /usr/bin/backup - программа с setuid root -rwsr-xr-x 1 root root /usr/bin/backup # Внутри backup.c: system("cp /home/user/file /backup/"); # Атака: $ export PATH="/tmp:$PATH" $ echo '#!/bin/sh' > /tmp/cp $ echo 'exec /bin/sh' >> /tmp/cp $ chmod +x /tmp/cp $ /usr/bin/backup # → Вызывается /tmp/cp вместо /bin/cp # → Получаем root shell! 💀 ``` **Защита:** в setuid программах не использовать `system()`, только полные пути к бинарникам.
**MAC (Mandatory Access Control)** - централизованная политика безопасности, которую пользователь НЕ может изменить. Примеры: SELinux (Security-Enhanced Linux), AppArmor.
**Principle of Least Privilege (минимум привилегий):** Программа должна иметь только необходимые для работы права. Не больше. **Linux Capabilities** - альтернатива "всё или ничего" (root vs user). Вместо полного root можно дать процессу только конкретные возможности: - `CAP_NET_BIND_SERVICE` - привязка к портам <1024 - `CAP_NET_RAW` - создание raw сокетов (ping) - `CAP_SYS_TIME` - изменение системного времени Например, веб-сервер может слушать порт 80 без полного root доступа.
Privilege Escalation: реальная атака Dirty COW
**CVE-2016-5195 (Dirty COW)** - уязвимость в Linux kernel (2007-2016), позволявшая обычному пользователю перезаписать ЛЮБОЙ файл, включая `/etc/passwd`. **Механизм атаки:** 1. Открыть read-only файл (например, `/etc/passwd`) через mmap 2. Запустить два потока: один читает, другой пишет в этот же адрес 3. Race condition в копировании страниц (Copy-On-Write) → запись попадает в оригинал! **Результат:** добавить пользователя с uid=0 в `/etc/passwd` → root доступ. Патч был выпущен экстренно во всех дистрибутивах. Показывает: даже в защите на уровне ядра бывают критические баги.
В чём ключевое отличие MAC (Mandatory Access Control) от DAC (Discretionary Access Control)?
Аутентификация и авторизация
**Аутентификация (Authentication)** - проверка личности: кто пользователь? **Авторизация (Authorization)** - проверка прав: что разрешено делать? Часто путают, но это разные этапы.
**Три фактора аутентификации:** 1. **Знание** (пароль, PIN) 2. **Владение** (USB-ключ, телефон с OTP) 3. **Идентичность** (отпечаток пальца, Face ID) **Multi-Factor Authentication (MFA)** - комбинация минимум двух факторов. Взломать намного сложнее: даже если пароль украден, всё равно нужен физический ключ.
Как хранятся пароли в Linux (/etc/shadow)
Пароли НИКОГДА не хранятся в открытом виде. Используется **криптографический хеш** с **солью** (случайной строкой).
**Public Key Authentication (SSH)** - альтернатива паролям. Использует асимметричную криптографию: закрытый ключ на клиенте, открытый на сервере.
**Биометрическая аутентификация - удобно, но рискованно:** **Плюсы:** - Нельзя забыть (отпечаток всегда при себе) - Сложно подделать (современные сенсоры распознают фальшивки) **Минусы:** - Нельзя сменить! Если отпечаток скомпрометирован (утечка базы) - это навсегда - Суд может заставить приложить палец, но не заставить произнести пароль (5th Amendment в США) - Работает во сне (Touch ID можно обмануть, приложив палец спящего владельца)
Атака Brute Force и защита от неё
**Brute Force** - перебор всех возможных паролей до совпадения. Для 4-значного PIN (0000-9999) нужно максимум 10000 попыток.
**Password Managers решают проблему слабых паролей.** Люди используют один пароль везде: если одна база утекла, взломаны все аккаунты. PM генерирует уникальные сложные пароли, хранит в зашифрованном виде, требует один мастер-пароль.
Почему современные ОС хранят пароли с солью (salt), а не просто хешируют их SHA-512?
Угрозы безопасности и защита
Операционные системы постоянно атакуют: вредоносы, эксплойты, социальная инженерия. Рассмотрим реальные угрозы и механизмы защиты.
**Основные классы угроз:** 1. **Malware (вредоносное ПО):** вирусы, черви, трояны, ransomware 2. **Exploits (эксплуатация уязвимостей):** buffer overflow, race conditions, privilege escalation 3. **Social Engineering:** фишинг, pretexting, обман пользователя 4. **Side-channel атаки:** Spectre, Meltdown, timing attacks 5. **Physical access:** cold boot attack, DMA атаки через Thunderbolt
Buffer Overflow: классическая атака
**Переполнение буфера** - запись данных за границы выделенной памяти. Позволяет перезаписать адрес возврата функции и выполнить произвольный код.
**Защита от buffer overflow:** 1. **Stack Canaries** - случайное значение между буфером и return address. Перед возвратом проверяется: изменилось ли? Если да → abort(). 2. **ASLR (Address Space Layout Randomization)** - рандомизация адресов стека, кучи, библиотек. Атакующий не знает, куда положить shellcode. 3. **DEP/NX (Data Execution Prevention)** - страницы памяти либо writable, либо executable, но не одновременно. Невозможно выполнить код из стека.
Ransomware: шифрование данных для выкупа
**Ransomware** - вредонос, шифрующий файлы пользователя. Ключ расшифровки - только у атакующих. Требуют выкуп (обычно в Bitcoin). **Механизм WannaCry (2017):** 1. Эксплойт EternalBlue (уязвимость SMB в Windows) 2. Заражение сети (червь распространяется сам) 3. Генерация AES-128 ключа для каждого файла 4. Шифрование документов, фото, баз данных 5. Публичный ключ RSA-2048 вшит в вредонос 6. AES ключи шифруются RSA и отправляются на C&C сервер 7. Экран: "Ваши файлы зашифрованы. $300 в Bitcoin за расшифровку" **Ущерб:** $4 миллиарда, 200,000+ компьютеров в 150 странах. **Защита:** регулярные бэкапы (offline!), обновления безопасности, сетевая сегментация.
**Spectre и Meltdown (2018)** - аппаратные уязвимости в CPU Intel/AMD/ARM. Используют **спекулятивное выполнение** процессора для чтения защищённой памяти.
**Защита от Spectre/Meltdown:** - **Микрокод процессора** (обновления от Intel/AMD) - **KPTI (Kernel Page Table Isolation)** - отдельные таблицы страниц для kernel/user - **Retpoline** - замена непрямых переходов на безопасные последовательности - **Отключение hyperthreading** (радикальная мера, теряется производительность)
**Принципы безопасной разработки:** 1. **Defense in Depth** - многоуровневая защита (не одна стена, а несколько) 2. **Least Privilege** - минимум прав (процесс не должен быть root без необходимости) 3. **Fail-Safe Defaults** - по умолчанию запретить, явно разрешить нужное 4. **Economy of Mechanism** - простота кода (чем меньше строк, тем меньше багов) 5. **Complete Mediation** - проверять права на каждую операцию (не кешировать решения) 6. **Open Design** - безопасность не должна зависеть от секретности алгоритма (Kerckhoffs's principle)
Ключевые идеи
- **Protection Rings разделяют привилегии.** User mode (Ring 3) изолирован от kernel mode (Ring 0). Процессор аппаратно блокирует опасные операции. Системные вызовы - единственный легальный путь из user в kernel. Это защищает ядро от программ.
- **Access Control решает: кто что может делать.** DAC (rwx permissions) - владелец контролирует доступ. MAC (SELinux) - централизованная политика, даже root не обойдёт. Capabilities - альтернатива "всё или ничего", даёт процессу только нужные права.
- **Аутентификация ≠ Авторизация.** Первая проверяет личность (пароль, SSH ключ, биометрия), вторая - права доступа (может ли UID читать файл). MFA (multi-factor) критична: один пароль ненадёжен, комбинация факторов взломать значительно сложнее.
- **Defense in Depth - многоуровневая защита.** Stack canaries детектируют buffer overflow. ASLR рандомизирует адреса. DEP/NX запрещает выполнение из данных. Каждый слой усложняет атаку. Нет "серебряной пули" - только комбинация мер работает.
Связанные темы
Безопасность ОС связана со множеством других областей - от криптографии до сетевых протоколов:
- Виртуальная память — Page tables и MMU - основа изоляции процессов. Каждый процесс видит своё адресное пространство, не может читать чужое
- Процессы и потоки — fork() создаёт изолированные процессы. Inheritance прав (uid, gid) при exec(). setuid bit для временного повышения привилегий
- Файловые системы — Permissions (rwx), ownership, ACLs - механизмы контроля доступа к файлам. Журналирование для защиты от повреждений
- Криптография — Хеши (SHA-512) для паролей, асимметричное шифрование (RSA) для SSH, AES для шифрования дисков (LUKS, FileVault)
Вопросы для размышления
- При полном root доступе к Linux системе с включённым SELinux - удастся ли прочитать /etc/shadow без изменения политики? Почему MAC эффективнее DAC против вредоносов?
- Допустим, обнаружена новая Spectre-подобная уязвимость в ARM процессорах. Миллиарды смартфонов уязвимы. Патч снижает производительность на 20%. Какой trade-off: безопасность vs производительность?
- Почему биометрия (Face ID, Touch ID) удобна, но не должна быть единственным фактором аутентификации? В каких сценариях пароль надёжнее отпечатка пальца?
Связанные уроки
- os-08-virtual-memory — Изоляция памяти - базовый механизм безопасности OS
- os-02-processes — UID/GID и capabilities привязаны к процессам
- os-12-virtualization — Виртуализация усиливает изоляцию через hypervisor boundary
- net-44-zero-trust