Оценка риска и моделирование угроз

Перед записью одной строки кода не торопитесь для разработки программного обеспечения с учетом требований безопасности. Выполнение этого правильно по-настоящему трудно; если Ваш аналитический процесс безопасности кажется простым, Вы, вероятно, пропускаете что-то справедливо основной принцип и теряете большинство преимуществ надлежащего проекта безопасного кода.

Оценка риска и моделирование угроз происходят на трех шагах:

  1. Оцените риск. Определите, сколько необходимо потерять.

  2. Определите потенциальные угрозы. Выясните различные вещи, которые Ваш код делает, который мог подвергнуться нападению (включая вещи, которые платформы и библиотеки делают от Вашего имени).

  3. Смягчите угрозы. Гарантируйте, что хорошо защищены части Вашего кода, который мог подвергнуться нападению.

Оценка риска

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

Предположите, что Ваше программное обеспечение подвергнется нападению

Количество времени и усилие, что атакующий потратит атаку Вашей программы, зависят от нескольких факторов, включая:

  • Значение данных Ваши дескрипторы программы. Это хранит тысячи номеров кредитных карт или набор рецепта пользователя?

  • Степень доверия и безопасность компаний, предоставляющих услуги, от которых зависит Ваш код.

  • Определенные клиенты, купившие Вашу программу. Ваше приложение текстового редактора использует Автоматическим Восстановлением Джо или Big Megacorp, Inc.?

  • Как широко будет распределена Ваша программа. Действительно ли это - приложение, использующееся единственной, маленькой рабочей группой, или это встроено в операционную систему, собирающуюся быть выпущенной во всем мире?

На основе тех тех же факторов необходимо решить, какой уровень риска приемлем. Потеря данных, которые будут стоить Вашей компании 1 000$ для исправления, не выравнивает по ширине усилие по разработке за 10 000$ закрыть все потенциальные ошибки безопасности. С другой стороны, ущерб репутации Вашей компании мог бы стоить намного более в конечном счете, чем это будет стоить, чтобы разработать и разработать безопасный код.

Оцените риск

Вот некоторые факторы для рассмотрения при оценке риска:

  • Какова худшая вещь, которая может произойти, если Ваше программное обеспечение успешно подвергается нападению?

    Это позволит хищение идентификационных данных пользователя, позволит атакующему получать контроль над компьютером пользователя, или просто позволять хакеру получить необычно высокий счет в пинболе?

  • Как трудно это должно предпринять успешную атаку?

    Если использование уязвимости потребовало бы установки Троянского коня на компьютере пользователя, который может использовать в своих интересах состояние состязания, происходящее только, как только в 50 раз программе запускает, Вы могли бы решить, что уровень риска приемлем. Если использование может помещаться в сценарий и использоваться деточками сценария (атакующие, выполняющие предзаписанные сценарии атаки), или автоматизированы для распространения сетями роботов (сети захваченных компьютеров), уровень риска намного выше.

  • Насколько большой цель - он?

    Вы продавали сто копий своего приложения, или оно установлено по умолчанию на сотнях тысяч компьютеров?

    Действительно ли это уязвимо по умолчанию, или только после того, как пользователь выберет необычный набор опций?

  • Сколько пользователей было бы затронуто?

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

  • Насколько доступный цель?

    Выполнение программы требуют локального доступа, или программа принимает запросы через сеть? Аутентификация требуется для установления соединения, или кто-либо может отправить запросы к программе?

Определение потенциальных угроз

Оценка риска дает Вам некоторую индикацию относительно того, как, вероятно, необходимо подвергнуться нападению и сколько ущерба атака могла нанести. Следующий шаг должен выяснить, как Вы могли бы быть атакованы, включая атаки на все Ваши интересы — не только атакует на Вашем программном обеспечении, но также и на Ваших серверах, Вашей компании, и т.д. Чтобы сделать это, Вы создаете модель угрозы, описывающую места, в которых переходит к другому владельцу что-либо имеющее значение (информация, деньги, и т.д.).

Создайте модель угрозы

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

  • Типы данных Ваше приложение будут работать с

  • Ситуации, в которых Ваше приложение должно иметь дело с недоверяемыми данными

  • Типы данных транспортируют Ваше использование приложения

  • Способы, которыми атакующий мог использовать часть программного обеспечения, делающего то, что делает Ваше приложение

  • Стратегии смягчения каждого из тех типов использования

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

Некоторые цели потенциальной атаки могли бы включать входные данные программы или вывести, хранившие данные и операционная среда программы.

  • Входные данные программы. Если атакующий может вызвать переполнение буфера, они могли бы быть в состоянии выполнить свой собственный код или иначе поставить под угрозу данные или систему пользователя.

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

  • Данные, хранившие в системе (или постоянно, как в базе данных, или временно, как в глобальной переменной). Эти данные могли потенциально быть украдены и отправлены атакующему, измененному атакующим, или иначе пошли на компромисс.

  • Среда программы. Среда выполнения программы включает свои открытые дескрипторы файлов, переменные окружения, порты Маха, предпочтительные файлы, и т.д.

Рассмотрите типы угроз

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

Угрозы данным

Атакующий может изменить данные. Это включает:

  • Данные, используемые внутренне программой (такой как межпроцессные сообщения)

  • Данные действовали на программой (такой как числа, которых программа делает статистический анализ или аудиотрек, который программа фильтрует),

  • Данные сохранили на диске, к которому программа предоставляет доступ..

