Безопасное программирование (>y[khgvuky hjkijgbbnjkfguny)
Безопасное программирование — методика разработки программного обеспечения (ПО), предотвращающая случайное внедрение уязвимостей и обеспечивающая устойчивость к воздействию вредоносных программ и несанкционированному доступу. Баги и логические ошибки являются основной причиной появления уязвимостей программного обеспечения.
Безопасное программное обеспечение — программное обеспечение, разработанное с использованием совокупности мер, направленных на предотвращение появления и устранение уязвимостей программы[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].
Встречаются и другие классификаторы. При работе с ними следует обращать внимание на авторов, так как каждая система классификации должна создаваться экспертами в данной области[14].
Метрики
[править | править код]Каждая программа является потенциальной целью для злоумышленников. После нахождения уязвимостей в приложениях или сервисах они будут пытаться использовать их для кражи конфиденциальной информации, порчи данных, управления компьютерными системами и сетями[15]. Для описания свойств уязвимости специалистами используется система подсчёта рисков уязвимостей CVSS. Она представляет собой шкалы, на основе которых выставляются баллы. Система метрик разработана для разделения приоритетов над исправлением уязвимостей. Каждая шкала относится к определённому смысловому разделу, который называется метрикой. Таких метрик три[16][17][11]:
- Базовая (англ. base) — характеристики уязвимости, не зависящие от времени и среды исполнения. Служит для описания сложности эксплуатации уязвимости, потенциального ущерба для конфиденциальности, целостности и доступности информации;
- Временная (англ. temporal) — метрика, учитывающая временной фактор, например, время на исправление уязвимости;
- Контекстная (англ. environmental) — метрика, учитывающая информацию о среде функционирования программного обеспечения.
Последние две метрики носят вспомогательный характер и используются лишь для корректировки показателей базовой метрики с учётом различных специфик[18].
Виды уязвимостей
[править | править код]Список распространённых ошибок, ставящих под угрозу безопасность современных программ[19]:
- внедрение SQL-кода (англ. SQL injection);
- уязвимости, связанные с web-серверами (XSS, XSRF, расщепление HTTP запроса (англ. HTTP response splitting));
- уязвимости web-клиентов (DOM XSS);
- переполнение буфера (англ. Buffer Overflow);
- дефекты форматных строк[20] (англ. Uncontrolled format string);
- целочисленные переполнения (англ. Integer overflow);
- некорректная обработка исключений и ошибок;
- внедрение команд (командная инъекция, англ. Command injection);
- утечка информации (англ. Information Exposure);
- ситуация гонки (англ. Race condition);
- слабое юзабилити[21] (англ. Insufficient Psychological Acceptability);
- выполнение кода с завышенными привилегиями (англ. Execution with Unnecessary Privileges);
- хранение незащищенных данных (англ. Protection Mechanism Failure);
- проблемы мобильного кода[англ.] (англ. Mobile Code Issues);
- слабые пароли;
- слабые случайные числа;
- неудачный выбор криптографических алгоритмов;
- использование небезопасных криптографических решений;
- незащищенный сетевой трафик (англ. Cleartext Transmission of Sensitive Information);
- неправильное использование PKI (англ. Improper Certificate Validation);
- доверие к механизму разрешения сетевых имен (англ. Reliance on Reverse DNS Resolution).
Перечислить все известные уязвимости невозможно, учитывая, что каждый день появляются новые. В данном списке приведены часто встречающиеся уязвимости, допустить которые легко, но последствия которых могут быть катастрофическими. Например, причиной распространения червя Blaster стала ошибка всего в двух строках кода[22].
Защита
[править | править код]Правильной стратегией защиты от ошибок и уязвимостей является их предупреждение и предотвращение. Это требует от разработчика постоянной проверки входных данных. Например, лучший способ защиты от атак переполнения буфера — проверка того, что входные данные не превышают размера буфера, в котором они сохраняются. Данные, предназначенные для отправки в БД требуют проверки для защиты от атаки типа внедрения SQL-кода. Если данные отправляются на web-страницу, то следует их проверять для защиты от XSS. Однако, избыточное число проверок усложняет разработку исходного кода программы и может привести, в свою очередь, к появлению новых ошибок, поэтому следует комбинировать данную стратегию с другими[23].
Механизмы для защиты от ошибок может предоставлять компилятор или операционная система. Компилятор GCC позволяет с помощью функции _builtin_object_size() получать размер объекта по указателю на этот объект, так что её использование делает процедуру копирования безопаснее. MSVC при использовании флага /RTCs позволяет на этапе компиляции проверить переполнения локальных переменных, использование неинициализированных переменных, повреждение указателя стека, вызванное несоответствием соглашений о вызовах. Использование технологии CRED (C range error detector) и специальных вставок перед защищаемым разделом стека (StackGuard, SSP) частично позволяет обнаруживать и предотвращать атаки, связанные с выходом за границы массива и разрушением стека[24].
Операционная система также может контролировать процесс исполнения программы. Данная стратегия может быть полезной в случае, если исходный код данной программы неизвестен. Технология ASLR (рандомизация схемы адресного пространства) является функцией безопасности операционных систем, предназначенной для предотвращения запуска произвольного кода. В настоящее время ASLR поддерживается и в Linux, и в Windows. Повышение уровня безопасности достигается применением технологий неисполнимых стеков[англ.]: W^X[англ.], PaX[24].
Типовыми атаками на web-сервисы являются внедрение SQL-кода, XSS, CSRF, clickjacking. Современные фреймворки помогают разработчикам в создании безопасных web-приложений. Использование готовых решений позволяет не заниматься многочисленными проверками входящих данных: от заголовков HTTP-запросов до их содержания. Также предоставляется более безопасный метод работы с БД — ORM[25][26].
Ущерб
[править | править код]Информация об уязвимостях может быть использована злоумышленниками при написании вирусов. Например, один из первых известных сетевых червей (вирус Морриса) в 1988 году использовал такие уязвимости как переполнение буфера в Unix-демоне finger для распространения между машинами. Тогда количество заражённых машин составило порядка 6 тысяч [27], а экономический ущерб по данным счётной палаты США составил от 10 до 100 млн долларов[28].
В 2016 компьютерные вирусы причинили мировой экономике ущерб в 450 млрд долларов[29][30].
В 2017 ущерб от вируса WannaCry оценили в 1 млрд долларов. Случаи заражения были зафиксированы по меньшей мере в 150 странах[31][32][33]. Вирус применял эксплойт EternalBlue, использующий уязвимость в протоколе SMB, связанную с переполнением буфера[34][35][36][37].
Примечания
[править | править код]- ↑ ГОСТ Р 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.
- ↑ OSVDB: FIN, 2016.
- ↑ Журнал Хакер: Меряем уязвимости, 2009, Использование классификаторов в сканерах, pp. 51: «Современные автоматизированные аудиторы принято затачивать под какую-либо конкретную базу знаний. Во-первых, это престижно, во-вторых — полезно. К примеру, при подготовке к аттестации по одному из современных стандартов (NERC-CIP, PCI, FISMA, GLBA или HIPAA) администратору предоставляется возможность получить шаблонный отчет, соответствующий документу, издаваемому аудитором.».
- ↑ Журнал Хакер: Меряем уязвимости, 2009, Отдельные классификации, pp. 51: «Подчас в Сети можно заметить абсолютно самопальные классификации... Естественно, большого веса такая система не имеет, потому что составляться она должна реальными экспертами, которые понимают суть проблемы».
- ↑ Introduction to Secure Coding Guide, At a Glance.
- ↑ Common Vulnerability Scoring System, 2006, p.86.
- ↑ CVSS:Specification.
- ↑ CVSS:Specification, 1.2. Scoring: «Базовая метрика может быть уточнена путем подсчета временной и контекстной метрик, чтобы точнее отражать риск, вызванный уязвимостью, для пользователя».
- ↑ 24 Deadly Sins of Software Security: Programming Flaws and How to Fix Them, 2009, Inroduction.
- ↑ Метод поиска уязвимости форматной строки, 2015, Введение: «Еще в работах 90-х годов было показано, что неправильная работа с форматной строкой может привести к серьезным уязвимостям в безопасности ПО, таким как выполнение произвольного кода, повышение привилегий, а также утечка чувствительных данных.».
- ↑ The Protection of Information in Computer Systems, 1975, h) Psychological acceptability: «Очень важно, чтобы пользовательский интерфейс был удобным в использовании, чтобы пользователи интуитивно и просто применяли механизмы защиты правильным образом. Если мысленные представления пользователя о целях защиты соответствуют тем механизмам, которые он использует на практике, количество ошибок будет сведено к минимуму. Если же пользователь должен переводить свои представления о защите на совершенно иной язык спецификаций, он неизбежно будет совершать ошибки.».
- ↑ Secure Coding in C and C++, 2013, Figure 1.2. Flawed logic exploited by the W32.Blaster.Worm: «Недостатки логики, использованные червём W32.Blaster.Worm, показаны на рис. 1.2. Ошибка заключается в том, что цикл while в строках 21 и 22 (используемый для выделения имени узла из длинной строки) недостаточно ограничен.».
- ↑ Secure Coding in C and C++, 2013, 2.6 Runtime Protection Strategies:Input Validation.
- ↑ 1 2 Secure Coding in C and C++, 2013, 2.6 Runtime Protection Strategies.
- ↑ Django Security.
- ↑ Ruby on Rails Security.
- ↑ Записки исследователя компьютерных вирусов, 2005, Таблица 3.1, p. 90.
- ↑ Malware History, 2010, The NSA versus Morris: $100 Million in Damage, p. 23.
- ↑ 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.
Литература
[править | править код]- Касперски К. Записки исследователя компьютерных вирусов. — Питер, 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.
- 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.
- Malware History (англ.) / BitDefender. — 2010. — P. 23—24. — 71 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.
- Net Losses: Estimating the Global Cost of Cybercrime (англ.). https://www.mcafee.com/. McAfee (2014). Дата обращения: 23 октября 2017. Архивировано из оригинала 24 октября 2017 года.
Дополнительная литература
[править | править код]- 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.
Ссылки
[править | править код]- Бондаренко, Мария (2017-05-25). "Ущерб от вируса WannaCry оценили в $1 млрд". Москва: РБК. Дата обращения: 23 октября 2017.
{{cite news}}
: Указан более чем один параметр|author=
and|last=
(справка) - Матюхин, Григорий (2017-05-25). "Эксперты назвали рекордную сумму ущерба от вируса WannaCry". Москва: Hi-Tech Mail.ru. Дата обращения: 23 октября 2017.
{{cite news}}
: Указан более чем один параметр|author=
and|last=
(справка) - Боровко, Роман (2003). "Экономический ущерб от вирусов". Москва: CNews Analytics. Дата обращения: 23 октября 2017.
{{cite news}}
: Указан более чем один параметр|author=
and|last=
(справка) - Introduction to Secure Coding Guide (англ.). https://developer.apple.com/. Apple Inc.. Дата обращения: 23 октября 2017.
- Django Software Foundation. Security in Django (англ.). https://www.djangoproject.com/. Дата обращения: 5 декабря 2017.
- Ruby on Rails Security Guide (англ.). http://rubyonrails.org/. Дата обращения: 5 декабря 2017.
- Graham, Luke (2017-02-07). "Cybercrime costs the global economy $450 billion: CEO" (англ.). US: CNBC International. Дата обращения: 23 октября 2017.
{{cite news}}
: Указан более чем один параметр|author=
and|last=
(справка) - 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=
(справка) - "The damage from the virus WannaCry exceeded $ 1 billion" (англ.). US: 6abc. 2017-05-25. Архивировано 15 октября 2017. Дата обращения: 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.
- M. Tim Jones. Defensive Programming (англ.) (1 февраля 2005). Дата обращения: 12 ноября 2017. Архивировано из оригинала 13 ноября 2017 года.
- OSVDB: FIN (англ.). https://blog.osvdb.org/ (5 апреля 2016). Дата обращения: 3 декабря 2017. Архивировано из оригинала 28 мая 2016 года.
- Common Vulnerability Scoring System v3.0: Specification Document (англ.). https://www.first.org/. FIRST. Дата обращения: 12 ноября 2017.
Эта статья входит в число добротных статей русскоязычного раздела Википедии. |
В сносках к статье найдены неработоспособные вики-ссылки. |