Основы безопасности
Что такое уязвимость: слабое место, угроза, риск и эксплойт
Чем различаются уязвимость, угроза, риск и эксплойт, как CWE и CVE называют дефекты и почему недостижимая уязвимость всё равно может иметь значение.
Триада CIA на бытовых примерах: конфиденциальность, целостность и доступность, проверка хешей и подписей и десять инцидентов для классификации.
Триада CIA — это модель, с помощью которой специалисты по безопасности говорят, что именно защищает та или иная мера. Она называет три свойства информации и систем: конфиденциальность (confidentiality), целостность (integrity) и доступность (availability). Большинство мер защиты нужны для того, чтобы одно или несколько из этих свойств сохранялись. Если вы можете сказать, какое свойство нарушило событие, вы уже знаете характер ущерба и то, какого рода мера должна была его остановить.
Эта статья продолжает материал Что такое кибербезопасность?. Там безопасность описана как защита информации и систем от вреда. Здесь эта мысль сужается до трёх целей, и вы получите способ раскладывать по ним реальные события.
Каждое свойство отвечает на свой вопрос:
NIST использует эти три термина во всех своих публикациях по безопасности. На них построены категории федеральной информации в FIPS 199: для каждой категории спрашивается, какой вред принесёт потеря каждого свойства. Формальные определения длиннее и аккуратнее этого краткого пересказа. Ссылки на них есть в источниках в конце статьи, и прочитать их стоит, как только уляжется основная идея.
Буквы нужны для запоминания и порядка важности не задают. C стоит первой вовсе не потому, что важнее остальных. Для системы записи пациентов в больнице главной заботой может быть доступность, а для платёжного реестра важнее может оказаться целостность. Правильный приоритет зависит от системы и от того, что случится при её отказе.
За формулой «сделать безопасно» прячутся компромиссы. Система может хранить секреты и при этом быть бесполезной, потому что до неё никто не может достучаться. Она может всё время работать и отдавать неверные данные. Она может быть точной, всегда доступной и всё равно сливать записи не тем людям. Три названных свойства дают возможность задать точный вопрос о каждом и подобрать меры, которые на него отвечают.
Другие фреймворки добавляют термины: подлинность, подотчётность, неотказуемость. Некоторые определения включают подлинность и неотказуемость в целостность, так делает FIPS 199. Какое бы определение вы ни взяли, общей отправной точкой остаётся модель из трёх свойств, поэтому начинайте с неё.
Представьте, что компания выгружает список клиентов в таблицу и кладёт её на общий диск. Открыть этот диск может любой сотрудник. Подрядчик, которому полагалось видеть только один проект, скачивает весь файл. Ничего не изменилось, сервис продолжал работать. Но информация ушла оттуда, где должна была оставаться, значит, конфиденциальность потеряна.
Конфиденциальность определяет, кто может читать данные, и касается данных при хранении (на диске, в базе), при передаче (по сети) и при использовании (открытых в памяти или на экране).
Команды ниже работают с черновым файлом и показывают, что шифрование делает на практике. Это иллюстрация, оценок здесь нет, а парольная фраза годится только для этой демонстрации. Никогда не указывайте настоящие секреты в командной строке и не оставляйте их в истории оболочки.
printf 'Patient: J. Example, diagnosis: placeholder\n' > record.txt
export DEMO_PASS='lab-only-passphrase'
openssl enc -aes-256-cbc -pbkdf2 -salt -pass env:DEMO_PASS -in record.txt -out record.enc
od -A x -t x1z record.enc | head -3
openssl enc -d -aes-256-cbc -pbkdf2 -pass env:DEMO_PASS -in record.enc
openssl enc -d -aes-256-cbc -pbkdf2 -pass pass:wrong -in record.enc -out /dev/nullНа машине, где это запускалось (Windows 11, Git Bash, OpenSSL 3.2.4), вывод был таким:
000000 53 61 6c 74 65 64 5f 5f e4 81 09 19 9d 68 fe de >Salted__.....h..<
000010 54 5b 6c 39 12 1a 38 01 b3 03 ac b8 66 be 3b 4b >T[l9..8.....f.;K<
000020 68 ae 58 39 8f 74 f1 59 23 27 09 fe b7 cf cc 58 >h.X9.t.Y#'.....X<
Patient: J. Example, diagnosis: placeholder
bad decrypt
D4C00000:error:1C800064:Provider routines:ossl_cipher_unpadblock:bad decrypt:../openssl-3.2.4/providers/implementations/ciphers/ciphercommon_block.c:107:Первые три строки показывают начало шифртекста. Байты после заголовка Salted__ выглядят случайными и меняются при каждом запуске, потому что OpenSSL всякий раз берёт новую соль, так что ваш hex будет другим. Правильная парольная фраза возвращает исходную строку. Неправильная завершается ошибкой bad decrypt, и ничего, кроме этой ошибки, неверный ключ не даёт. Содержимое из текста ошибки узнать нельзя. Код из восьми символов в её начале тоже меняется от запуска к запуску.
Кто-то скачивает установщик с зеркала. Изменённый файл вполне может нормально запуститься, так что проверять надо другое: совпадают ли его байты с тем, что опубликовал вендор.
К целостности относятся и данные в базе, которые кто-то отредактировал без разрешения, и журнал, стёртый после вторжения, и конфигурационный файл, изменённый скриптом, который никто не утверждал. Во всех этих случаях ущерб в том, что написанному в данных больше нельзя доверять.
Хеш-функция читает файл и выдаёт отпечаток фиксированной длины. Стоит изменить один байт, и отпечаток меняется полностью. Сравнение отпечатков показывает, одинаковы ли две копии, без чтения обоих файлов рядом.
Команды ниже создают файл, записывают его хеш SHA-256 и меняют содержимое:
printf 'Transfer: 10.00 USD to account A\n' > transfer.txt
sha256sum transfer.txt
printf 'Transfer: 1000.00 USD to account A\n' > transfer.txt
sha256sum transfer.txtПолученный вывод:
f5ff0bd125880721c12f4eeecd95eb1a03fbc98f61dbd4ea2235cd7c902aa936 *transfer.txt
486ca9f3224c8003ff043ae09f3d1bc6cbe5008859a81c08e95da91945812b04 *transfer.txtВторой хеш не имеет с первым ничего общего, хотя добавился всего один ноль. Пользу такая проверка приносит, когда ожидаемый хеш сохранён и сравнивать есть с чем. Сохраните исходный хеш в release.sha256 и проверьте:
sha256sum -c release.sha256Для исходного файла команда напечатала release.txt: OK. После подмены файла она напечатала вот что:
release.txt: FAILED
sha256sum: WARNING: 1 computed checksum did NOT matchКоманда завершается со статусом 1, так что скрипт может на этом остановиться.
У хеша есть предел. Если атакующий заменит файл и заодно опубликованный хеш на той же веб-странице, сравнение пройдёт и ничего не докажет. Хеш говорит только о том, что файл совпадает с полученным вами значением, поэтому нужна доверенная копия этого значения.
Эту задачу решает цифровая подпись. Издатель подписывает файл закрытым ключом. Любой, у кого есть соответствующий открытый ключ, может проверить подпись. Атакующий без закрытого ключа не сможет создать действительную подпись для изменённого файла.
Следующие команды используют одноразовый ключ RSA, созданный в черновой папке. Ни для чего настоящего его больше не применяйте.
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out priv.pem
openssl pkey -in priv.pem -pubout -out pub.pem
openssl dgst -sha256 -sign priv.pem -out release.sig release.txt
openssl dgst -sha256 -verify pub.pem -signature release.sig release.txtДля исходного файла проверка напечатала Verified OK. После изменения файла та же проверка напечатала Verification failure, а за этим шли строки ошибок OpenSSL с путями к исходникам. Здесь они опущены.
Действительная подпись показывает, что файл подписал владелец закрытого ключа. Принадлежит ли этот ключ ожидаемому вендору, она не показывает. Эту связь даёт отдельный шаг: сертификат, доверенное распространение ключей или отпечаток, сверенный по другому каналу.
Клиника держит систему записи на одном сервере. В понедельник утром выходит из строя диск, и пациенты целый день не могут записаться. Ничего не украли и ничего не изменили, сервиса просто не было в момент, когда он понадобился людям.
К тому же результату приводят атаки. Распределённая атака типа «отказ в обслуживании» (DDoS) заваливает сервис трафиком, пока легитимные пользователи не перестают до него доходить. Программа-вымогатель может заблокировать файлы так, что сотрудники не смогут работать, даже если данные не покинули организацию. Доступность касается и людей: учётная запись, заблокированная после слишком многих неудачных входов, — это небольшая потеря доступности.
С бэкапами есть подвох. Бэкап защищает целостность, когда из него можно восстановить чистую копию после вторжения, но только если он сделан до вторжения и хранился вне досягаемости атакующего. Кроме того, бэкап сам содержит конфиденциальные данные, так что ему тоже нужны шифрование и контроль доступа.
Большинство мер затрагивает больше одного свойства. Полезно спросить, на какое свойство вы полагаетесь при конкретном риске.
| Мера | Основное свойство | Чему ещё помогает |
|---|---|---|
| Шифрование | Конфиденциальность | Целостности данных при передаче, если протокол их аутентифицирует |
| Минимальные привилегии | Конфиденциальность | Целостности, потому что ограничивают круг тех, кто может менять данные |
| Многофакторная аутентификация | Конфиденциальность | Целостности учётных записей |
| Хеши | Целостность | Доверию к загрузкам, потому что выявляют повреждённые или изменённые копии |
| Цифровые подписи | Целостность | Подтверждению подлинности издателя |
| Журналы аудита | Целостность | Подотчётности, которая помогает при реагировании на инциденты |
| Резервные копии | Доступность | Целостности, если можно восстановить чистую копию |
| Резервирование и отказоустойчивость | Доступность | Почти ничему, кроме доступности |
| Ограничение частоты запросов и защита от DDoS | Доступность | Конфиденциальности, потому что замедляют перебор |
Прочитайте каждое описание и напишите одну букву: C (конфиденциальность), I (целостность) или A (доступность). Если подходят два свойства, выберите то, на которое описание делает больший упор, и укажите второе в скобках. Компьютер для этого не нужен. Попробуйте решить все десять, прежде чем смотреть ответы.
Оценка: восемь правильных ответов и больше означают, что вы уже умеете сортировать инциденты. Если вы ошиблись в нескольких случаях с целостностью, перечитайте раздел о хешах. Некоторые инциденты подходят под два свойства, поэтому принимайте обоснованный ответ с другим основным свойством, если можете объяснить свой выбор.
Прочитайте целиком вводные разделы NIST SP 800-12 Rev. 1 и определения уровней воздействия в FIPS 199. Там используются слова, которые вы только что узнали, и с ними формальные документы читать будет проще.
Затем прочитайте Что такое уязвимость?, чтобы увидеть, как слабое место оборачивается потерей одного из этих трёх свойств. Устройство шифрования и хешей разобрано в статье Что такое криптография?.
Чтобы потренироваться, не трогая чужие системы, возьмите несколько своих файлов, запишите их хеши, измените один символ и запустите проверку ещё раз. Потом зашифруйте копию одноразовой парольной фразой, расшифруйте её и попробуйте неправильную фразу. Закончив, удалите черновые файлы. Цель упражнения — увидеть эти свойства в работе. Защищённую систему из команд оболочки вы так не построите.
Наконец, прочитайте публичный отчёт об инциденте и классифицируйте его главное событие тем же методом. Спросите, какое свойство пострадало первым и какая мера изменила бы исход.
Основы безопасности
Чем различаются уязвимость, угроза, риск и эксплойт, как CWE и CVE называют дефекты и почему недостижимая уязвимость всё равно может иметь значение.
Основы безопасности
Диаграммы потоков данных, границы доверия и шесть категорий STRIDE, а затем модель локального OWASP Juice Shop в Threat Dragon.
Основы безопасности
Что охватывает кибербезопасность, триада CIA, типичные причины сбоев систем и безопасное первое упражнение с хешами на вашей машине.