Czytaj książkę: «Защита систем. Чему «Звездные войны» учат инженера ПО», strona 3

Czcionka:

Спуфинг-атаки

В этой главе спуфинг рассматривался как нарушение подлинности. Я хочу, чтобы вы подумали о нем шире: думайте о спуфинг-атаках как о разрыве или запутывании связи между идентификатором и объектом.

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

Спуфинг файлов

Путаница в том, какой именно файл представлен некоторым именем, может быть результатом человеческой неточности или подмены файла злоумышленником. И, в отличие от C-3PO, большинство компьютеров не спрашивают: «Какие планы? О чем ты говоришь?» Люди дают файлам самые ужасные имена и сохраняют файлы в нескольких каталогах, но угрозы возникают там, где злоумышленник может подменить файл.

Открытие файлов

Идентификатор файла – это имя файла. Оно может быть подделано, когда файл указан недостаточно определенно (open «config.txt»). Если файл содержит удаленную ссылку, такую как http://example.com/config.txt, связь с example.com может быть подделана.

Простейшей формой поддельных файлов является невозможность получить файл, когда вы его открываете. Например, какой файл открывает fd = open («./file.txt»)?

Если вы скажете своему компьютеру open(«~/.ssh/id_rsa»), то файл, который вы в результате получите, зависит от реализации open() и от эффективного либо реального UID-процесса. Было бы ошибкой уделять здесь слишком много внимания определению «угрозы спуфинга». Гораздо важнее, чтобы ваш код обрабатывал эти потенциальные неточности или неоднозначности безопасным, надежным и защищенным способом. Что еще более важно: если вы не уверены в том, какой именно ресурс вы собираетесь получить или как он сопоставляется с вашими ожиданиями и историей с этим файлом, существуют риски безопасности, с которыми должен справиться ваш код, читающий этот файл.

Полный путь является лучшим подтверждением идентичности. Вы можете быть уверены, когда вызываете open(«/etc/passwd») или когда добавляете тщательно проверенный префикс (/usr/local). Но это не всегда позволит вам получить тот файл, который вы ожидаете!

Например, /tmp/file.txt может принадлежать любому пользователю системы и иметь удивительное содержимое. Добавление случайных чисел не защищает вас; open(«/tmp/file2345.txt») требует только, чтобы злоумышленник создал 10 000 файлов (или символических ссылок), чтобы гарантировать, что они контролируют файл, который вы открываете.

Открытие неожиданного файла становится более неприятным, когда открытый файл интерпретируется как код, например, когда open заменяется на dlopen или LoadLibrary. (Открытие файла и его неожиданная интерпретация как кода еще более неприятны, это описано в главе 8 «Распознавание и порча».) Каждая функция загрузки библиотеки имеет путь поиска, и на этот путь поиска можно повлиять. В Unix-системах LD_LIBRARY_PATH и другие переменные окружения влияют на то, что открывается, создавая проблему, особенно для setuid-кода. В Windows набор путей для поиска библиотек по умолчанию уже давно включает текущую папку (.), и это создает проблемы для кода, выполняемого из общей папки загрузок. Все, что нужно сделать злоумышленнику, это найти библиотеку, которая есть не во всех системах, а затем загрузить ее в папку для загрузок, и любые программы, запущенные оттуда, будут послушно использовать эту библиотеку. Это часто называют проблемой «попутной загрузки», но на самом деле это проблема поддельной библиотеки.

Введение новой библиотеки в «доверенные» каталоги может изменить поведение уже установленных программ. Конечно, существуют и другие способы открытия программы, такие как семейство вызовов exec, все они могут быть вызваны с помощью неспецифических путей. Существует вариант, в котором нужный файл имеет имя типа npm: leftpad или BigBankValidationLibrary. Многие системы сборки также имеют путь поиска, и поэтому будут искать BigBankValidationLibrary всякий раз, когда ищут пакеты, такие как NPM или Maven. И оказывается, что ответ меняется, так что, если вчера эта библиотека была в приватном репозитории, а сегодня есть версия в публичном репозитории, что ж, мы должны взять публичную версию, верно? (В 2021 году исследователь безопасности Алекс Бирсан (Alex Birsan) создал впечатляющую демонстрацию этого с помощью различных трюков, чтобы показать, что запускаются именно его библиотеки, чтобы он мог собирать вознаграждения за обнаруженные ошибки [Montalbano, 2021].)

