Безопасное программирование
Безопасное программирование — методика разработки программного обеспечения, направленная на предотвращение случайного внедрения уязвимостей и обеспечение устойчивости к воздействию вредоносных программ и несанкционированному доступу. Баги и логические ошибки являются основной причиной появления уязвимостей программного обеспечения.
Описание
Безопасное программное обеспечение — программное обеспечение, разработанное с использованием комплекса мер, направленных на недопущение появления и ликвидацию уязвимостей программы[1].
Задача безопасного программирования — защита данных пользователя от кражи и повреждения, а также сохранение контроля над системой. Небезопасная программа является потенциальной целью для злоумышленников, которые могут использовать уязвимости для просмотра, изменения или удаления информации, влияния на работу программ и сервисов, внедрения вредоносного кода в систему[2].
Терминология
В англоязычной литературе встречаются два термина, которые могут быть переведены как «безопасное программирование»:
Оборонительное программирование — принцип разработки ПО, при котором разработчики стремятся учесть все возможные ошибки и сбои, максимально изолировать их и, по возможности, восстановить работоспособность программы при возникновении неполадок. Это делает программное обеспечение более стабильным и менее уязвимым. Пример аппаратной реализации этого принципа — сторожевой таймер, а также вычисление контрольных сумм для выявления ошибок при передаче данных[3].
Безопасное программирование — методика написания программ, устойчивых к атакам со стороны вредоносных программ и злоумышленников. Безопасное программирование позволяет защитить данные пользователя от кражи или порчи. Кроме того, небезопасная программа может предоставить злоумышленнику доступ к управлению сервером или компьютером пользователя, а последствия могут быть различны: от отказа в обслуживании одному пользователю до компрометации секретной информации, потери обслуживания или повреждения систем тысяч пользователей[2].
Важность
Вопросы обеспечения безопасности и работоспособности системы рассматриваются на этапах её проектирования[4]. Требования к безопасности продуктов и систем ИТ определяются из анализа существующих и прогнозируемых угроз, принятой политики безопасности, а также исходя из условий применения[5]. Внедрение решений по обеспечению безопасности после завершения разработки системы — дорогостоящий и сложный процесс. Поэтому рекомендуется учитывать требования к безопасности на всех этапах жизненного цикла системы[4].
Информационная система подразделяется на физический и логический уровни. Понимание того, что именно требуется защищать, позволяет выбрать и применить подходящие защитные меры. Границы между уровнями определяются политикой безопасности, регламентирующей определённые объёмы информации и технологий. Иногда на одной машине могут находиться и общедоступные, и конфиденциальные данные, что влечёт наложение нескольких политик безопасности. Разработчики должны учитывать эти границы и отражать их в проектной документации и политиках безопасности[4]. Они обязаны уметь обеспечивать безопасность при проектировании, разработке, управлении, настройке, интеграции и тестировании[6].
Анализ и обеспечение безопасности — ресурсоёмкая задача, увеличивающая стоимость программного продукта. Если раньше ставили целью абсолютное устранение рисков, то сейчас ключевым становится анализ затрат и выгод от внедрения систем защиты. Иногда экономические последствия внедрения «жёстких» средств защиты могут не оправдать издержки. Следует учитывать не только прямые финансовые, но и, например, репутационные потери. Прямые расходы — это приобретение и внедрение технологии; косвенные — снижение производительности, дополнительное обучение персонала[7].
Принципы
Существует множество технологий разработки безопасного ПО, но есть универсальные принципы, учитываемые при любом подходе[8]:
- работоспособность и полезность;
- безопасность — защита от внешних угроз, атак и сохранение работоспособности после них;
- надёжность — устойчивое к ошибкам поведение при некорректных данных;
- конфиденциальность — безопасная работа с чувствительной информацией;
- целостность и корректность бизнеса — организация сопровождения, прозрачность и законность пользовательских действий.
Четыре последних качества стали основой инициативы «Вычисления, заслуживающие доверия», продвигаемой корпорацией Microsoft, с целью привлечения внимания к учёту этих требований на всех этапах разработки ПО[8].
Обобщённо данные принципы отражают большинство подходов по обеспечению безопасности ПО[9].
Классификация и виды уязвимостей
Стандартизованные описания уязвимостей существенно упрощают работу специалистов по информационной безопасности. Существуют различные классификаторы[10]:
- CVE — словарь конкретных уязвимостей отдельных продуктов;
- CWE — база данных видов уязвимостей, с описаниями способов их предотвращения, обнаружения и исправления;
- SecurityFocus BID;
- OSVDB — открытая база, созданная тремя некоммерческими организациями. Прекратила работу 5 апреля 2016 года, блог продолжает функционировать[11];
- Secunia — лента уязвимостей компании Secunia (Дания) в области компьютерной и сетевой безопасности;
- IBM ISS X-Force.
Современные анализаторы кода и инструменты аудита используют подобные базы для проверки программ, что повышает доверие к продукту и облегчает подготовку отчётов для стандартов[10].
Любая программа потенциально может стать целью атаки. Обнаружив уязвимость, злоумышленники используют её для кражи данных, порчи информации, управления системами[2]. Для оценки риска используется система CVSS — набор шкал, позволяющих назначать баллы угрозам и ранжировать приоритеты устранения[12][13][10]:
- базовая — свойства уязвимости, не зависящие от среды исполнения; описывает сложность эксплуатации и потенциальный ущерб;
- временная — учитывает временные факторы (например, наличие патча);
- контекстная — учитывает специфику среды применения.
Последние две метрики корректируют базовые показатели[13].
Примеры распространённых ошибок, приводящих к угрозам безопасности[14]:
- внедрение SQL-кода;
- уязвимости web-серверов (XSS, XSRF, расщепление HTTP запроса);
- уязвимости web-клиентов (DOM XSS);
- переполнение буфера;
- дефекты форматных строк[15];
- целочисленные переполнения;
- некорректная обработка исключений и ошибок;
- внедрение команд;
- утечка информации;
- ситуация гонки;
- слабое юзабилити[16];
- выполнение кода с завышенными привилегиями;
- хранение незащищённых данных;
- проблемы мобильного кода;
- слабые пароли;
- слабая генерация случайных чисел;
- неудачный выбор или использование криптографических алгоритмов;
- незащищённый сетевой трафик;
- неправильное использование PKI;
- доверие к механизмам разрешения имён.
Перечислить все уязвимости невозможно — ежеднедневно появляются новые. В приведённом списке — типовые ошибки, способные привести к серьёзным последствиям. Например, вспышку червя Blaster вызвала ошибка в двух строках кода[17].
Эффективная стратегия защиты — предотвращение ошибок и уязвимостей, что требует регулярной проверки входных данных. Например, средства защиты от атак переполнения буфера — контроль длины входных данных; перед добавлением в БД — проверка на внедрение SQL-кода; перед выводом на web-страницу — защита от XSS. Избыточные проверки усложняют разработку и могут привести к новым ошибкам, поэтому необходима их разумная комбинация[17].
Средства защиты могут предоставляться компилятором или операционной системой. Так, компилятор GCC реализует функцию _builtin_object_size() для контроля размеров объектов, MSVC с флагом /RTCs — проверку переполнения локальных переменных, неинициализированных переменных, повреждённого стека. Решения CRED, StackGuard, SSP реализуют защищённые участки стека[17].
Современные операционные системы также внедряют защитные технологии, например ASLR (рандомизация адресного пространства) поддерживается в Linux и Windows. Также применяются неисполнимые стеки (W^X, PaX и др.)[17].
Для web-сервисов атаки типа SQL-injection, XSS, CSRF, clickjacking являются типовыми. Современные фреймворки значительно упрощают реализацию безопасных web-приложений, освобождая от необходимости ручных проверок данных и предоставляя более безопасные ORM-интерфейсы для работы с БД[18][19].
Ущерб
Информация о новых уязвимостях используется злоумышленниками для написания вирусов. Так, один из первых известных сетевых червей (червь Морриса) в 1988 году эксплуатировал переполнение буфера в Unix-демоне finger, что привело к заражению около 6000 машин[20]. По данным Счётной палаты США, экономический ущерб составил от 10 до 100 миллионов долларов[21].
В 2016 году компьютерные вирусы нанесли мировой экономике ущерб в 450 миллиардов долларов[22][23].
В 2017 году ущерб от вируса WannaCry оценили в 1 миллиард долларов. Заражения были зафиксированы как минимум в 150 странах[24][25][26]. Вирус использовал эксплойт EternalBlue, эксплуатировавший уязвимость в протоколе SMB, связанную с переполнением буфера[27][28][29][30].
Примечания
Литература
- Касперски К. Записки исследователя компьютерных вирусов. — СПб.: Питер, 2005. — 316 с. — ISBN 5469003310.
- ГОСТ Р 56939-2016: Защита информации. Разработка безопасного программного обеспечения. Общие требования. — Стандартинформ, 2016.
- ГОСТ Р ИСО/МЭК 25010-2015: Информационные технологии. Системная и программная инженерия. Требования и оценка качества систем и программного обеспечения (SQuaRE). Модели качества систем и программных продуктов. — Стандартинформ, 2015.
- ФСТЭК России. Руководящий документ. Безопасность информационных технологий. Критерии оценки безопасности информационных технологий. — 2002.
- Информационная безопасность бизнеса. Исследование текущих тенденций в области информационной безопасность бизнеса. — Лаборатория Касперского, 2014.
- Комаров А. Меряем уязвимости. // Журнал Хакер, 2009, №1, с. 48—51.
- Сафонов В. О. Современные технологии разработки надежных и безопасных программ. // Компьютерные инструменты в образовании, 2008, №1, с. 25—33.
- Вахрушев И.А., Каушан В.В., Падарян В.А., Федотов А.Н. Метод поиска уязвимости форматной строки. // Труды ИСП РАН, 2015, т. 27, №4, с. 23—38.
- 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++. — 2nd ed. — 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, 2004.
- Wheeler D. A. Secure Programming HOWTO - Creating Secure Software. — 2015.
- Malware History. // BitDefender, 2010, с. 23—24.
- Howard M., LeBlanc D. Writing Secure Code. — 2nd ed. — Microsoft Press, 2002. — 512 p. — ISBN 9780735615885.
- Saltzer J.H., Schroeder M.D. The Protection of Information in Computer Systems. — 1975.
- Mell P., Scarfone K., Romanosky S. Common Vulnerability Scoring System. // IEEE Security & Privacy, 2006, т.4, №6, с.85—89.
- Net Losses: Estimating the Global Cost of Cybercrime. — McAfee, 2014. — [Архивировано из оригинала 24 октября 2017 года].
- Seacord R. C. The CERT C Secure Coding Standard. — Pearson Education, 2008. — 720 p. — ISBN 9780132702461.
- Long F. The CERT Oracle Secure Coding Standard for Java. — Addison-Wesley Professional, 2012. — 699 p. — ISBN 9780321803955.
Ссылки
- Мария Бондаренко. Ущерб от вируса WannaCry оценили в $1 млрд, РБК (25 мая 2017). Дата обращения: 28 июня 2024.
- Григорий Матюхин. Эксперты назвали рекордную сумму ущерба от вируса WannaCry, Hi-Tech Mail.ru (25 мая 2017). Дата обращения: 28 июня 2024.
- Роман Боровко. Экономический ущерб от вирусов, CNews Analytics (2003). Дата обращения: 28 июня 2024.
- Introduction to Secure Coding Guide (англ.). developer.apple.com. Apple Inc.. Дата обращения: 28 июня 2024.
- Security in Django (англ.). docs.djangoproject.com. Django Software Foundation. Дата обращения: 28 июня 2024.
- Ruby on Rails Security Guide (англ.). guides.rubyonrails.org. Дата обращения: 28 июня 2024.
- Luke Graham. Cybercrime costs the global economy $450 billion: CEO (англ.), CNBC International (7 февраля 2017). Дата обращения: 28 июня 2024.
- David Sun. Cybercrime cost world economy $620 billion last year (англ.), The New Paper (5 июля 2017). Дата обращения: 28 июня 2024.
- The damage from the virus WannaCry exceeded $ 1 billion (англ.), 6abc (25 мая 2017). Архивировано 15 октября 2017 года. Дата обращения: 28 июня 2024.
- William Gamazo Sanchez. MS17-010: EternalBlue’s Large Non-Paged Pool Overflow in SRV Driver (англ.). trendmicro.com. Trend Micro (2 июня 2017). Дата обращения: 28 июня 2024.
- WannaCry ransomware used in widespread attacks all over the world (англ.). securelist.com. Лаборатория Касперского (12 мая 2017). Дата обращения: 28 июня 2024.
- M. Tim Jones. Defensive Programming (англ.) (1 февраля 2005). Дата обращения: 28 июня 2024. Архивировано 13 ноября 2017 года.
- OSVDB: FIN (англ.). blog.osvdb.org (5 апреля 2016). Дата обращения: 28 июня 2024. Архивировано 28 мая 2016 года.
- Common Vulnerability Scoring System v3.0: Specification Document (англ.). first.org. FIRST. Дата обращения: 28 июня 2024.


