Безопасность приложений

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

Термины

  • Актив — ценный ресурс, например: данные в базе данных, денежные средства на счёте, файл в файловой системе либо иной системный ресурс.
  • Уязвимость — «слабое место» в программе, которое может быть использовано злоумышленниками для получения несанкционированного доступа к активу.
  • Атака — действие, предпринятое для нанесения ущерба активу.
  • Угроза — любое обстоятельство, способное использовать уязвимости для получения доступа, повреждения или уничтожения актива.

Методы

Существуют различные методы выявления различных классов уязвимостей приложений, причём каждый метод эффективен на определённых этапах жизненного цикла разработки программного обеспечения.

  • Whitebox («белый ящик») — анализ исходного кода. Специалист по безопасности с глубоким пониманием приложения вручную просматривает исходный код для поиска уязвимостей. Благодаря знанию внутреннего устройства возможно выявление уникальных уязвимостей именно данного ПО.
  • Blackbox («чёрный ящик») — тестирование приложения без доступа к источникам, только путём работы с интерфейсом (поведенческое тестирование).
  • Пересмотр дизайна — моделирование угроз на ранних этапах, до написания кода.
  • Автоматизированная проверка — использование специализированных инструментов для анализа кода, часто сопровождается большим количеством ложноположительных срабатываний, чем при ручном анализе.
  • Bug Bounty — программы, организуемые многими сайтами или разработчиками, в рамках которых пользователи получают вознаграждение и признание за выявление уязвимостей.

Корректное применение этих методов на всех этапах жизненного цикла разработки является задачей команды, отвечающей за безопасность.

Угрозы приложениям (атаки)

Согласно публикации «Improving Web Application Security», основные типы угроз и атак на приложения сводятся к следующим категориям:

Категория Угрозы / Атаки
Ввод данных Переполнение буфера; Межсайтовый скриптинг; Внедрение SQL-кода; канонизация
Фальсификация ПО Изменение поведения посредством бинарных патчей, замены или расширения кода
Аутентификация Прослушивание сетевого трафика; атаки «грубой силой»; перебор по словарю; перехват и подделка куки; кража учётных данных
Авторизация Повышение привилегий; раскрытие конфиденциальных данных; модификация данных
Управление конфигурацией Несанкционированный доступ к интерфейсам администратора; к файлам настроек; поиск открытых текстовых данных; чрезмерные привилегии процессов и сервисов
Конфиденциальная информация Доступ к уязвимому коду или данным; перехват трафика; внедрение вредоносного кода или данных
Управление сессией Похищение сеанса; Атака повторного воспроизведения; атака «человек посередине»
Криптография Генерация незащищённых ключей или их неверное хранение; использование слабого либо нестандартного шифрования
Манипуляция параметрами Изменение строки запроса, данных формы; манипуляции с куки; изменение заголовков HTTP
Управление исключениями Раскрытие сведений; отказ в обслуживании
Аудит и журналирование Пользователь блокирует выполнение операции; злоумышленник действует без следов; удаление или скрытие следов деятельности

Сообщество OWASP публикует список из 10 наиболее критичных уязвимостей веб-приложений и рекомендует лучшие практики обеспечения безопасности для организаций, формируя открытые стандарты отрасли[1]. К основным угрозам приложений по состоянию на 2017 год относятся:[2]

Категория Угрозы / Атаки
Внедрение Внедрение SQL-кода; NoSQL; внедрение команд ОС; атакующие запросы механизмов объектно-реляционного отображения; LDAP-инъекции
Взлом аутентификации Использование украденных или скомпрометированных учётных данных; атаки перебором; слабые пароли
Компрометация чувствительных данных Использование слабой криптографии; хранение нешифрованных данных
Внешние XML-объекты Эксплуатация уязвимостей через внешние XML-объекты
Взлом контроля доступа Неправильная настройка CORS; несанкционированный просмотр; повышение привилегий
Неправильная настройка безопасности Неустранённые уязвимости; неправильная конфигурация; устаревшее ПО
Межсайтовый скриптинг (XSS) Отражённый (непостоянный); хранимый (постоянный); DOM-базированные сценарии
Небезопасная десериализация Изменение данных и структур объектов; подделка данных
Использование уязвимых компонентов Слабозащищённое или устаревшее ПО; неприменённые исправления уязвимостей; уязвимости в фреймворках
Недостаточное журналирование и мониторинг Отсутствие регистрации событий; неинформативные логи; неспособность обнаруживать атаки в реальном времени

Защита мобильных приложений

Вероятно, что процент устройств с открытой мобильной платформой будет и далее расти. Открытость платформ предоставляет широкие возможности мобильной экосистеме — добавление, удаление, обновление программ и сервисов по запросу пользователя. Однако такая открытость приводит к возможности неограниченного доступа к ресурсам устройства и интерфейсам API со стороны приложений неизвестного или неблагонадёжного происхождения, что чревато вредом для пользователя, системы, сети, если не используются специальные архитектуры и меры сетевой безопасности. В большинстве современных мобильных систем с открытыми ОС (Symbian OS[3], Microsoft, BREW и др.) реализуются те или иные варианты обеспечения безопасности. В 2017 году компания Google расширила свою bug bounty-программу, начав считать уязвимости сторонних приложений из Google Play Store[4]. Существуют и отраслевые рекомендации, подготовленные организациями, такими как Ассоциация GSM и Open Mobile Terminal Platform (OMTP)[5].

