Использование «жестких» и символических ссылок

Традиционное определение файла: «Файл - это именованная область памяти» для ОС UNIX не совсем верно. Как уже было рассмотрено ранее, имен у одного и того же файла может быть довольно много - 65536. А вот номер -inode, или индексный дескриптор, у файла один. Символьные имена являются просто указателями на этот уникальный номер, позволяющими пользователю или его процессу найти файл с известным именем в каталоге и открыть его для чтения, записи или исполнения. Множество символьных указателей на один и тот же индексный дескриптор называются «жесткими» ссылками. Жесткие ссылки следует отличать от копий файлов. При создании копии файла создается другой файл, занимающий иные блоки на дисковом пространстве, и имеющий свой уникальный индексный дескриптор. Файл-копия имеет свои временные отметки, в частности, время создания. Одинаковым для файла-оригинала и его копии является только содержимое блоков данных.

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

У большинства символических ссылок нет блоков данных. Если адресуемое имя меньше 48 символов, оно записывается в номера непосредственно адресуемых блоков: 12 блоков х 4 байта. При исследовании inode символической ссылки следует обратить внимание на то, что номера адресуемых блоков данных выглядят неестественно и явно выходят из допустимых диапазонов номеров. Но если имя файла длиннее 48 символов, для него приходится выделять один блок данных.

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

Вторая особенность связана с механизмом создания новых файлов. Если система создает в каком-либо месте новый файл, но файл с таким именем уже существует, то его блоки данных освобождаются, а индексный дескриптор с изменением временных меток передается новому файлу. Еще раз следует напомнить, что символическая ссылка, указывающая на полное имя файла длиной до 48 символов, в блоках данных не нуждается, и содержит ссылку на файл в самом inode. Теперь допустим, что злоумышленник узнал или угадал имя временного файла в каталоге /tmp и предварительно успел записать в этот каталог символическую ссылку с таким же именем. Тогда программа будет записывать данные уже не в свой временный файл, а через подставленную символическую ссылку в тот файл, который будет в ней указан. Угроз конфиденциальности здесь нет - если бы пользователю надо было прочесть конфиденциальную информацию из временного файла, он скопировал бы его в свой каталог и прочитал. Здесь более явной является угроза целостности. Например, программа, запущенная с правами администратора, через символическую ссылку в каталоге /tmp перенаправит запись в любой указанный файл, например, в файл паролей или иной файл конфигурации. В результате весьма ответственная информация будет перезаписана.

Для противодействия подобным атакам временные файлы в обоих семействах универсальных операционных систем Windows и UNIX создаются с псевдослучайными именами, и функция создания временного файла возлагается не на приложение, а на операционную систему. В Linux имеются системные функции mkstemp и tmpfile, вызов которых решает вышеперечисленные проблемы. Так, функция mkstemp генерирует шестисимвольное имя файла, подбирая каждый символ случайным образом. Угадать имя файла весьма трудно, но появляется иная проблема. Временные файлы автоматически не удаляются и, спустя некоторое время уже практически невозможно разобраться, какой программой они были созданы, содержат ли конфиденциальную информацию и подлежат ли удалению.