Природа пути к файлу становится еще более непростой, когда имя сформировано не от корня локальной машины. Один из пределов сложности образуют URL-адреса, которые обсуждаются в главе 8. Может случиться так, что указание файла через URL-адрес сделает указатель более конкретным, или добавит безопасности за счет TLS. Но это также может усложнить синтаксический анализ, привести к сбоям или возможностям для атаки, даже если URL-адрес является статической строкой в коде. Сложность добавляется тем, что библиотека должна взять путь file:///etc/passwd, распознать, что это URL-адрес файла, и следовать соответствующей ветке кода. При вызове удаленных компьютеров появляются дополнительные режимы сбоя. Если вы ссылаетесь на файл как на https://example.com/style.css, есть вероятность, что этот файл стилей будет недоступен или вы получите либо старую, либо искусно вставленную кэшированную версию. Если вы владеете доменом example.com и лично поддерживаете его, этот риск снижается. И наоборот, становится выше по мере ослабления вашего контроля. Существуют также вредоносные режимы сбоя, которые также более подробно рассматриваются в главе 8. А пока представьте, что кто-то взломал www.example.com и заменил файл, на который вы полагаетесь. Разумно предположить, что такой инцидент больше соответствует определению «подделки», но примеры, когда хост подделывается, более сложны для объяснения и рассматриваются в разделе «Спуфинг машин».

Подделка файлов

Другой способ подмены файла – заставить кого-то открыть файл, который, по его мнению, аутентифицирован. Злоумышленник может сделать это, захватив компьютер, чтобы предложить поддельные файлы, изменить цифровые подписи или воспользоваться слабостями в схемах аутентификации. Например, возможно, когда R2-D2 открывает файлы на «Звезде смерти», эти файлы поступают из приманки (сервера-ловушки), и именно поэтому так легко удается найти, где содержится принцесса Лея.

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

Кроме того, можно изменить файл, не нарушая схему подписания. Это более распространено, чем вы могли бы ожидать. Например, в Windows можно добавить дополнительную информацию в подписанный файл и выполнить его. (Детали сложны, но вариантам проблемы были присвоены идентификаторы CVE-2012-0151 и CVE-2013-3900.)

Спуфинг процессов

Файлы – это не единственное пространство имен на компьютере. Процессы также имеют имена и способы обращения к ним. Многие протоколы локальной межпроцессной связи предполагают, что только правильный код может прослушивать определенный порт или файловый сокет. Точно так же в коде часто предполагается, что владельцем удаленного процесса должен быть root, потому что он прослушивает порт с номером меньше 1024.

После того как R2-D2 был похищен джавами, ему удается избежать контроля со стороны «блокиратора», который они установили, и продолжить свою миссию по доставке сообщения Оби-Вану Кеноби. Возможно, он запустил виртуальную машину и позволил блокиратору перенастроить ее, а не свою основную систему? Или, может быть, я слишком много об этом думаю. (На эту двусмысленность впервые указал Джим Дэвис.)

Спуфинг машин

Начнем с простой модели коммуникации между двумя машинами: назовем исходную машину SRC, а целевую машину – DST, как показано на рисунке 1.3. SRC отправляет пакет, и он прибывает к DST. Волшебно, правда? И до тех пор, пока SRC и DST находятся в сети, свободной от угроз, это легко! Но в интернете может быть более одной машины с именем DST. Могут быть DST.example.org и DST.example.com, а также могут быть другие машины, которые отправляют или получают пакеты, выдавая себя за то или иное. Это полезная и распространенная мысленная модель того, как машины общаются, и, как и все модели, она неверна. Злоумышленник может отправлять пакеты, различными способами утверждая, что они исходят от машины с именем SRC. Многие системы, которые авторизуются на основе IP-адреса, такие как rsh, устарели и были выведены из обращения, но другие, например межсетевые экраны, продолжают широко использоваться.

