Защита систем. Чему «Звездные войны» учат инженера ПО — страница 54 из 68

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

Разновидностью проблемы с двумя парсерами является обнаружение вторжений в сеть. Классическая работа исследователей Тома Птачека и Тима Ньюшема показывает, какие атаки, которые они называют «вставкой и уклонением», неизбежны при сетевом наблюдателе [Ptacek, 1998]. Это также относится к брандмауэрам веб-приложений: если у них другой парсер, чем у вашей конечной точки (endpoint), они могут интерпретировать соединения по-разному. Например, если брандмауэр получает пакет с полем TTL («срок жизни»), равным 2, и, таким образом, пакет пройдет только два дополнительных скачка (hops), должен ли он ожидать, что конечная точка увидит пакет, или нет? И это относится не только к брандмауэрам. Если какое-то прокси приложения терминирует TCP-соединение, он анализирует протокол и создает сообщения для дальнейшей отправки. Как отдельный парсер, он может создавать объект, а затем использовать этот объект для создания сообщений. (Он также может либо слепо копировать, либо применять философию нулевого копирования, в обоих случаях обеспечивая меньшую защиту.)

Дизайн протоколов и форматов файлов

Обсуждая синтаксический анализ в конкретных ситуациях, я предполагаю, что формат был определен. Если этого не произошло, усилия, которые вы затрачиваете на конкретное и формальное определение протокола, окупятся. Кроме того, существуют некоторые принципы проектирования. К ним относятся простой дизайн, ограничение рекурсии или вложения, а также обеспечение предварительной отправки полного документа (избегание включений, особенно удаленных). Иногда есть веские инженерные причины для включения других входных данных. Если сделать это в четко очерченном разделе includes в начале документа, то, по крайней мере, ограничится сложность синтаксического анализа, а шаблон «включить в любое место» (include anywhere) вызовет огромное количество проблем с удаленным включением файлов.

Сложность языка

У специалистов по информатике есть способ обсуждать сложность языков. Они делят языки на несколько категорий, включая обычные языки, контекстно-свободные языки, контекстно-зависимые и рекурсивно перечислимые языки. C-3PO понимает всю эту иерархию языковой сложности и был бы рад объяснить ее кому-нибудь! Если C-3PO недоступен и вы хотите узнать больше, лучше всего начать со статьи Сергея Братуся и его коллег Beyond Planted Bugs in ‘Trusting Trust’ («За пределами ошибок, заложенных в „Доверительном доверии“») [Bratus, 2014].

Заключение

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

Йода предупреждает Люка Скайуокера, что только полностью обученный рыцарь-джедай с Силой на его стороне сможет победить Вейдера и его Императора. Точно так же только полностью обученный синтаксический анализатор сможет справиться со всеми входными данными, которые ему скармливают. К сожалению, у нас нет ни Йоды, ни даже драматической музыки, которая предупреждала бы нас об опасностях синтаксического анализа. Легко упустить из виду, откуда поступили входные данные или какая проверка была выполнена. При анализе легко упустить из виду множество угроз.

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

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

9Поэтапные кибератаки (kill chain)

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

Повстанцы анализируют украденные чертежи «Звезды смерти» и находят слабое место. Появляется «Звезда смерти» (а не флот звездных разрушителей), и повстанцы могут использовать свои истребители X-wing и недоученных джедаев, чтобы доставить торпеду точно в нужное место, где она уничтожит «Звезду смерти».

За исключением X-wing и «Звезд смерти», угрозы не появляются в вакууме. У технологии есть контекст, и этот контекст определяет путь злоумышленника. Для каждой атаки злоумышленник будет проводить рекогносцировку или экспериментировать. Эксперименты могут быть как простыми, например «Отправлять пакеты атаки на последовательные IP-адреса», так и сложными, например «Мы создадим группу фальшивых компаний, а затем завербуем людей для „работы из дома“, чтобы они пересылали посылки и отмывали нам деньги». Даже люди, которые просто сканируют последовательные IP-адреса, должны получать ответы, помещать их в базу данных, а затем использовать результаты.

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

