Безопасное программирование

Материал из Википедии — свободной энциклопедии
Это старая версия этой страницы, сохранённая Olegrok (обсуждение | вклад) в 08:09, 12 октября 2017 (пунктуация). Она может серьёзно отличаться от текущей версии.
Перейти к навигации Перейти к поиску

Безопасное программирование — это практика разработки программного обеспечения, предотвращающая случайное внедрение уязвимостей и обеспечивающая устойчивость к воздействию вредоносных программ и несанкционированному доступу. Баги и логические ошибки являются основной причиной появления уязвимостей программного обеспечения.

Задача безопасного программирования - защита персональных данных пользователя от кражи и порчи. Небезопасная программа — потенциальная цель для злоумышленника, который может использовать имеющиеся уязвимости для просмотра, изменения или удаления имеющейся информации, влияния на работу программ и сервисов (запуск или остановка), внедрения вредоносного кода в систему. [1]

Важность

Безопасное программирование интуитивно можно определить, как процесс написания безопасной программы. Безопасная программа — программа, устойчивая ко всем возможным внешним воздействиям - от некорректного ввода данных до любых попыток получить доступ к данным, не имея нужных привилегий.

При написании программ следуем обращать внимание на следующие показатели:

  • Качество кода (уменьшение количества багов и других проблем)
  • Понятность кода (удобочитаемость, возможность поддержки)
  • Обеспечение корректности работы при любых вводимых данных и непредсказуемых действиях пользователя

Однако не все программы, имеющие баги, имеет смысл причислять к небезопасным. Если результат работы программы отличается от ожидаемого, но при этом отсутствуют возможности для несанкционированного доступа, то такая программа не создает проблем с точки зрения информационной безопасности, и рассматривать её в качестве небезопасной не имеет смысла.

Любое приложение можно разделить на несколько логических уровней. При проектировании следует уделять отдельное внимание каждому уровню. С самого начала следует учитывать требования безопасности. При этом на этапе реализации не должны создаваться новые уязвимости, а, наоборот, учитываться требования со всех предыдущих этапов проектирования. Подобный подход позволяет упростить разработку продукта, а также снизить расходы на обеспечение безопасности. Анализ кода на безопасность (ручной или автоматический) - дорогостоящая процедура, увеличивающая общую стоимость программного продукта. Но в большинстве случаев такой анализ необходим: последствия нахождения уязвимостей другими людьми и использования их в корыстных целях может привести как к потере репутации, так и к ещё большим финансовым потерям. Стоит учесть, что разработчики должны уметь обеспечивать безопасность при проектировании, разработке, управлении и конфигурировании, интеграции[англ.], правильно проводить тестирование. [2]

Принципы

В настоящее время существует огромное число практик написания ПО . Но есть наиболее важные качества остающиеся важными при любом подходе.

  • Работоспособность и полезность ( юзабилити , англ. usability)
  • Безопасность (англ. security) - возможность защиты от внешних угроз, атак и сохранение работоспособности после их отражение и устранения.
  • Надежность (англ. reliability) - предсказуемое, корректное и безотказное поведение в случае некорректных исходных данных.
  • Конфиденциальность (англ. privacy) - обеспечение безопасной и корректной работы с конфиденциальной информацией.
  • Обеспечение целостности и корректности бизнеса (англ. business integrity) - четкая организация сопровождения программы контроль прозрачности, законности, корректности работы пользователя.

Четыре последних качества стали основой Trustworthy computing (TwC) (англ. Trustworthy computing) («Вычисления заслуживающие доверия») - инициативы корпорации Microsoft, главная задача которой - обратить внимание разработчиков на важность обеспечения указанных требования на каждом из этапов разработки ПО .

Существует множество принципов обеспечения безопасности ПО, большей частью похожих друг на друга. Их обобщением можно считать приведенные выше принципы. [3]

Классификация и виды уязвимостей

Классификаторы

Любая найденная уязвимость потенциально может быть использована для взлома большого количества приложений. Для удобной работы по обеспечению безопасности и устранению проблем с ней уязвимости необходимо классифицировать. В первую очередь подобные классификаторы должны помогать специалистам и экспертам, работающим над устранением уязвимостей. Каждая уязвимость должна быть определенным образом строго задокументирована.

  • CVE (Common Vulnerabilities and Exposures) — словарь конкретных уязвимостей конкретных продуктов.
  • CWE (Common Weakness Enumeration) — база данных типов уязвимостей. Основная задача проекта — предоставить описания распространенных видов уязвимостей, способы их предотвращения, обнаружения и исправления.
  • SecurityFocus BID
  • OSVDB (Open Sourced Vulnerability Database) — «открытая база данных уязвимостей», созданная тремя некоммерческими организациями. Прекратила работу 5 апреля 2016 года. Блог продолжает работать.[4]
  • Secunia - лента уязвимостей известной датской компании Secunia в области компьютерной и сетевой безопасности.
  • IBM ISS X-Force

