Если бы у информационной безопасности были заповеди, хватило бы и двух. Первая – помните: всё, что вы создаёте, может стать инструментом в руках злоумышленника. Вторая – никому не доверяйте. Что это значит в контексте разработки ПО? То, что аудит безопасности, то есть поиск и устранение уязвимостей необходимы на каждом этапе. Как случайных, связанных с ошибками кодирования, так и преднамеренных «закладок».
Каковы группы риска?
Многие IT-компании считают себя «неуловимыми Джо»: как будто злоумышленникам до них попросту нет дела. Наш опыт доказывает обратное. Даже нишевые и не слишком популярные приложения часто становятся объектом спланированных хакерских атак. А как следствие, и серьезных потерь для компании-разработчика: финансовых и репутационных. Предпосылками для неприятностей вследствие кибератак в основном становятся:
• Недостаточная квалификация штатных кодеров. В отечественных реалиях junior нередко работает за middle, а как только дорастает до нужного уровня — на него тут же обрушиваются обязанности senior. Но эти звания не просто индикатор статуса и зарплаты. Они характеризуют комплексное понимание процесса разработки. В том числе ИБ. Результатом такого несоответствия могут стать ошибки проектирования критически важных подсистем ПО.
• Упор на аутсорсинг. Бизнесу не обойтись без подрядчиков, но не все они одинаково компетентны и порядочны. Часто задачу без ведома заказчика передают субподрядчикам, а контактное лицо и вовсе не имеет представления, как идут дела. В результате исходные коды и информация об архитектуре ПО становится известна широкому кругу лиц. Нет гарантии, что никто из них не связан со взломщиками.
• Конфликты и текучка кадров. Авторами «закладок» чаще всего становятся не «внедренные агенты», а простые сотрудники, убежденные, что с ними поступили несправедливо. Последствия такой мести могут быть разрушительными, а потому повышение лояльности персонала и укрепление корпоративного духа — не пустые слова, а один из аспектов информационной безопасности.
Чем опасны непреднамеренные уязвимости исходного кода ПО?
Внедрение «логических бомб», недокументированных деструктивных функций, мастер-паролей или, например, заведомо некорректная реализация алгоритмов шифрования требуют обстоятельного подхода. А чем сложнее и дороже взлом, тем меньше злоумышленников станут доводить операцию до конца. Распространенные некорректности кодирования – другое дело. Ими могут воспользоваться даже случайные хакеры.
Чаще всего мы сталкиваемся с такими классами непреднамеренных уязвимостей исходного кода ПО:
• некорректное преобразование типов;
• переполнение, запись и чтение вне буфера;
• проблемы с инициализацией данных;
• некорректная работа с памятью;
• ошибки синхронизации и установки времени;
• проблемы с блокировками в многопоточных сферах;
• выход за пределы диапазона при работе с переменными числового типа.
По сути, речь о соответствии исходного кода стандартам платформы и языка программирования. Сам язык тоже вносит свои коррективы в ситуацию с информационной безопасностью. Так, по числу специфических уязвимостей, согласно разным источникам, лидируют C и Java, а одними из самых безопасных принято считать C++ и Python. И всё-таки важен не сам язык, а умение им пользоваться.
Как происходит аудит безопасности исходного кода?
В арсенале экспертов по информационной безопасности 3 метода проверки исходного кода. Комбинируя их, можно регулировать глубину и тщательность анализа безопасности ПО, а вместе с этим и затраты сил, времени, а также стоимость работ. Варианты аудита безопасности кода.
• Инспекции исходного кода вручную. Самый трудоёмкий из доступных способов, требующий привлечения сотрудников высокой квалификации. Еще лучше — нескольких независимых групп таких экспертов, чтобы минимизировать фактор субъективного восприятия. Такой аудит займет много времени, но выявит даже маскируемые «закладки», а также недостатки архитектуры всего приложения и его отдельных подсистем.
• Статический анализ программного кода по шаблону. Суть этого способа — в проверке программного кода специализированными утилитами, отыскивающими потенциально опасные конструкции. Им чаще всего не под силу определить сложные «закладки», а вот облегчить поиск типовых уязвимостей, от парольных констант до SQL-инъекций, — вполне.
• Динамический анализ кода программного обеспечения. Это не проверка самого исходного кода, а наблюдение за его выполнением на тестовой станции. Такой способ тоже подразумевает автоматизацию и помогает выявить как некорректности кодирования, так и многие уязвимости. Обычно динамический аудит кода ПО используется как вспомогательный метод, чтобы прояснить отдельные аспекты работы приложения.
Что главное в проверке программного кода?
Профессионализм, внимательность, усидчивость – все эти ответы правильные. Но мы убеждены, что важней всего нацеленность на результат. То есть на создание взломоустойчивого программного обеспечения. А значит, недостаточно предоставить заказчику список обнаруженных слабых мест – нужна подробная инструкция, как в кратчайшие сроки устранить каждую «лазейку» и не допускать подобного в будущем.
Лишь в одном случае потенциальные уязвимости не оборачиваются реальными убытками – если вовремя от них избавиться. А значит, аудит исходного кода ПО – ещё и залог вашего спокойствия.