Разработчики Firefox закрыли возможность подглядывания через историю посещений

Существует достаточно простая и в тоже время серьёзная проблема с использованием ссылок и истории посещения во всех существующих веб браузерах. Представим простую ситуацию - вы регулярно посещаете набор сайтов, а затем попадаете на web-страницу злоумышленника, который хочет узнать куда вы заходили. Сделать это очень просто - атакующий помещает незаметно для вас огромный список интересующих его сайтов на свою страницу, а затем, используя атрибуты посещенного сайта (стандартная возможность начиная с первой версии HTML), он легко может вычислить на каких сайтах вы были раньше, потому что все эти ссылки, которые он у себя разместил, будут иметь состояние "посещён", т.е. например поменяют цвет. Пример подобной атаки можно найти на сайте debugtheweb.com.Так, например, используя стандартную функцию JavaScript getComputedStyle(), можно абсолютно незаметно для пользователя проверить сотни тысяч посещений за одну секунду.

Разработчики Mozilla Firefox решили устранить эту "уязвимость", которая, как очевидно, является неотъемлемой частью стандарта HTML. Какие варианты они предложили:

    * Атаки, связанные с изменением внешнего вида посещенной ссылки. Стандарт разрешает менять для посещенных ссылок огромное количество атрибутов: цвет фона и самой ссылки, начертание, границы, SVG черточки и цвет заполнения. Разработчики Mozilla будут ограничивать стили, применяемые к посещенным ссылкам.
    * Атаки, основанные на временных задержках. В принципе, атакующий может узнать факт посещения и по задержке с которой веб-браузер отобразит ссылку. Разработчики Mozilla меняют механизм рендеринга таким образом, чтобы стили применялись до самого факта рендеринга, и тогда будет невозможность отличить ссылки по времени их вывода на экран пользователя.
    * Конечное CSS-состояние ссылки может быть вычислено с помощью JavaScript - Firefox больше не будет различать вывод подсчитанного CSS для таких запросов.

Что это означает для конечных пользователей? Во-первых, может незначительно поменяться внешний вид отображения посещенных ссылок на некоторых веб сайтах. Те сайты, которые меняют цвет для посещенных ссылок, будут выглядеть несколько иначе. Тем не менее, данная защита не будет доступна в существующих версиях Firefox, поэтому вы вручную можете себя обезопасить поменяв состояние опции layout.css.visited_links_enabled в false на странице настроек (url: about:config) - но только в том случае, если у вас установлен Firefox 3.5 и выше.

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

okkamas_knife
Спорим я на одном только CSS смогу отследить какие сайты ты посещал если указанная опция не установлена?
Как минимум на моём сервере данные о тебе окажутся, хоть твой браузер и не выполнит ни одного скрипта.

Lain_13
давай. мне уже интересно:cool:
тока в личку пиши чтоб я не прозевал сообщение.

okkamas_knife
Не, прямо тут напишу. Идея заключается в том, что страница генерируется скриптом, который берёт из базы сочетания адрес_сайта / ключ и вставляет ключ в атрибут class или id у ссылки. Параллельно с этим тебе выгружается CSS-файл, в котором для каждого class или id в состоянии :visited назначается картинка в виде a-blahblahblah.png (.blahblahblah:visited {background-image:url('a-blahblahblah.png');}). На запрос любой картинки с именем на "a-"  у меня висит другой скрипт, который выплёвывает пустую прозрачную картинку 1х1 пиксел размером, а по ключу blahblahblah скрипт узнаёт на каком сайте ты был. Сохраняем списки IP/посещённые сайты, например, и пользуемся.
Вот так совершенно примитивным образом стандартными средствами CSS я узнал был ли ты хоть на одном сайте, который меня интересует.

Вот proof of concept. Скачай, переименуй, распакуй в папку локального http-сервера (апачу скорми, например) и запусти. У первой ссылки mozilla-russia появится фон в виде мигающих шестиугольников, а у ссылки blahblahblah - нет. Если посмотришь в адблоке, то запрос происходит только к файлу "a-abc.png", который назначен первой ссылке, а файл "a-def.png" для второй ссылки не загружается.

p.s. apng-шестиугольник нарисовал я, можно безвозмездно пользоваться.
p.p.s. Естественно этот метод не работает если установить указанный выше параметр - он напрочь вырубает разметку посещённых страниц. Теоретически в будущем картинку к css-фильтру с :visited в пути установить будет нельзя.

Lain_13
но так можно узнать только адреса конкретных страничек
а если ходить так http://anonymouse.org/cgi-bin/anon-www.cgi/http://forum.mozilla-russia.org/viewtopic.php?pid=419277#p419277
то всё это вытягивание сойдёт на нет потому что придётся делать такой огромный список(прикинь этож надо для каждой ссылки на форуме делать) что он мало того что грузится будет очуметь сколько плюс сервак задолбается его обрабатывать
а если учесть что многие сайты добавляют sessionid в адрес то вообще фиг засечёшь.
вобщем это только proof of concept. а практически его  примененить очень сложно

