1 Спуфинг и аутентичность

Вскоре после того как мы первый раз встречаемся с Люком Скайуокером, он чистит своих только что приобретенных дроидов, а R2-D2 проигрывает ему фрагмент сообщения, которое предназначается только для Оби-Вана Кеноби. Откуда R2-D2 знает, кто такой Оби-Ван Кеноби? Как он принимает решение воспроизвести запись принцессы Леи Оби-Вану, а не Люку? Как я упоминал во введении, эти вопросы затрагивают много аспектов. Давайте углубимся в проблему имен и аутентичности.

Рассматривая это взаимодействие, я буду считать дроидов компьютерами. Поэтому мы можем задавать вопросы типа «Как компьютер идентифицирует человека?». Это один из нескольких ключевых типов аутентификации. Мы также можем спросить, как человек идентифицирует компьютер или один компьютер идентифицирует другой. «Звездные войны» полны проблем, которые возникают из задачи идентификации человека человеком. Почему в приквелах члены Совета джедаев не осознают, что канцлер – это также лорд ситхов Дарт Сидиус?

Аутентичный означает нечто подлинное, настоящее. R2-D2 хочет показать видео только настоящему, аутентичному Оби-Вану, а не любому, кто подойдет и попросит об этом. Чтобы добиться этого, нужны идентификаторы и аутентификаторы. Угрозы спуфинга – это нарушение аутентичности; вы получаете кого-то или что-то, отличное от того, что ожидаете. «Звезда смерти» не в состоянии аутентифицировать R2-D2, когда он подключается к системе, это общая проблема в мире «Звездных войн». В нашем мире ложные (spoofed) коды аутентификации – это тоже общая проблема: мы называем их украденными паролями. Но это не просто фейковые личности; это также фейковые веб-сайты для фишинга и других видов мошенничества.

Идентификаторы и аутентификация

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

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


Рис. 1.1. Способы аутентификации


Рис. 1.2. Сложность аутентификации


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

Технические идентификаторы

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

Фактически всякий раз, когда есть преобразование некоторого реального объекта в представление этого объекта, может возникнуть путаница. Вызовы вроде listen(socket) и open(file) чреваты угрозами, когда вы преобразовываете имя файла в дескриптор файла.

Идентичность машины или сервиса включает имя, например rebelbase.threatsbook.com. Пространство имен компьютеров обычно уникально в некоторых пределах. Идеально было бы, если rebelbase.threatsbook.com было уникальным глобально, но может существовать много компьютеров с доменным именем (DNS) rebelbase.local – один на Явине, другой на Хоте, третий – в вашей локальной сети.

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

Компьютеры часто обладают DNS-именами вроде rebelbase.threatsbook.com. Этот адрес может относиться к одной или нескольким физическим машинам, но это не единственные имена, которые может иметь физический компьютер. Он может иметь UNC-имя, как в Windows, и другие имена. Имя может относиться к более чем одной машине через, скажем, круговую систему (round-robin) DNS, а могут быть слои отображения с каноническими именами (cnames) и другие системы косвенной адресации.

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

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

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

Идентификаторы для человека

В «Звездных войнах» Люк и Хан прикидываются штурмовиками. Один из них, очевидно, штурмовик TK‐421. Имя другого штурмовика мы так и не узнаем, но это не имеет значения: у него есть роль, позиция охранника, и этого достаточно для некоторых целей аутентификации. Бен Кеноби притворяется, что он не Оби-Ван Кеноби, и по ходу лжет Люку, что его отец Энакин убит Дартом Вейдером. Принцесса Лея делает вид, что она не предводитель повстанцев, и это еще только первые тридцать минут «Звездных войн».

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

Многие люди используют больше одного имени. Персонаж «Симпсонов» может быть Жирным Тони или Марионом Д’Амико, а некоторые люди будут его называть дядя Тони. Уильям становится Биллом. Я и вы имеем в виду разное, когда говорим «мама», и в мире есть много людей по имени Джон Смит. Люди обычно справляются с этим. Компьютеры не такие гибкие. Им нужны уникальные, управляемые пространства имен для идентификаторов и аккаунтов. Того же хочет и Империя, поэтому у бедного FN-2187 нет другого имени, пока По Дэмерон не даст ему прозвище Финн в эпизоде «Пробуждение силы».

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

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

Аутентификация людей людьми

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

Бен Кеноби начинает действовать, когда некто, кого он никогда не видел, шлет ему голограмму, говорящую: «Много лет назад во время войны клонов вы служили моему отцу». Разве они не должны были использовать какую-то условную фразу?

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

Аутентификация людей компьютерами

В отличие от «Ромео и Джульетты», где тема идентичности и самозванства в мире людей заканчивается трагически, «Звездные войны» дают нам примеры того, как взаимодействуют люди и технологии. Как Бен Кеноби аутентифицируется у R2-D2, чтобы увидеть голограмму Леи? Когда R2-D2 подключается к системе «Звезды смерти», чтобы найти, где ее держат, какой идентификатор пользователя используется для его SQL-запроса?

