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

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

Описание

Безопасное программное обеспечение — программное обеспечение, разработанное с использованием комплекса мер, направленных на недопущение появления и ликвидацию уязвимостей программы[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]:

Перечислить все уязвимости невозможно — ежеднедневно появляются новые. В приведённом списке — типовые ошибки, способные привести к серьёзным последствиям. Например, вспышку червя 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.

Ссылки