Безопасность программного обеспечения и приложений
Безопасность программного обеспечения и приложений рассматривает уязвимости, возникающие из-за способов написания и развертывания программ, а также методы их обнаружения, предотвращения и эксплуатации, признавая, что большинство нарушений происходит из-за дефектного программного обеспечения, а не из-за скомпрометированной криптографии.
Definition
Безопасность программного обеспечения и приложений — это область, занимающаяся выявлением, предотвращением и смягчением последствий уязвимостей безопасности в программном обеспечении, а также пониманием того, как злоумышленники обнаруживают и используют их.
Scope
Эта область охватывает безопасность самого программного обеспечения: классы уязвимостей (ошибки безопасности памяти, инъекции, логические ошибки) и способы их эксплуатации, практики создания безопасного программного обеспечения (безопасное проектирование, анализ кода, тестирование, фаззинг), анализ вредоносного программного обеспечения и специфические проблемы веб-приложений. Она рассматривает наступательные и оборонительные аспекты совместно. Исключаются криптографические алгоритмы, а также сетевая инфраструктура и инфраструктура контроля доступа, которые рассматриваются в смежных областях.
Sub-topics
Core questions
- Какие классы программных ошибок приводят к эксплуатируемым уязвимостям?
- Как злоумышленники превращают уязвимость в выполнение кода или кражу данных?
- Как можно проектировать, писать и тестировать программное обеспечение, чтобы оно было безопасным с самого начала?
- Как анализируется вредоносное программное обеспечение и как от него защищаться?
- Почему одни и те же классы уязвимостей повторяются, несмотря на десятилетия осведомленности?
Key concepts
- классы уязвимостей
- безопасность памяти
- переполнение буфера
- инъекционные атаки
- эксплуатация и меры по смягчению
- жизненный цикл безопасной разработки
- статический и динамический анализ
- фаззинг
- анализ вредоносного ПО
Key theories
- Безопасность памяти и эксплуатация
- Языки без безопасности памяти допускают ошибки, такие как переполнение буфера, которые позволяют злоумышленникам перезаписывать управляющие данные и перехватывать выполнение; понимание эксплуатации (и мер по смягчению, таких как ASLR, DEP, stack canaries) является центральным для безопасности программного обеспечения.
- Встраивание безопасности
- Безопасность наиболее эффективна, когда она интегрирована на протяжении всего жизненного цикла разработки — посредством моделирования угроз, безопасного кодирования, анализа кода и тестирования — а не прикрепляется впоследствии, перемещая дефекты влево, где их исправление обходится дешевле.
Clinical relevance
Уязвимости программного обеспечения являются основной причиной большинства реальных инцидентов безопасности: ошибки безопасности памяти в C/C++ лежат в основе значительной доли критических уязвимостей, ошибки инъекций компрометируют базы данных, а атаки на цепочки поставок (SolarWinds, Log4Shell) распространяются через зависимости. Эта область напрямую влияет на то, как укрепляются операционные системы, браузеры и приложения, а также на функционирование экосистем раскрытия уязвимостей, патчинга и вознаграждений за обнаружение ошибок.
Evidence & guidelines
Область организована вокруг общих баз знаний: OWASP Top Ten и CWE каталогизируют общие уязвимости, система CVE/NVD отслеживает раскрытые уязвимости с оценками серьезности CVSS, а фреймворк MITRE ATT&CK сопоставляет методы злоумышленников. Фреймворки безопасной разработки (Microsoft SDL, NIST SSDF / SP 800-218) и языки с безопасной работой с памятью (Rust) представляют собой текущие рекомендации по передовой практике.
History
Безопасность программного обеспечения возникла, когда сетевые системы сделали программы уязвимыми для удаленных злоумышленников. Червь Морриса 1988 года использовал переполнение буфера; статья Алефа Одина 1996 года «Smashing the Stack» популяризировала технику эксплуатации, что привело к появлению мер по смягчению (stack canaries, неисполняемая память, ASLR). В 2000-х годах была формализована безопасная разработка (Microsoft SDL после меморандума Trustworthy Computing 2002 года), а повторяющиеся кризисы — Heartbleed, Log4Shell — поддерживают актуальность этой области, стимулируя сейчас внедрение языков с безопасной работой с памятью.
Key figures
- Gary McGraw
- Ross Anderson
- Elias Levy (Aleph One)
- Dan Geer
Related topics
Seminal works
- anderson2020
- mcgraw2006
- aleph1996
Frequently asked questions
- Почему одни и те же уязвимости (например, переполнения буфера) продолжают появляться?
- Большая часть критически важного программного обеспечения написана на языках, небезопасных для работы с памятью, сжатые сроки и сложность приводят к ошибкам, а старый код сохраняется десятилетиями. Даже при наличии осведомленности, одна пропущенная проверка может быть эксплуатируемой, поэтому в этой области все чаще отдают предпочтение языкам с безопасной работой с памятью и автоматизированному анализу.
- Отделена ли безопасность приложений от криптографии?
- Они дополняют друг друга. Криптография защищает данные при правильном использовании, но приложения обычно взламываются из-за логических ошибок, инъекций или ошибок памяти, которые полностью обходят криптографию. Для того чтобы криптографические защиты действительно работали, необходима надежная безопасность программного обеспечения.