Точно так же атакующий может поставить под угрозу данные и получить доступ к секретам.

Атакующий может изменить или поставить под угрозу данные непосредственно, говоря программе изменить или возвратить данные, которые это не должно было изменить или возвратить. Однако атакующий может также изменить или поставить под угрозу данные косвенно при помощи Вашей программы для взятия под свой контроль компьютера.

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

Угрозы обслужить доступность

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

Атакующий может выполнить атаку «отказ в обслуживании» во многих отношениях:

  • Атака ошибок в сетевом стеке

  • Открытые соединения с демоном, начните отправлять запрос, затем продолжайте отправлять его очень, очень медленно

  • Убедите тысячи людей добровольно атаковать Ваш сервер.

  • Открытые миллионы соединений с демоном от сети роботов.

Когда атака «отказ в обслуживании» выполняется большим количеством машин, ее вызывают распределенной атакой «отказ в обслуживании» или DDoS.

Атаки на целостность системы

Атаки на целостность системы полагаются на другие атаки для изменения системы таким способом, которым этому больше нельзя доверять. Если атакующий может найти дефект безопасности в Вашем коде, атакующий мог бы быть в состоянии:

  • Выполните вредоносный код, особенно с администратором или корневым доступом. Атакующий мог бы заставить Ваш код выполнять код атакующего путем использования переполнения буфера или вставкой кода в команде URL, например.

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

  • Исполните роль пользователя или сервера. Атакующий мог бы быть в состоянии предположить или получить допустимое имя пользователя и пароль и поэтому аутентифицировать как авторизованный пользователь.

    Точно так же имитировавший сервер мог бы быть в состоянии убедить клиентское приложение, что это - законный сервер, затем заставьте клиент давать ему данные или заставлять пользователя обеспечивать секреты, такие как пароли.

    Наконец, имитировавший сервер мог бы быть в состоянии убедить наивного пользователя, что сервер законен. Например, пользователь не мог бы исследовать окно, содержащее веб-страницу достаточно, чтобы заметить, что отсутствует значок блокировки (или другой индикатор безопасного сайта). Используя такой злонамеренный веб-сайт для получения пользовательских данных вызывается фишингом.

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

Смягчение угроз

После определения, какие части экосистемы программного обеспечения (приложения, серверы, локальные демоны и агенты, и т.д.) могли бы подвергнуться нападению, необходимо предпринять шаги, чтобы смягчить те угрозы — т.е. сделать их менее наносящими ущерб.

Используйте общие методы смягчения

Средние значения смягчения угроз в программном обеспечении являются многими и варьировались, но несколько базовых методов распространены:

  • Проявите дополнительную заботу при работе с данными из потенциально недоверяемого источника. В частности безопасное программное обеспечение должно всегда проверять свои вводы.

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

  • Минимизируйте риск информационного раскрытия путем разделения приложений и обеспечения, что каждая часть приложения может получить доступ только к информации, в которой это нуждается.

  • Выполните fuzzing — отправляющий неправильных данных в Ваше приложение или демона, чтобы видеть, повреждается ли это — и исправьте любые ошибки, которые Вы находите в процессе.

  • Используйте в своих интересах функциональность безопасности, встроенную в операционную систему вместо того, чтобы заново изобрести колесо.

Знайте компромиссы

При решении, как смягчить угрозу, имейте в виду, что часто существуют компромиссы между безопасностью и удобством. Безопасность программного обеспечения должна установить равновесие между безопасностью и удобством пользования. Рассмотрите два экстремальных примера проектирования программного обеспечения:

  • Одна программа требует аутентификации с помощью многократных методов аутентификации прежде, чем выполнить любую работу, работает только достаточно долго для выполнения той работы, не совместно использует использование CPU ни с какой другой программой, и затем выходит, требуя reauthorization для следующей работы.

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

  • Другая программа всегда работает с полномочиями пользователя root и выполняет любую работу, которую Вы любите, никогда не требуя авторизации.

    Такая программа проста в использовании, и на физически безопасном компьютере, не подключенном к сети, это могло бы даже быть умеренно безопасно. Однако под наиболее нормальными условиями, это была бы огромная угроза безопасности.

Ясно ни одно из этих экстремальных значений не устанавливает оптимальное равновесие между пользовательским удобством и безопасностью. Как разработчик, это - Ваша ответственность решить, где Ваше программное обеспечение должно вписаться в этот континуум на основе ущерба, который мог бы произойти, если Ваша программа поставится под угрозу (риск) и типы атак, то программное обеспечение, вероятно, обратится (угроза).

После окончания

Даже когда Вы заканчиваете эту оценку, Ваша работа не выполнена; необходимо повторить эту оценку равномерно по пути. В частности:

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

Общие критерии

Правительства США, Канады, Соединенного Королевства, Франции, Германии и Нидерландов сотрудничали для разработки стандартизированного процесса и набора стандартов, которые могут использоваться для оценки безопасности программных продуктов. Этот процесс и набор стандартов вызывают Общими Критериями.

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

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

Узнавать больше

Много сторонних книг безопасности описывают моделирование угроз более подробно. Посмотрите Другие Ресурсы Безопасности для полного списка.