(Между прочим, ваш первый ответ, что R2-D2, вероятно, обладает разумом, недостаточен. Лея не знает, что этот конкретный R2 знал Кеноби, поэтому как она могла прописать правило контроля доступа?)

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

Различные типы информации могут учитываться при принятии решения о подлинности (authentication decision). Ниже приведены наиболее часто используемые факторы и примеры каждого из них.

Знание: комбинация сейфа.

Объект, который у вас есть: ключ к депозитной ячейке или ID-карточка.

Биометрия: ваше физическое тело, измеренное или оцененное различными способами (включая фотографию).

Местоположение: непосредственно перед компьютером.

Канал, который вы используете: интернет, телефон или личное присутствие.

Люди, которых вы знаете: доверенные лица и попечители.

Факторы также обладают силой: обычно паспорт рассматривают как более сильное доказательство идентичности, чем читательский билет. Пароль secret не такой сильный, а пароль u8fdFN288jerfskla-#$d очень хорош.

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

Традиционные факторы обозначают как «Что вы знаете», «Что у вас есть» и «Кто вы такой». Они были дополнены такими факторами, как «Где вы находитесь», «Как вы связываетесь» и «Кого вы знаете». Фактор «Где вы находитесь» использовался по умолчанию в эпоху первых компьютеров (рядом со стеклянной комнатой с центральной ЭВМ), потом вышел из употребления на какое-то время и недавно снова появился, включая использование сигналов GPS, а также наносекундный тайминг в часах компании Apple для отпирания ассоциированного с ними компьютера. Канал, который вы используете для связи, может подвергать вас риску (личному) или быть неудобным для самозванца. Звоня по телефону, я рискую обнаружить, что не говорю на языке вуки.

«Кого вы знаете» может включать ваш новый пароль, выданный вашему менеджеру или системе социальной аутентификции, чтобы понять, знаете ли вы своих друзей, чтобы вернуться в соцсеть, или просьбу для доверенных лиц установить подлинность вашей личности, чтобы вернуться на какой-то другой аккаунт. Эти социальные аутентификаторы не так распространены, но, если вам интересно, я обсуждаю возникающие для них угрозы в главе 14 «Учетные записи и идентификация» моей книги Threat Modeling: Designing for Security («Моделирование угроз: проектирование для обеспечения безопасности»).

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

Резервную аутентификацию именуют по-разному: «Забыл пароль», «Восстановление пароля» или «Восстановление учетной записи». Последний вариант наиболее точный: никому дела нет до восстановления своего пароля; все просто хотят получить доступ к учетной записи. Мне вообще не нужно, чтобы я когда-либо знал ваш дурацкий пароль, чтобы получить доступ к некоторой возможности, и вообще-то это не обязательно должна быть моя учетная запись. Это не мелочные придирки, понимание проблемы – ключ к ее надежному решению. Эти резервные системы аутентификации лучше всего работают, если они используют секреты, известные как можно меньшему количеству людей. («Где вы использовали вашу кредитную карту последние три раза?» известно только вам, вашему банку, процессинговой компании кредитных карт, торговым точкам и их агентствам маркетинговых исследований, в то время как «В какую школу вы ходили?» известно всем вашим друзьям в соцсетях и друзьям ваших друзей.)

Иногда дополнительные шаги или факторы выполняются как часть авторизации: вы можете зарегистрироваться (log in) с помощью некоторого пароля, но, чтобы добавить получателя платежа, может потребоваться что-то большее. Такой шаблон обеспечивает некоторое удобство использования (usability), за которое платишь конфиденциальной информацией вроде ваших последних транзакций, которая используется для такой сильной аутентификции. Или, в некоторых случаях, это делается ценой безопасности учетной записи, когда эта конфиденциальная информация используется, несмотря на ее раскрытие. Мы подробнее коснемся полномочий и авторизации в главе 6 «Расширение полномочий и изоляция».

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

Аутентификация компьютеров людьми

Трудно сказать, когда впервые был создан фальшивый экран для ввода логина и пароля: вероятно, в те времена, когда телетайпы заменили на электронные терминалы. Легко было написать программу, которая бы вывела на экран LOGIN:, приняла бы и сохранила имя и пароль, вывела бы Login incorrect (Неправильный логин) и отключилась бы, позволив выполняться настоящей программе для ввода логина и пароля.

Вот почему комбинация Ctrl+Alt+Delete помогала держать ваш компьютер в безопасности: она возвращала вам заведомо настоящую экранную страницу входа. Аналогично кнопка Home на вашем телефоне не может быть перехвачена какой-либо программой, и в идеальном случае это верно для жестов, которые заменяют физические кнопки. Фишинг – это разновидность такого подхода, просто компьютер, которому вы шлете свою аутентифицирующую информацию, находится дальше. Современные схемы фишинга будут запрашивать у вас код, посланный смской на ваш телефон или отправленный на вашу электронную почту. Аналогично мошенники сфальсифицируют информацию о вызывающем (Caller ID), чтобы это выглядело так, будто вам звонят из учреждения, которому вы доверяете: ваш банк или Имперское бюро безопасности Галактической Империи.

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

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