okkamas_knife
Так ведь и старый метод действует точно так же оперируя точными ссылками, просто все проверки выполняет локально прямо на открытой странице. ж) Полотнища ссылок можно подгружать во фреймах, например, что б не особо тормозить загрузку основной страницы. Метод на JS так же не отслеживает перехода напрямую на какую-то страницу или через анонимайзер. Но если ты ходил на Хабр без анонимайзера и был на заглавной странице, то я об этом узнаю ...и уж определённо я узнаю, что ты пользуешься анонимайзером, если добавлю ссылку на него, а ты не удалишь его главную страницу у себя в истории. ^_^

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

Lain_13
ну у меня хистори вообще чистится при закрытии:D
и кстати веришь ли - я на заглавной хабра не был ни разу!;) только по ссылкам откуда либо заглядываю туда.
таким макаром разве что вконтактников палить;)
ну а анонимайзер я привёл в качестве примера. можно например для сёрфа и гугль транслейт использовать
или просто в поисковике смотреть сохранённые копии.
да а из поисковика кстати на твою страничку хитрую сложно будет попасть потому что робот посчитает её поисковым спамом и выкинет из результатов - так что списочек должен быть мааленький.
вобщем слишком много если должно сложиться чтоб утащить часть хистори.

okkamas_knife
Ну так ведь и оригинальный метод с JS гибкостью не блещет, как я уже говорил. Опять же, если меня интересует десять-сто сайтов и мне плевать на анонимайзеры, то страничка получится нормального размера. Если мою страничку будут вставлять во фрейме как рекламу (а почему бы не выводить рекламу на основании собранных данных?), то свою аудиторию мой сайт точно получит (точнее многие увидят рекламу, а у меня будет собираться статистика). Меня могут интересовать не конкретно твои предпочтения, а предпочтения всех пользователей каждого сайта, где мой во фрейме поставят. В таком случае его будут вызывать указывая некий ключ в пути к сорцу фрейма, а у меня этот ключ будет передаваться в имена картинок. Соответственно статистика будет так вот собираться. Кстати, при работе во фрейме я вообще могу держать базу в десятки тысяч сайтов, а во фрейм каждый раз кидать от 10 до 50 ссылок. При достаточной посещаемости основного сайта и по прошествии некоторого времени у меня будет более чем достаточная статистика по пользователям данного сайта.
Если ты историю принципиально не хранишь, то тебе и на JS-реализацию должно быть почти наплевать - больше чем за текущую сессию всё равно ни кто и ни чего так не узнает. Но далеко не все ведь такие умные...

Что-то нигде явно не сказано, что определённые CSS-свойства будут запрещены не только для :visited, но и для :not(:visited) :).

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

luitzen
А ещё можно вывести ссылки одиночными символами-кубиками, вычислить размер одного кубика на канвасе и быстро просмотреть цвет точек по сетке. Если он будет визуально меняться, то даже если он не будет доступен из скрипта, то таким вот образом он доступен будет всегда.

01-04-2010 12:17:56
okkamas_knife
Помнится была такая локальная прокся. Пишешь правила замены регулярками и она на лету модифицирует страницы в соответствии с этими правилами.

Lain_13 пишет

А ещё можно вывести ссылки одиночными символами-кубиками, вычислить размер одного кубика на канвасе и быстро просмотреть цвет точек по сетке. Если он будет визуально меняться, то даже если он не будет доступен из скрипта, то таким вот образом он доступен будет всегда.

Lain_13, я не очень вас понял, но вот тут Wladimir Palant опасается canvas, а здесь David Baron говорит ему, что бояться нечего. Впрочем, там я тоже не очень понял.

luitzen
Они не дадут работать даже со своим собственным канвасом? О_о

01-04-2010 12:37:24
А, понял.

pi.v.vitaly
О! надо попробовать.:D

Нашёл одну занимательную идею, которая теоретически позволит обмануть даже новую схему работы с посещёнными ссылками.
Я так думаю размер шрифта для посещённых ссылок менять не запретят, а это значит, что этим можно воспользоваться.
Идея состоит в том, что ссылки по одной помещаются в, например, DIV, в котором можно прокручивать содержимое. Для не посещённых ссылок устанавливаем размер шрифта в 1px, а для посещённых - максимальный. Ширину подбираем по самой длинной строке из базы ссылок. Таким образом если ссылка была посещена, то содержимое можно будет скороллить и если программно дёрнуть скролл и посмотреть его позицию, то позиция изменится.
Так же наверное можно размещать ссылку в ячейке таблицы и смотреть на изменение размеров ячейки.

Запретят.

luitzen
А где можно посмотреть полный список чего они там ещё запретят?

02-04-2010 18:44:03

Visited links can only be different in color

Ок, сам нашёл.