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