Уязвимость JavaScript до сих пор существует в Internet Explorer 7

Недавно польский исследователь безопасности Михаил Залевский (Michal Zalewski) обнаружил очень интересный маленький трюк с JavaScript, который заставляет пользователя наблюдать один и тот же сайт. Его открытие заключается в использовании простого JavaScript-события, который демонстрирует любой URL-адрес, в то время как в браузере загружена и работает предыдущая веб-страница.

Принцип работы уязвимости заключается в выполнении JavaScript-кода после события (onunload), которое срабатывает при покидании пользователем сайта – так, как и должно работать по задумке создателей JavaScript. Но сразу после этого начинает работать уязвимость, которая позволяет, не изменяя исходную веб-страницу, вводить любой URL-адрес в строке "Адрес", что дает злоумышленнику потенциальную возможность обмануть пользователя и заставить его поверить в то, что он находиться на нужном ему веб-сайте.

Конечно, сам по себе код не может исполняться и должен быть встроен в веб-страницу, которая так или иначе должна быть открыта, чтобы дать возможность уязвимости заработать. Что представляет собой достаточно хитрую задачу, если только окно HTML не запускается клиентом электронной почты, который поддерживает исполнение JavaScript-кода.
Сам Залевский был приглашен провести несколько опытов с Internet Explorer 7 версии на нескольких машинах, включая две системы на XP и одно виртуальное окружение Virtual PC на Vista. Все тесты, когда пользователь выходил из веб-страницы через ссылки в меню Links и Favorites, были провалены. Хотя пользователь и оставался на прежней странице, адресная строка все же показывала адрес тестовой страницы.

Совсем иная ситуация складывается, когда пользователь пытается вручную ввести URL в адресную строку. В таком случае пользователь не покидает страницы, однако адресная строка демонстрирует тот URL, который ввел пользователь. Если далее попытаться перейти по ссылке в Links или Favorites, то страница снова не сменится, а адресная строка продолжит показывать URL, который был ранее напечатан пользователем. Таким образом, IE7 позволяет JavaScript исполнять произвольный код на событии (onunload), но при этом не изменяет содержимое адресной строки - там продолжает изображаться то, что ранее было введено пользователем.

При этом, ничто не мешает злоумышленнику переделать код обрабатываемого события таким образом, чтобы пользователь не оставался на старой странице, а перемещался на сайт-фальшивку, которая в IE7 отобразится как искомый пользователем сайт. С другой стороны злоумышленнику необходимо убедить пользователя ввести адрес сайта вручную. Видимо поэтому фирмы по безопасности как Secunia оценили данную уязвимость как "слабо критическая".

Кроме IE7, тест также был проведен на Firefox 2.0.0.2 (последняя доступная версия браузера на момент теста) на системах с Windows XP и Vista. Результаты хоть и получились немного странными, однако в обоих случаях браузер явно показал уязвимость. Когда была запущена тестовая страница с пустым JavaScript-кодом, которая на IE7 не выпускала пользователя с веб-страницы, отображая исходную страницу, Firefox очищал страницу и оставлял ее пустой. Данная реакция браузера не зависела от того, вводил ли он URL вручную или открывал ссылку в меню Links или Bookmarks. Иногда Firefox оставался на пустой странице, иногда нет. Почему именно это происходило, пока еще не выяснили.

Поэтому, хотя уязвимости и не удается изменять адресную строку Firefox, в каком-то смысле данная хитрость все-таки влияет на браузер, пусть и в такой малой мере. На днях Mozilla же заявила, что данная уязвимость была устранена в версии 2.0.0.2. Когда же тестеры просмотрели статьи и описания проблем у специалистов по безопасности на наличие подобной проблемы с событием (onunload), то стало известно, что о подобной уязвимости уже было известно в Firefox с июля 2004 года, в Opera с мая 2004 и в Internet Explorer с июля 2004.

В дальнейших тестах, когда в реакцию на событие был добавлен или определенным образом изменен код JavaScript (например открывание нового окна), Firefox прекращал исполнение всего кода и возвращался в нормальное состояние. В подобных случаях проблему в Mozilla можно считать исправленной. Стоит отметить, что в самом JavaScript-коде не присутствовало ничего, что могло бы оставить адресную строку неизменной или очистить страницу, как в случае с Firefox, так и в случае с Internet Explorer.

Также следует учесть, что даже если код выполнялся на IE7, он продолжал подчиняться правилам, установленным политикой безопасности для JavaScript. Поэтому если JavaScript до этого не имел доступ к файловой системе в обычном режиме, ничего в данной уязвимости не могло дать таких прав автоматически. Также многие брандмауэры от сторонних разработчиков в процессе своей деятельности запрещают JavaScript манипулировать cookies, автоматически изменяя свойство .cookie на .ignore, как это делает ZoneAlarm.

Пока еще не проведены дополнительные исследования, которые бы смогли доказать или опровергнуть участие сторонних блокеров pop-up-окон в обострении проблемы с Firefox, когда появление пустой страницы не было принято как 100% решение проблемы. Поэтому было бы ошибочным сказать, что данная уязвимость дает злоумышленнику возможность получить удаленный доступ к информации пользователя, как об этом было заявлено во множестве блогов по безопасности, однако данный трюк может быть успешно использован, чтобы эффективно замаскировать выполнение JavaScript-кода от пользователя, которое в другом случае было бы очевидным.

BetaNews

©1997-2024 Компьютерная газета