Безопасное программирование
Безопасное программирование — это практика разработки программного обеспечения, предотвращающая случайное внедрение уязвимостей и обеспечивающая устойчивость к воздействию вредоносных программ и несанкционированному доступу. Баги и логические ошибки являются основной причиной появления уязвимостей программного обеспечения.
Безопасное программное обеспечение — программное обеспечение, разработанное с использованием совокупности мер. направленных на предотвращение появления и устранение уязвимостей программы[1].
Задача безопасного программирования — защита персональных данных пользователя от кражи и порчи. Небезопасная программа — потенциальная цель для злоумышленника, который может использовать имеющиеся уязвимости для просмотра, изменения или удаления имеющейся информации, влияния на работу программ и сервисов (запуск или остановка), внедрения вредоносного кода в систему[2].
Терминология
В англоязычной литературе существует два термина, которые могут быть переведены, как безопасное программирование.
Defensive programming (Оборонительное, защитное, безопасное программирование) — это практика разработки ПО, в процессе которой разработчики пытаются учесть все возможные ошибки и сбои, максимально изолировать их и при возможности восстановить работоспособность программы. Это должно делать программное обеспечение более стабильным и менее уязвимым. Например, аппаратной реализацией данного принципа является сторожевой таймер, вычисление контрольной суммы — для выявление ошибок при пакетной передаче данных[3].
Secure coding (Безопасное программирование) — это практика написания программ, устойчивых к атакам со стороны вредоносных программ и злоумышленников. Безопасное программирование помогает защитить данные пользователя от кражи или порчи. Кроме того, небезопасная программа может предоставить злоумышленнику доступ к управлению сервером или компьютером пользователя; последствия могут быть различны: от отказа в обслуживании одному пользователю до компроментации секретной информации, потери обслуживания или повреждения систем тысяч пользователей[2].
Важность
Безопасное программирование интуитивно можно определить, как процесс написания безопасной программы. Безопасная программа — программа, устойчивая ко всем возможным внешним воздействиям — от некорректного ввода данных до любых попыток получить доступ к данным, не имея нужных привилегий.
Необходимо относиться к безопасности, как к неотъемлемой части общего дизайна системы[англ.][4]. Требования к безопасности конкретных продуктов и систем ИТ устанавливаются исходя из имеющихся и прогнозируемых угроз безопасности, проводимой политики безопасности, а также с учетом условий их применения[5]. Внедрение решений для обеспечения безопасности после того, как система уже разработана, является сложной и дорогостоящей процедурой. Поэтому следует учитывать требования к безопасности на протяжении всего жизненного цикла системы, с самого начала проектирования[4].
Информационная система включает в себя физический и логический уровень. Понимание того, что именно должно быть защищено от внешних факторов, помогает с наиболее эффективным выбором и применением защитных мер. Четкая граница между уровнями должна определяться политикой безопасности, регулирующей определенный набор информации и информационных технологий, имеющий физические границы. Дальнейшее усложнение заключается в том, что на одном компьютере или сервере может размещаться как общедоступная, так и конфиденциальная информация. В результате несколько политик безопасности могут применяться к одной машине или в пределах одной системы. Поэтому при разработке информационной системы границы безопасности должны учитываться и описываться в соответствующей документации и политиках безопасности системы[4].
Стоит учесть, что разработчики должны уметь обеспечивать безопасность при проектировании, разработке, управлении и конфигурировании, интеграции[англ.], правильно проводить тестирование[6].
Анализ (ручной или автоматический) и обеспечение безопасности — дорогостоящая процедура, увеличивающая общую стоимость программного продукта. Ранее полное устранение рисков было общей целью обеспечения безопасности. Сегодня признается, что устранение всех рисков не является экономически эффективным. Для каждой предлагаемой системы контроля следует провести анализ затрат и выгод. В некоторых случаях преимущества более безопасной системы могут не оправдывать прямых и косвенных издержек. Выгоды включают не только предотвращение денежных потерь; стоит учитывать, например, и репутационные потери. Прямые расходы включают расходы на приобретение и установку данной технологии; косвенные расходы включают снижение производительности системы и дополнительное обучение сотрудников[7].
Принципы
В настоящее время существует огромное число практик написания ПО. Но есть наиболее значимые принципы, учитываемые при любом подходе[8]:
- Работоспособность и полезность (юзабилити, англ. usability)
- Безопасность (англ. security) — возможность защиты от внешних угроз, атак и сохранение работоспособности после их отражение и устранения.
- Надежность (англ. reliability) — предсказуемое, корректное и безотказное поведение в случае некорректных исходных данных.
- Конфиденциальность (англ. privacy) — обеспечение безопасной и корректной работы с конфиденциальной информацией.
- Обеспечение целостности и корректности бизнеса (англ. business integrity) — четкая организация сопровождения программы контроль прозрачности, законности, корректности работы пользователя.
Четыре последних качества стали основой Trustworthy computing (TwC) (англ. Trustworthy computing) («Вычисления заслуживающие доверия») — инициативы корпорации Microsoft, главная задача которой — обратить внимание разработчиков на важность обеспечения указанных требования на каждом из этапов разработки ПО[9].
Существует множество принципов обеспечения безопасности ПО, большей частью похожих друг на друга. Их обобщением можно считать приведенные выше принципы[10].
Классификация и виды уязвимостей
Классификаторы
Для более удобной работы по обеспечению безопасности и устранению проблем с ней уязвимости необходимо классифицировать. В первую очередь подобные классификаторы должны помогать специалистам и экспертам, работающим над устранением уязвимостей. Каждая уязвимость должна быть определённым образом строго задокументирована[11].
- CVE (Common Vulnerabilities and Exposures) — словарь конкретных уязвимостей конкретных продуктов.
- CWE (Common Weakness Enumeration) — база данных типов уязвимостей. Основная задача проекта — предоставить описания распространенных видов уязвимостей, способы их предотвращения, обнаружения и исправления.
- SecurityFocus BID
- OSVDB (Open Sourced Vulnerability Database) — «открытая база данных уязвимостей», созданная тремя некоммерческими организациями. Прекратила работу 5 апреля 2016 года. Блог продолжает работать[12].
- Secunia — лента уязвимостей известной датской компании Secunia в области компьютерной и сетевой безопасности.
- IBM ISS X-Force
Современные анализаторы кода и автоматизированные аудиторы могут использовать подобные базы уязвимостей . Это повышает степень доверия к данному продукту, а также может быть важным при составлении отчётов об уязвимостях, имеющихся в программном продукте.
Встречаются и другие классификаторы. При работе с ними необходимо обращать внимание на авторов, каждая система классификации должна создаваться экспертами в данной области.
Метрики
Каждая программа является потенциальной целью для злоумышленников. После нахождения уязвимосей в приложениях или серверах они будут пытаться использовать их для кражи конфиденциальной информации, порчи данных, управления компьютерными системами и сетями[13]. Для описания свойств уязвимости специалистами используется система подсчета рисков уязвимостей CVSS?!. Она представляет собой шкалы, на основе которых выставляются баллы. Система метрик придумана для разделения приоритетов над исправлением уязвимостей. Каждая шкала относится к определённому смысловому разделу, который называется метрикой. Таких метрик три[14][15][11]:
- Базовая (англ. base) — характеристики уязвимости, не зависящие от времени и среды исполнения. Служит для описания сложности эксплуатации уязвимости, потенциального ущерба для конфиденциальности, целостности и доступности информации.
- Временная (англ. temporal) — метрика, учитывающий временной фактор, например, время на исправление уязвимости.
- Контекстная (англ. environmental) — метрика, учитывающая информацию о среде функционирования программного обеспечения.
Последние две метрики носят вспомогательный характер и используются лишь для корректировки показателей базовой метрики с учетом различных специфик.
Виды уязвимостей
Список наиболее распространенных ошибок, ставящих под угрозу безопасность современных программ[16].
- Внедрение SQL-кода (англ. SQL injection)
- Уязвимости, связанные с web-серверами (XSS, XSRF, расщепление HTTP запроса (англ. HTTP response splitting))
- Уязвимости web-клиентов
- Переполнение буфера
- Дефекты форматных строк[17]
- Целочисленные переполнения
- Некорректная обработка исключений и ошибок
- Внедрение команд
- Утечка информации
- Ситуация гонки (англ. Race condition)
- Слабое юзабилити [18]
- Выполнение кода с завышенными привилегиями
- Хранение незащищенных данных
- Проблемы мобильного кода (англ. Code mobility)
- Слабые пароли
- Слабые случайные числа
- Использование небезопасных криптографических решений
- Незащищенный сетевой трафик
Перечислить все известные уязвимости невозможно, учитывая, что каждый день появляются новые. В данном списке приведены наиболее часто встречающиеся уязвимостей, допустить которые легко, но последствия которых могут быть катастрофическими. Например, причиной распространения червя Blaster стала ошибка всего в двух строках кода[19].
Ущерб
Информация об уязвимостях может быть использована злоумышленниками при написании вирусов. Например, один из первых известных сетевых червей — вирус Морриса в 1988 году использовал такие уязвимости как переполнение буфера в Unix-демоне finger для распространения между машинами. Тогда количество зараженных машин составило порядка 6 тысяч [20], а экономический ущерб по данным счётной палаты США составил от $100,000 до $10,000,000[21].
В 2016 компьютерные вирусы причинили мировой экономике ущерб в 450 миллиардов долларов [22][23].
В 2017 ущерб от вируса WannaCry оценивают в $1 млрд. Случаи заражения были зафиксированы по меньшей мере в 150 странах[24][25][26]. Вирус использовал эксплойт EternalBlue, использующий уязвимость в протоколе SMB, связанную с переполнением буфера[27][28][29][30].
Примечания
- ↑ ГОСТ Р 56939-2016, 2016, Термины и определения, pp. 2.
- ↑ 1 2 Introduction to Secure Coding Guide.
- ↑ Defensive Programming.
- ↑ 1 2 3 Engineering Principles for Information Technology Security, 2004, Security Foundations.Principle 2, pp. 7.
- ↑ Критерии оценки безопасности информационных технологий, 2002, Общие положения, pp. III-IV.
- ↑ Engineering Principles for Information Technology Security, 2004, Security Foundations, pp. 6-8.
- ↑ Engineering Principles for Information Technology Security, 2004, Security Foundations. Principle 5, pp. 8.
- ↑ Современные технологии разработки надежных и безопасных программ, 2008, pp. 25-26.
- ↑ Современные технологии разработки надежных и безопасных программ, 2008, pp. 26.
- ↑ Secure Programming HOWTO - Creating Secure Software, 2015, Security Principles, pp. 7-8.
- ↑ 1 2 Журнал Хакер: Меряем уязвимости, 2009, pp. 48—51.
- ↑ https://blog.osvdb.org/2016/04/05/osvdb-fin/
- ↑ Introduction to Secure Coding Guide, At a Glance.
- ↑ Common Vulnerability Scoring System, 2006, p.86.
- ↑ CVSS:Specification.
- ↑ 24 Deadly Sins of Software Security: Programming Flaws and How to Fix Them, 2009, Inroduction.
- ↑ Метод поиска уязвимости форматной строки.
- ↑ The Protection of Information in Computer Systems, 1975, h) Psychological acceptability: «Очень важно, чтобы пользовательский интерфейс был удобным в использовани, чтобы пользователи интуитивно и просто применяли механизмы защиты правильным образом. Если мысленые представления пользователя о целях защиты соответствуют тем механизмам, которые он использует на практике, количество ошибок будет сведено к минимуму. Если же пользователь должен переводить свои представления о защите на совершенно иной язык специфи каций, он неизбежно будет совершать ошибки.».
- ↑ Secure Coding in C and C++, Figure 1.2. Flawed logic exploited by the W32.Blaster.Worm: «Недостатки логики, использованные червем W32.Blaster.Worm, показаны на рис. 1.2. Ошибка заключается в том, что цикл while в строках 21 и 22 (используемый для выделения имени узла из длинной строки) недостаточно ограничен.».
- ↑ Записки исследователя компьютерных вирусов, 2005, Таблица 3.1, p. 90.
- ↑ Апелляционный суд США оценил стоимость удаления вируса с каждой зараженной машины от $200 до $53,000. Вероятно на основании этих данных и был проведён расчёт.
- ↑ CNBC International: Cybercrime costs the global economy $450 billion.
- ↑ The New Paper: Cybercrime cost world economy $620 billion last year.
- ↑ РБК: Ущерб от вируса WannaCry оценили в $1 млрд.
- ↑ 6abs: The damage from the virus WannaCry exceeded $ 1 billion.
- ↑ Hi-Tech Mail.ru: Эксперты назвали рекордную сумму ущерба от вируса WannaCry.
- ↑ MS17-010: EternalBlue’s Large Non-Paged Pool Overflow in SRV Driver.
- ↑ WannaCry ransomware used in widespread attacks all over the world.
- ↑ CNews: Экономический ущерб от вирусов.
- ↑ Net Losses: Estimating the Global Cost of Cybercrime.
Литература
- 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.
- Seacord R. C. Secure Coding in C and C++ (англ.). — 2. — Addison-Wesley, 2013. — 600 p. — ISBN 9780132981972.
- Stoneburner G., Hayden C., Feringa A. Engineering Principles for Information Technology Security (A Baseline for Achieving Security) (англ.) / National Institute of Standards and Technology. — Revision A. — 2004. — 33 p.
- Wheeler D. A.. Secure Programming HOWTO - Creating Secure Software (англ.). — 2015. — 186 p.
- Howard M., LeBlanc D. Writing Secure Code (англ.). — 2. — Microsoft Press, 2002. — P. 43,. — 512 p. — ISBN 9780735615885.
- Saltzer J.H., Schroeder M.D.. The Protection of Information in Computer Systems (англ.) : article / Saltzer J. H.. — 1975.
- Mell P., Scarfone K., Romanosky S. Common Vulnerability Scoring System (англ.) // IEEE Security & Privacy : article. — 2006. — Vol. 4. — P. 85-89. — ISSN 1540-7993.
- Introduction to Secure Coding Guide (англ.). https://developer.apple.com/. Apple Inc.. Дата обращения: 23 октября 2017.
- William Gamazo Sanchez (Vulnerability Research). MS17-010: EternalBlue’s Large Non-Paged Pool Overflow in SRV Driver (англ.). http://blog.trendmicro.com/. Trend Micro (2 июня 2017). Дата обращения: 23 октября 2017.
- WannaCry ransomware used in widespread attacks all over the world (англ.). https://securelist.com/. ЗАО «Лаборатория Касперского» (12 мая 2017). Дата обращения: 23 октября 2017.
- Net Losses: Estimating the Global Cost of Cybercrime (англ.). https://www.mcafee.com/. McAfee (2014). Дата обращения: 23 октября 2017.
- Касперски К. Записки исследователя компьютерных вирусов . — Питер, 2005. — P. 93, 103-104, 117-122. — 316 p. — ISBN 5469003310.
- ГОСТ Р 56939-2016: Защита информации. Разработка безопасного программного обеспечения. Общие требования / Федеральное агентство по техническому регулирванию и метрологии. — Стандартинформ, 2016. — 24 p.
- ГОСТ Р ИСО/МЭК 25010-2015: Информационные технологии. Системная и программная инженерия. Требования и оценка качества систем и программного обеспечения (SQuaRE). Модели качества систем и программных продуктов / Федеральное агентство по техническому регулирванию и метрологии. — Стандартинформ, 2015. — 36 p.
- Гостехкомиссия России. Руководящий документ. Безопасность информационных технологий. Критерии оценки безопасности информационных технологий . — 2002. — P. III-IV. — 48 p.
- Информационная безопасность бизнеса. Исследование текщих тенденций в области информационной безопасность бизнеса. : Исследование / Лаборатория Касперского. — 2014. — P. 14.
- Комаров А. Меряем уязвимости // Хакер : Журнал. — 2009. — № 04 (124). — P. 48—51.
- Сафонов В. О. Современные технологии разработки надежных и безопасных программ // Компьютерные инструменты в образовании : Журнал. — 2008. — № 06. — P. 25-33.
- Вахрушев И.А., Каушан В.В., Падарян В.А., Федотов А.Н. Метод поиска уязвимости форматной строки // Труды ИСП РАН. — 2015. — Т. 27, № 4. — С. 23-38. — P. 25-33.
- M. Tim Jones. Defensive Programming (англ.) (1 февраля 2005). Дата обращения: 12 ноября 2017.
- Common Vulnerability Scoring System v3.0: Specification Document (англ.). https://www.first.org/. FIRST. Дата обращения: 12 ноября 2017.
- Graham, Luke (2017-02-07). "Cybercrime costs the global economy $450 billion: CEO" (англ.). US: CNBC International. Дата обращения: 23 октября 2017.
{{cite news}}
: Указан более чем один параметр|author=
and|last=
(справка); Шаблон цитирования имеет пустые неизвестные параметры:|coauthors=
(справка)
- Sun, David (2017-07-05). "Cybercrime cost world economy $620 billion last year" (PDF) (англ.). Singapore: The New Paper. Дата обращения: 23 октября 2017.
{{cite news}}
: Указан более чем один параметр|author=
and|last=
(справка); Шаблон цитирования имеет пустые неизвестные параметры:|coauthors=
(справка)
- "The damage from the virus WannaCry exceeded $ 1 billion" (англ.). US: 6abc. 2017-05-25. Дата обращения: 23 октября 2017.
{{cite news}}
: Шаблон цитирования имеет пустые неизвестные параметры:|coauthors=
(справка)
- Бондаренко, Мария (2017-05-25). "Ущерб от вируса WannaCry оценили в $1 млрд". Москва: РБК. Дата обращения: 23 октября 2017.
{{cite news}}
: Указан более чем один параметр|author=
and|last=
(справка); Шаблон цитирования имеет пустые неизвестные параметры:|coauthors=
(справка)
- Матюхин, Григорий (2017-05-25). "Эксперты назвали рекордную сумму ущерба от вируса WannaCry". Москва: Hi-Tech Mail.ru. Дата обращения: 23 октября 2017.
{{cite news}}
: Указан более чем один параметр|author=
and|last=
(справка); Шаблон цитирования имеет пустые неизвестные параметры:|coauthors=
(справка)
- Боровко, Роман (2003). "Экономический ущерб от вирусов". Москва: CNews Analytics. Дата обращения: 23 октября 2017.
{{cite news}}
: Указан более чем один параметр|author=
and|last=
(справка); Шаблон цитирования имеет пустые неизвестные параметры:|coauthors=
(справка)
Дополнительная литература
- Seacord R. C. The CERT C Secure Coding Standard (англ.). — 2008. — P. Pearson Education. — 720 p. — ISBN 9780132702461.
- Long F. The CERT Oracle Secure Coding Standard for Java (англ.) / Carnegie-Mellon University. CERT Coordination Center. — Addison-Wesley Professional, 2012. — 699 p. — ISBN 9780321803955.
Статья является кандидатом в добротные статьи с 22 октября 2017. |