Приведу пример цепочки.

1. Проанализируйте чертежи «Звезды смерти». (Разведка.)

2. Выясните, что небольшой истребитель может доставить торпеду. (Вооружение.)

3. Долететь до «Звезды смерти», затем лететь по шахте. (Доставка.)

4. Выстрелить. Это все равно что отстреливать крыс-вомпов у себя на заднем дворе. (Применение эксплойта.)

5. Торпеда добирается до реакторной системы. (Установка.)

6. Торпеда взрывается точно в нужном месте благодаря встроенной логике управления. (Управление и контроль.)

7. Происходит большой бум, разрушающий «Звезду смерти». (Выполнение целевого действия).

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

Мы рассмотрим цепочки угроз для программного обеспечения, которое слушает соединения (серверы), программного обеспечения, которое подключается (клиенты), и гибридных систем обмена сообщениями, в которых сервер прослушивает, ставит в очередь и отправляет сообщения клиенту. И клиент, и обмен сообщениями будут сгруппированы в «рабочие столы», где они традиционно исполняются. Все эти цепочки – клиент, сервер, обмен сообщениями – заканчиваются тем, что злоумышленники получают полномочия на выполнение кода. Другие цепочки приводят к тому, что злоумышленники авторизуются с реальными учетными данными.

За описанием этих двух стратегий для получения полномочий (взлом программы или использование учетных данных) следует описание цепочек в определенных сценариях, таких как облако, искусственный интеллект и мобильные устройства. После этого вы узнаете об истории цепей и увидите, как их можно соединить. (Звучит как оксюморон: сплету цепи вместе и получу пучок! К сожалению, он не будет таким культовым, как пучки Леи, но, опять же, кто может с ними конкурировать?) Глава завершается разделом, посвященным обороне.

Угрозы: цепочки атак

Цепочка уничтожения, состоящая из разведки, вооружения, доставки, применения эксплойта, установки, управления и контроля, а также целевого действия, является современной классикой [Hutchins, 2010]. Она обладает хорошим сочетанием специфичности и общности, что сделало ее такой выразительной, и мы поговорим о ее истории позже в этой главе. Но, несмотря на то что ее создатели зарегистрировали это название как торговую марку Cyber Kill Chain®, в кибербезопасности существует множество цепочек атак, разработанных для моделирования других атак. Из-за объяснительной силы этой цепочки я буду использовать ее шаги в этой главе, а также изменять их по мере необходимости. Кроме того, я обычно использую термин шаг для обозначения отдельной задачи, а когда может потребоваться несколько похожих шагов, я называю это стадией. Таким образом, стадия «Доставка» цепочки убийства «Звезды смерти» включает в себя шаги полета к «Звезде смерти» и доставки торпеды. Конечно, очень важно было не сбиться с намеченной цели по ходу выполнения этих шагов.

Идея рассматривать атаки поэтапно не нова. Эксперты по безопасности часто представляют их либо в виде цепей, либо в виде деревьев. Мы используем цепочки, чтобы посмотреть на то, что злоумышленники уже сделали, и деревья, чтобы представить разворачивающиеся возможности. Мы называем цепи поэтапными атаками, а деревья – деревьями атаки. Конечно, цепочка – это очень простая форма дерева, и различие состоит в основном в акценте на том, «произошло ли это», или на том, «могло ли это произойти», а не на разных представлениях, имеющих внутреннюю сравнимую ценность. Термины «убить» (kill) и «атаковать» являются примерно синонимами.

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

Возможно, вы заметили, что цепочка во вступлении пропускает как минимум две связанные с нею цепочки: «Украсть чертежи „Звезды смерти“» и «Спасти принцессу». В целях моделирования мы опускаем эти детали.

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