Наиболее распространённые стратегии повышения безопасности мобильных приложений:

  • Формирование «белого списка» доверенных приложений
  • Реализация безопасности транспортного уровня
  • Жёсткая аутентификация и авторизация
  • Шифрование данных перед записью
  • Песочница для приложений
  • Гранулированная настройка доступа к API
  • Привязка процессов к глобальному идентификатору пользователя
  • Определение механизмов взаимодействия приложения и ОС до установки
  • Запрос пользовательского подтверждения для предоставления прав доступа
  • Корректное управление сессией

Тестирование безопасности приложений

Тестирование безопасности выявляет уязвимости и бреши, которые позволяют злоумышленникам использовать приложение в своих целях. В идеале, такие тесты должны проводиться на каждом этапе жизненного цикла разработки, чтобы своевременно устранять угрозы. Однако зачастую тестирование проводится лишь на последней стадии. Рост популярности DevOps и практик непрерывной доставки способствует интеграции тестирования безопасности на всех этапах разработки[6][7].

Сканеры уязвимостей и специализированные инструменты для тестирования веб-приложений (также называемые средствами сквозного тестирования) широко применяются автоматизированно, однако не заменяют ручную проверку исходного кода. Анализ исходных текстов может быть ручным или автоматическим; при больших объёмах кода (сотни тысяч строк) предпочтительны автоматизированные инструменты с последующим ручным анализом результатов.

Распространённые продукты для анализа уязвимостей предоставляют разные возможности и уровни автоматизации. Это зависит от типа предоставляемых данных (исходный код, двоичный файл, HTTP-трафик, настройки), качества и глубины анализа. К основным технологиям относятся:

Статическое тестирование безопасности приложений (SAST) — анализ исходного кода до компиляции и запуска программы. Методы SAST отличаются низким уровнем ложноположительных срабатываний, но требуют наличия исходников, тонких настроек и больших вычислительных ресурсов.

Динамическое тестирование безопасности приложений (DAST) — исследование работающего приложения с помощью запросов к внешнему интерфейсу (например, ввод URL-адреса в сканер). DAST проще автоматизировать и интегрировать в рабочие процессы, однако часто требуется ручная настройка, а риск ложных тревог выше[8].

Интерактивное тестирование безопасности приложений (IAST) — анализ с использованием дополнительных программных агентов, получающих доступ к внутренним процессам приложения. IAST объединяет возможности SAST и DAST, позволяя анализировать как код, так и сетевые соединения, библиотеки и конфигурации[9]. Некоторые IAST-решения требуют воздействия на приложение (атаки), другие могут работать и при стандартном тестировании на соответствие[10][11].

Обеспечение безопасности приложений

Рост числа вредоносных программ, атакующих клиентов организаций в интернете, привёл к ужесточению требований к веб-приложениям, начиная с 2007 года. Предполагается, что значительная часть пользователей действует с уже скомпрометированных устройств, а значит, любые данные, поступающие от них, рассматриваются как потенциально опасные. В связи с этим основное развитие получают защитные механизмы на серверной стороне и в инфраструктуре, а не в клиентских компонентах или на веб-серверах[12]. К 2016 году широкое распространение получили технологии самозащиты программ (RASP)[8][13]. RASP встраивается в среду выполнения и позволяет оперативно обнаруживать и блокировать атаки[14][15].

Скоординированное обнаружение уязвимостей

Координационный центр CERT определяет скоординированное раскрытие уязвимостей (CVD, англ. Coordinated Vulnerability Disclosure) как процесс, сокращающий возможность использования уязвимостей злоумышленниками[16]. В CVD участвуют несколько заинтересованных сторон: пользователи, поставщики ПО, эксперты по безопасности, — которые совместно организуют устранение уязвимых мест. Важным условием успешного процесса является эффективное управление коммуникациями и процессами исправления.

В качестве средств организации взаимодействия применяют системы отслеживания ошибок, а также программы Bug Bounty.

Стандарты и требования безопасности

  • Стандарт кодирования CERT
  • CWE (Common Weakness Enumeration)[17]
  • Руководство по безопасности (STIG)
  • ISO/IEC 27034-1:2011 Информационные технологии — Методы безопасности — Безопасность приложений. Часть 1: Обзор и концепции
  • ISO/IEC TR 24772:2013 Информационные технологии — Языки программирования — Руководство по предотвращению уязвимостей через выбор и использование языка
  • NIST SP 800-53
  • OWASP
  • Стандарт PCI DSS (Payment Card Industry Data Security Standard)

Примечания

Категории