Рис. 1.3. Простая модель коммуникации


Имена машин подвержены подмене на каждом уровне сетевого стека и при каждом взаимодействии между такими именами. Рассмотрим «простой» запрос на dst.threatsbook.com/index.html и уточним потоки данных, поддерживающие этот запрос. Как показано на рисунке 1.4, создается множество соединений, каждое из которых подвержено спуфингу.

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


Рис. 1.4. Множество соединений, поддерживающих запрос


Возможно, машина, которой притворяется взломщик, авторизована для отправки почты или для разрешения входа в систему без многофакторной аутентификации. Поддельные адреса отправителя часто ломают авторизацию, связанную с отправителями, или могут использоваться для обеспечения дополнительных уровней сбоя аутентификации. Когда поддельное сообщение является IP- или UDP-пакетом, вы можете подделать его «вслепую». Фальшивый источник будет получать ответы, но у вас нет необходимости управлять порядковыми номерами или другими вещами. Это становится все труднее сделать, если вы находитесь на расстоянии значительного количества сетевых переходов, так как многие сети теперь реализуют фильтрацию адресов источника и не будут пересылать пакеты, которые не должны были исходить из их сетей.

Будем считать, что это только что загруженный ноутбук, подключенный к физической локальной сети Ethernet. Каждый уровень подвержен угрозам. Например, возможно, DHCP-сервер выдал нам плохой DNS-сервер, или, возможно, он был неправильно настроен вручную. Причины обозначаются заглавной буквой, их следствия – строчной. Таким образом, D означает угрозы, которые неправильно направляют IP-пакеты, а d – пакеты, отправляемые не туда. Смотрите таблицу 1.1.


Таблица 1.1. Действия и угрозы


Вы могли бы думать о TCP-кадре, содержащем строку GET http://dst.threatsbook.com/index.html HTTP/2.0. Но этот кадр не перемещается сам по себе. Он инкапсулирован в IP, который может проходить через Wi-Fi для первого перехода, кабельный модем для следующего и через что угодно в качестве магистрали. Обычно мы игнорируем инкапсуляцию и декапсуляцию, но это может иметь значение, потому что угрозы возможны на каждом уровне стека и в каждой системе, которая добавляет, удаляет или изменяет уровень. На рисунке 1.4 показано сообщение, идущее от SRC к DST, с маршрутизатором посередине, и это часто полезная модель. Но эта модель позволяет легко забыть, что при каждом переходе пакет транслируется. Возможно, первый переход – это Wi-Fi, и точка доступа принимает пакет и добавляет заголовок Ethernet для отправки его на кабельный модем. Кабельный модем отбрасывает кадр Ethernet и добавляет заголовок docsis, и так далее. Как показано на рисунке 1.5, дейтаграмма IP остается неизменной для каждого прыжка, но изменяется локальная инкапсуляция. Каждая из этих систем – это машина в роли обезьянки посередине, и мы либо надеемся, что она добросовестно выполняет свою работу, либо добавляем средства защиты, чтобы гарантировать, что так и будет.


Рис. 1.5. Инкапсуляция пакетов, переходы


Таким образом, для любой из угроз D из таблицы 1.1 маршрутизатор может посылать пакеты (IP, TCP, HTTP) на фактическую spoofed.example.com и изменять ответы, или он может отправлять пакеты на альтернативную машину, настроенную так, чтобы притворяться, что она и есть spoofed.example.com. Другая инфраструктура маршрута обладает такой же способностью, и некоторые из ее элементов, такие как балансировщики нагрузки, размещаются там именно для выполнения этой технической фальсификации, часто с благими намерениями.

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

Спуфинг в конкретных сценариях

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

Интернет вещей

Проектировщики должны учитывать, кто является законным пользователем и как он будет проходить аутентификацию на устройстве. Мы также должны подумать о том, как аутентифицировать устройство для других устройств, включая Wi-Fi, облачные серверы и т. д.

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

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

Точно так же на некоторых телефонах теперь есть рабочие учетные записи и детские учетные записи. Модные автомобили поставляются с ключами парковщика.

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

