Проблема запутанного заместителя
Проблема запутанного заместителя — это уязвимость в области информационной безопасности, когда одна компьютерная программа (заместитель), обладающая более широкими полномочиями, по ошибке выполняет действия в интересах другой программы или пользователя с меньшими правами, тем самым неправильно используя свои полномочия в системе. Этот тип атаки представляет собой частный случай повышения привилегий[1]. Проблема запутанного заместителя часто приводится в качестве аргумента в пользу безопасности на основе полномочий.
Системы безопасности на основе полномочий защищают от проблемы запутанного заместителя, тогда как системы, основанные на списках управления доступом, не защищают[2].
Пример
В классическом примере, описывающем проблему запутанного заместителя[3], на коммерческом сервисе с разделением времени был доступен компилятор. Пользователь мог запустить компилятор и, при необходимости, указать имя файла для записи отладочных данных; компилятор записывал данные при наличии у пользователя соответствующих прав.
Компилятор также собирал статистику по использованию языковых конструкций. Эта статистика сохранялась в файле «(SYSX)STAT» в директории SYSX. Для этого компилятору предоставили права на запись в директорию SYSX.
Однако в SYSX лежали и другие файлы, в частности — биллинговая информация системы в файле «(SYSX)BILL». Пользователь запустил компилятор и в качестве выходного отладочного файла указал «(SYSX)BILL».
В результате возникла проблема запутанного заместителя. Компилятор обратился к операционной системе с запросом открыть файл «(SYSX)BILL». Несмотря на то, что у пользователя не было доступа к этому файлу, у компилятора такие права были, поэтому запрос был выполнен успешно. Компилятор записал отладочные данные, перезаписав файл, и информация о биллинге была уничтожена.
В этом примере программой-заместителем выступает компилятор, так как он действует по запросу пользователя. Компилятор оказался «запутан», потому что был обманом вынужден перезаписать файл учёта системы.
При каждом обращении программы к файлу операционная система должна знать два параметра: к какому файлу обращается программа и есть ли у неё право доступа к нему. В приведённом примере имя файла — «(SYSX)BILL» — передаётся от пользователя программе, но компилятор не знает, имел ли сам пользователь право на запись в файл. Операционная система использует права самого компилятора, а не пользователя. Когда имя файла передаётся от пользователя программе, соответствующие права явно не передаются; система увеличивает права по умолчанию и автоматически.
Для атаки не принципиально, что файл биллинга указывается строковым именем. Важно, что:
- идентификатор файла не содержит всех полномочий, необходимых для доступа;
- используются права самой программы, что происходит неявно.
Другие примеры
Межсайтовая подделка запроса (CSRF) — пример атаки через запутанного заместителя, когда веб-браузер используется для выполнения чувствительных действий в отношении веб-приложения. Часто такая атака возможна, если веб-приложение аутентифицирует все запросы, идущие от браузера, используя cookie. При помощи JavaScript злоумышленник может принудить браузер отправлять аутентифицированные HTTP-запросы.
Компьютерный червь Samy использовал межсайтовый скриптинг (XSS) для превращения аутентифицированной сессии MySpace в браузере в запутанного заместителя. Используя XSS, червь заставлял браузер размещать собственную копию в качестве сообщения, которое затем просматривали друзья заражённого пользователя.
Кликджекинг — атака, при которой уже сам пользователь становится запутанным заместителем. Пользователь считает, что просто просматривает сайт (контролируемый злоумышленником), но на самом деле его обманом заставляют совершить чувствительное действие на другом сайте[4].
Атака FTP bounce позволяет злоумышленнику косвенно подключиться к портам TCP, которые недоступны напрямую, используя внешний FTP-сервер как запутанного заместителя.
Ещё один пример касается персональных брандмауэров, которые позволяют ограничивать доступ к Интернету только для определённых приложений. Некоторые приложения обходят это ограничение, запуская браузер с передачей ему инструкции открыть конкретный URL. У браузера есть полномочия на установление сетевого соединения, хотя у самого приложения их нет. Некоторые брандмауэры пытаются решать эту проблему, предупреждая пользователя, если одна программа запускает другую, а вторая выходит в сеть. Однако пользователь часто не располагает сведениями для принятия решения — ложные срабатывания обычны, и даже опытные пользователи могут привыкнуть автоматически нажимать «OK»[5].
Важно отметить, что не каждая программа, неверно использующая полномочия, является запутанным заместителем. В некоторых случаях это результат обычной программной ошибки. Проблема запутанного заместителя проявляется, когда ссылка на объект (например, на файл) передаётся от одной программы к другой, а права доступа меняются неявно, без явных действий со стороны участников атаки. Этот тип атаки коварен, потому что ни одна из сторон не делала чего-либо явно для изменения полномочий.
Решения
В некоторых системах можно попросить операционную систему открыть файл, используя права другого клиента. Такой подход имеет ряд недостатков:
- он требует явного внимания к вопросам безопасности со стороны сервера; неопытный или небрежный сервер может пропустить этот шаг;
- становится сложнее определить необходимые права, если сервер сам является клиентом другого сервиса и передаёт права дальше;
- клиент должен доверять серверу, что тот не будет злоупотреблять предоставленными полномочиями. Заметим, что пересечение прав сервера и клиента не устраняет проблему, так как серверу, возможно, потребуется очень широкий набор полномочий для обслуживания разных клиентов.
Самый простой способ решения проблемы запутанного заместителя — связывать воедино идентификатор объекта (например, файла) и полномочие на доступ к нему. Такой подход реализован в модели полномочий.
Если использовать модель полномочий в приведённом выше примере с компилятором, клиент передаёт серверу не имя файла, а полномочие, например, дескриптор файла, который предоставляет право на доступ к файлу. Если у пользователя нет полномочия на файл биллинга, он не сможет передать его для записи. В случае с межсайтовой подделкой запроса URL «с другого сайта» может содержать собственные полномочия, не зависящие от полномочий клиента в браузере.