Современные анализаторы кода и автоматизированные аудиторы могут использовать подобные базы уязвимостей . Это повышает степень доверия к данному продукту, а также может быть важным при составлении отчётов об уязвимостях, имеющихся в программном продукте.

Встречаются и другие классификаторы. При работе с ними необходимо обращать внимание на авторов, каждая система классификации должна создаваться экспертами в данной области.

Метрики

Для описания свойств уязвимости специалистами используется система подсчета рисков уязвимостей CVSS?!. Она представляет собой шкалы, на основе которых выставляются баллы. Система метрик придумана для разделения приоритетов над исправлением уязвимостей. Каждая шкала относится к определенному смысловому разделу, который называется метрикой. Таких метрик три[5]:

  • Базовая (англ. base) - характеристики уязвимости, не зависящие от времени и среды исполнения. Служит для описания сложности эксплуатации уязвимости, потенциального ущерба для конфиденциальности, целостности и доступности информации.
  • Временная (англ. temporal) - метрика, учитывающий временной фактор, например, время на исправление уязвимости.
  • Контекстная (англ. environmental) - метрика, учитывающая информацию о среде функционирования программного обеспечения.

Последние две метрики носят вспомогательный характер и используются лишь для корректировки показателей базовой метрики с учетом различных специфик.

Виды уязвимостей

Список наиболее распространенных ошибок, ставящих под угрозу безопасность современных программ. [6]

Перечислить все известные уязвимости невозможно, учитывая, что каждый день появляются новые. В данном списке приведены наиболее часто встречающиеся уязвимостей, допустить которые легко, но последствия которых могут быть катастрофическими. Например, причиной распространения червя Blaster стала ошибка всего в двух строках кода.

Ущерб

Информация об уязвимостях может быть использована злоумышленниками при написании вирусов. Например, один из первых известных сетевых червей — вирус Морриса в 1988 году использовал такие уязвимости как переполнение буфера в Unix-демоне finger для распространения между машинами. Тогда количество зараженных машин составило порядка 6 тысяч [9], а экономический ущерб по данным счётной палаты США составил от $100,000 до $10,000,000[10].

В 2016 компьютерные вирусы причинили мировой экономике ущерб в 450 миллиардов долларов.[11]

В 2017 ущерб от вируса WannaCry оценивают в $1 млрд. Случаи заражения были зафиксированы по меньшей мере в 150 странах[12]. Вирус использовал эксплойт EternalBlue, использующий уязвимость в протоколе SMB, связанную с переполнением буфера[13].[14]

Примечания

  1. Introduction to Secure Coding Guide
  2. Engineering Principles for Information Technology Security, 2004, Security Foundations, pp. 6-8.
  3. Secure Programming HOWTO - Creating Secure Software, 2015, Security Principles, pp. 7-8.
  4. https://blog.osvdb.org/2016/04/05/osvdb-fin/
  5. Common Vulnerability Scoring System, 2006, p.86.
  6. 24 Deadly Sins of Software Security: Programming Flaws and How to Fix Them, 2009, Inroduction.
  7. Метод поиска уязвимости форматной строки
  8. The Protection of Information in Computer Systems, 1975, h) Psychological acceptability: «Очень важно, чтобы пользовательский интерфейс был удобным в использовани, чтобы пользователи интуитивно и просто применяли механизмы защиты правильным образом. Если мысленые представления пользователя о целях защиты соответствуют тем механизмам, которые он использует на практике, количество ошибок будет сведено к минимуму. Если же пользователь должен переводить свои представления о защите на совершенно иной язык специфи­ каций, он неизбежно будет совершать ошибки.».
  9. Записки исследователя компьютерных вирусов, 2005, Таблица 3.1, p. 90.
  10. Апелляционный суд США оценил стоимость удаления вируса с каждой зараженной машины от $200 до $53,000. Вероятно на основании этих данных и был проведен расчет.
  11. Cybercrime costs the global economy $450 billion
  12. Ущерб от вируса WannaCry оценили в $1 млрд
  13. MS17-010: EternalBlue’s Large Non-Paged Pool Overflow in SRV Driver
  14. Экономический ущерб от вирусов

Литература

  • Howard M., LeBlanc D., Viega J. 24 Deadly Sins of Software Security: Programming Flaws and How to Fix Them (англ.). — McGraw Hill Professional, 2009. — 464 p. — ISBN 9780071626767.

Дополнительная литература