Мы можем распознать C-3PO из-за характерного голоса и манерности, которую создал Энтони Дэниэлс. К сожалению, большинство компьютеров не так легко опознать. Существует множество инструментов, которые облегчают распознавание компьютера, и они часто меняются, чтобы злоумышленникам было легче сбить вас с толку относительно того, что вас ждет сегодня. Подождите, я не думаю, что это делается специально, но это реальный эффект изменений. Инструменты часто меняются в надежде справиться с новыми атаками. Чтобы обезопасить себя от всего этого, нужно взять ситуацию под контроль: нажмите Ctrl+Alt+Delete, откройте сохраненную вами страницу вашего банка, позвоните по номеру, указанному на обратной стороне вашей банковской карты. Это работает гораздо лучше, когда организации упрощают для вас доступ к нужному человеку или человеку с нужной информацией, когда вы берете под контроль процесс аутентификации.

Аутентификация компьютеров компьютерами

Аутентификация важна всякий раз, когда у вас есть вызов, например listen(socket_id). То, что находится по другую сторону этого сокета, должно быть идентифицировано. Когда R2-D2 подключается к сокету, «Звезда смерти» позволяет выполнять всевозможные запросы, возвращая чрезвычайно важную информацию о местонахождении заключенных. Учитывая конфиденциальность полученных данных, мы можем только надеяться, что учетная запись не была guest или rebelscum (гнусный повстанец), но что это было и как R2-D2 доказал возможность использовать эту учетную запись?

Каждая аутентификация может иметь некоторую многоуровневую комбинацию технических и человеческих идентификаторов. Например, у удаленного хоста, вероятно, есть IP-адрес. Он может предоставлять какую-либо форму идентификатора клиента, например файл cookie или токен OAuth. Кроме того, он может иметь идентификаторы человека или сервиса.

Когда клиент инициирует подключение к серверу, любая из сторон может потребовать аутентификацию. Сложности возникают, когда на акт подключения может влиять другой компьютер или когда эта аутентификация осуществляется от имени человека. Простейшим случаем может быть использование Telnet для подключения к IP‐адресу: это происходит в ответ на ввод человеком команды, на которую трудно повлиять. Но чуть более сложные примеры, такие как отправка электронной почты, подвержены влиянию. Если я попытаюсь отправить электронное письмо адресату luke@threatsbook.com, мой почтовый клиент подключится к моему почтовому серверу, который будет использовать DNS для поиска записи MX для threatsbook.com и подключения к этому сайту. DNS-сервер для threatsbook.com может влиять на то, куда будет подключаться мой почтовый сервер.

Спуфинг может произойти, когда ваш код прямо или косвенно вызывает метод listen(). В случае косвенного вызова, возможно, веб-сервер вызывает listen(), разбирает сообщения TLS и HTTP и передает что-то более «уточненное». Код по-прежнему должен идентифицировать вызывающую сторону. Веб-сервер может выполнять часть этой работы, и даже в этом случае вам вполне может потребоваться сопоставить таблицу учетных записей сервера с таблицей, используемой в ваших базах данных. Например, я могу войти в систему как adam@threatsbook.com и иметь customer_id 1234.

Компьютеры часто идентифицируют друг друга, используя сочетание криптографических сертификатов и идентификаторов, удобочитаемых для человека. Например, если darthvader@threatsbook.com отправляет почту anakin@threatmodelingbook.com, то почтовый сервер threatsbook должен найти домен threatmodelingbook и принять решение о доверии сертификату TLS, который предоставляет сайт. Почтовый сервер threatmodelingbook должен принимать решения о почте, поступающей от threatsbook, и решать, заслуживает ли этот сервер доверия. На многих этапах этого процесса есть криптографический ключ, подписанный так называемым сертификатом, и инструмент, который предоставляет политику, согласно которой этому сертификату следует доверять. Как правило, они относятся либо к корневому центру сертификации, подписавшему сертификат, либо к его персистентности. Персистентность означает, что ключ был ранее авторизован для использования в сочетании с именем хоста. SSH демонстрирует хорошую схему подсказок при представлении нового ключа, подчеркивая, изменился ли он по сравнению с тем, что было представлено ранее.

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

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

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

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

Путаница в том, какой именно файл представлен некоторым именем, может быть результатом человеческой неточности или подмены файла злоумышленником. И, в отличие от 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 был похищен джавами, ему удается избежать контроля со стороны «блокиратора», который они установили, и продолжить свою миссию по доставке сообщения Оби-Вану Кеноби. Возможно, он запустил виртуальную машину и позволил блокиратору перенастроить ее, а не свою основную систему? Или, может быть, я слишком много об этом думаю. (На эту двусмысленность впервые указал Джим Дэвис.)

Загрузка...