Утрата или модификация данных, утечка конфиденциальной информации и т. д. Все это – лишь некоторые из примеров катастрофических последствий хакерских атак. Именно поэтому безопасность программного обеспечения должна ставиться в главу угла при разработке программного обеспечения, а задача разработчиков – сведение к минимуму возможности злоумышленников использовать уязвимость программного обеспечения. Другими словами, следует создавать программное обеспечение таким образом, чтобы исключить возможность взлома одного или нескольких ключевых элементов безопасности программного обеспечения.
Ключевые элементы безопасности программного обеспечения
Безопасность программного обеспечения представляет собой набор следующих атрибутов:
• Конфиденциальность
Это гарантия неразглашения персональных данных, которую должно обеспечивать программное обеспечение. Это означает, что такие данные должны быть защищены от доступа любым лицам, кроме пользователя, имеющего право на работу с этими данными.
Например, при разработке мобильного приложения, предполагающего создание пользователями учетных записей, необходимо убедиться, что информация о каждом отдельном пользователе доступна только для каждого конкретного пользователя каждой конкретной учетной записи, а не для других пользователей.
• Целостность
Это обеспечение неизменяемости информации, которую должно предоставлять программное обеспечение. Другими словами, это защита информации, содержащейся в программе, от любых несанкционированных намерений изменить ее полностью или частично.
В нашем примере с мобильным приложением, работающим на основе учетной записи, следует обеспечить гарантии того, что изменять любые данные в своей учетной записи может только владелец учетной записи. Также, необходимо обеспечить, что данные, которые пользователь отправляет в систему или другому пользователю, доходят до получателя без изменений.
• Аутентификация и авторизация
Аутентификация — это атрибут, позволяющий системе обеспечить подлинность и действительность данных и пользователей. Авторизация — это функция системы, направленная на предотвращение использования ее сервисов или других функций пользователями, отличными от тех, кому эти права предоставлены. По сути, это означает предоставление определенным, заранее заданным пользователям прав доступа к определенным, заранее заданным функциям или же прав на выполнение определенных, заранее заданных действий. И, соответственно, наоборот, наложение ограничений на выполнение пользователями действий, отличных от тех, что определены для этого пользователя.
В нашем примере с мобильном приложением это означает, что доступ к учетной записи предоставляется пользователю только после ввода корректной комбинации логина и пароля. При этом, в идеале, каждый логин из совокупности всех имеющихся в этой системе логинов должен быть уникальным.
• Доступность
Это способность системы гарантировать, что все данные и все сервисы, которые должны быть доступны пользователю, действительно будут доступны ему в любой момент времени.
В нашем примере пользователь должен иметь возможность войти в свою учетную запись, воспользоваться доступными ему сервисами приложения в любое время, когда захочет. Разумеется, при условии прохождения авторизации.
Основные типы уязвимостей в безопасности ПО
Как уже было сказано ранее, основная цель проектирования модуля безопасности программного обеспечения состоит в том, чтобы обеспечить успешную реализацию всех перечисленных выше атрибутов, не оставляя места для выполнения сценариев нарушения безопасности.
Для этого следует знать уязвимости, которые создают риски для безопасности программного обеспечения.
Ниже представлен перечень наиболее распространенных уязвимостей ПО:
Слабая защита данных — ставит под угрозу конфиденциальность данных и позволяет злоумышленникам украсть конфиденциальную информацию и/или использовать ее в своих интересах.
Бреши в аутентификации — злоумышленники могут похитить или перехватить токены сеанса или комбинацию логина‑пароля.
Бреши в авторизации — позволяет злоумышленникам обходить системные ограничения и выполнять команды и действия, которые им не должны быть разрешены.
SQL инъекции — когда система не проверяет подлинность и не осуществляет валидацию полученных данных (кода) и позволяет злоумышленникам манипулировать ненадежными данными в своих интересах (подделывать запросы в программе).
Межсайтовый скриптинг — позволяет злоумышленникам манипулировать данными во время сеанса. Таким образом они могут получать необходимую им информацию или выполнять другие вредоносные действия.
Небезопасная десериализация, предоставляющая злоумышленникам лазейки для изменения сериализованного объекта. Таким образом, они могут выполнить код по своему выбору или осуществлять другие атаки.
Стандарты безопасности программного обеспечения
В зависимости от типов обрабатываемых данных, отраслей, доменов и стран существуют различные стандарты безопасности программного обеспечения.
Наиболее известными и распространенными стандартами в мире являются:
PCI DSS, стандарт безопасности данных индустрии платежных карт, который является обязательным для соблюдения при создании программного обеспечения, связанного с карточными платежами.
Различные криптографические стандарты — ГОСТ 28 147–89 (Россия), Advanced Encryption Standard (США), ISO/IEC 18 033–3 (Европа) — для обеспечения конфиденциальности данных, обрабатываемых, хранимых и передаваемых внутри приложения или посредством этого приложения.
Среди новейших национальных стандартов, рекомендаций и требований можно выделить следующие:
Стандарты и рекомендации по стандартизации в области криптографической защиты — ПНСТ 799–2022 «Информационные технологии. Криптографическая защита информации. Термины и определения» и Р 1 323 565.1.043–2022 «Информационная технология. Криптографическая защита информации. Контрольные примеры использования российских криптографических алгоритмов в протоколе безопасности транспортного уровня (TLS 1.3)».
Стандарты по организации идентификации и авторизации — ГОСТ Р 70 262.1–2022 «Защита информации. Идентификация и аутентификация. Уровни доверия идентификации».
Требования по безопасности информации к средствам виртуализации (утв. приказом ФСТЭК России от 27.10.2022 № 187.
Стандарты свежие, введенные в действие в 2023 году. При этом, в 2023 году планируется разработка множества других национальных стандартов разработки программного обеспечения с высоким уровнем безопасности.
В заключение подытожим, что уязвимости компрометируют программное обеспечение не только с точки зрения таких атрибутов безопасности, как конфиденциальность, аутентификация и авторизация, но и с точки зрения целостности (например, инъекции) и доступности (например, межсайтовый скриптинг). Следовательно, необходимо просчитывать эти риски и устранять их при разработке бизнес‑логики и кодировании. Кроме того, для обеспечения конфиденциальности данных и создания системы с высоким уровнем безопасности существует множество стандартов, которых следует придерживаться при разработке ПО.