Безопасная аутентификация на новом устройстве может быть сложной задачей. Для многих устройств пароль был легко найден с помощью Google, потому что он является общим для всех устройств, сделанных производителем, или, что еще хуже, это что-то вроде admin и работает у разных производителей. Это электронный эквивалент двери без замка с табличкой «Только уполномоченный персонал». У злоумышленников в голове есть списки распространенных паролей и инструменты для подбора тысяч паролей по умолчанию, которые собираются и публикуются. Для других устройств паролем является что-то вроде Ethernet-адреса устройства, доступного любому пользователю локальной сети. Во многих юрисдикциях это уже недопустимо, и для каждого устройства требуется уникальный пароль. Вам нужно будет решить, будет ли он виден гостям, официантам и другим лицам, у которых может быть доступ к устройству.

Голосовой доступ означает, что физическое местоположение менее ограничено, чем вы думаете. Открытые окна похожи на открытые двери, или вы можете попросить Siri открыть их для вас. (Мы рассмотрим клонирование голоса в разделе «Атаки на фактор „Кто вы такой“» далее в этой главе.) Устройства могут быть размещены не в домах и частных офисах, а в магазинах, где персонал или клиенты могут быть мотивированы атаковать их, или в Airbnb, где у злоумышленника есть значительное время на атаку если он того пожелает.

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

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

Эти ограниченные пользовательские интерфейсы также затрудняют отображение индикаторов безопасности или данных, которые могут быть использованы при принятии решений о безопасности, включая URL-адреса. Существует веский аргумент в пользу того, что просить людей анализировать URL-адреса – это пустая трата времени и усилий [Herley, 2010], и этот аргумент подкрепляется ограничениями как IoT, так и мобильных телефонов.

Мобильные телефоны

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

Пара распространенных заблуждений заключается в том, что телефоны сопоставляются один к одному с людьми и что телефонные номера являются хорошими аутентификаторами. Многие люди верят в глубоко демократический принцип «один человек – один телефон», но это не так. Некоторые люди имеют более одного телефона или более одной SIM-карты, особенно за пределами США.

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

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

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

Облако

Многие облачные системы поддерживают сложное многоуровневое делегирование полномочий. Текст «Терминология и понятия организаций» одного из поставщиков облачных услуг начинается с обсуждения «базовой организации, состоящей из пяти учетных записей, которые организованы в четыре организационные единицы под корнем». Существует управляющая учетная запись, которая обладает бóльшими полномочиями, а также возможность назначать разрешения этим учетным записям в политиках. Если существует более одной учетной записи и человек их регулярно использует, скорее всего, возникнет путаница. (Хочу подчеркнуть: сложность быстро растет!)

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

Соображения по аутентификации в организациях

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

Когда люди отвечают за проверку информации о незнакомцах, удивительно трудно определить, что такое «хорошо», и претворить это в жизнь нормальным образом. Трудно сопоставить человека с маленькой фотографией, сделанной много лет назад и напечатанной как часть удостоверения личности. Когда свойство – это «коллега по работе в крупной организации», социальное давление, заставляющее сказать «ОК», может оказаться высоким. Злоумышленники будут изучать руководства целевой организации, чтобы говорить как их жертвы. Люк и Хан знают, что у них нет хорошего ответа на вопрос «Ваш боевой номер?», когда они притворяются штурмовиками, поэтому им приходится сделать вид, что их рация неисправна.

Есть много нюансов. Например, мое удостоверение личности университета штата является «удостоверением личности государственного образца», но оно, вероятно, не позволит мне сесть в самолет. Уровень требуемых доказательств, как правило, должен уравновешивать требования безопасности и бизнеса, то есть быть достаточно хорошим, чтобы можно было сказать: «Мы честно старались соблюсти правила», – и не растерять при этом слишком много клиентов. Многие свойства этих проверок подлинности являются общими с проверкой подлинности на компьютерах; люди, как правило, справляются с исключениями, но компьютер менее гибок, хорошо это или плохо. Точно так же требования к обширной документации должны быть сбалансированы с потребностями клиентов, которые могут посчитать ее чрезмерно навязчивой. Безопасность является одной из нескольких важных составляющих в этих расчетах.

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