Неубиваемые Cookie

Cookies — это небольшая порция текстовой информации, которую сервер передает браузеру. Другими словами это технология, позволяющая веб-сайту «запомнить» пользователя, сохранить его настройки и не просить его каждый раз вводить логин и пароль. Может показаться, что удалив кукисы в браузере, сайт вас не узнает, но это не так.

Можно сколько хотите думать о своей анонимности, пользоваться прокси и VPN, подделывать заголовки HTTP-запросов, выдающие используемую систему, версию браузера, часовой пояс и любую другую информацию, но веб-сайт все равно сможет выяснить факт вашего пребывания. В некоторых случаях это не страшно, за исключением ситуации, когда на какой-то сервис нужно зайти под другим ником или просто сохранить анонимность. Антифрод-система некой финансовой организации сразу определит, что с одного компьютера в их систему зашли совершенно разные люди. Да и кому приятно, когда кто-то в Сети может легко отследить твои перемещения?

Как работают куки?

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

К примеру, чтобы получить доступ к странице www.example.org/index.html, браузер отправляет на сервер www.example.org такой запрос:

GET /index.html HTTP/1.1
Host: www.example.org

Сервер отвечает, отправляя запрашиваемую страницу вместе с текстом, содержащим HTTP-ответ.
Там может присутствовать указание браузеру сохранить куки:

HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: name=value

Если присутствует строка Set-cookie, браузер запоминает строку name=value (имя = значение) и с каждым последующим запросом отправляет ее обратно серверу:

GET /spec.html HTTP/1.1
Host: www.example.org
Cookie: name=value
Accept: */*

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

Flash-куки

Дело в том, что кроме обычных HTTP хранилищ, к которым все уже привыкли, сейчас начинают использоваться альтернативные хранилища, где у браузера есть возможность записать данные на стороне клиента. Прежде всего нужно сказать, что это хранилище всем известного Flash. Данные хранятся в неких LSO (Local Shared Objects), которые похожи на cookies по формату файлах и сохраняются локально на компьютере пользователя. Подход заключается в том, что на компьютере пользователя сохраняется небольшое количество текстовых данных, но у этого есть свои преимущества:

— Flash-кукисы являются общими для всех браузеров на компьютере (в отличие от классической cookie, которая привязана к браузеру). К конкретному браузеру не привязываются Настройки, информация о сессии или какой-то идентификатор для отслеживания пользователя, они становятся общими для всех.
— С помощью Flash cookie можно сохранять больший объем данных (в среднем, 100 Кб), что позволяет увеличить количество настроек пользователя, доступных для сохранения.

LSO на практике становится простой и вполне доступной технологией для трекинга пользователя.

Кукисы везде с evercookie

Об LSO уже слышали продвинутые пользователи и приличные разработчики, но о существовании других техник хранения данных многие даже не представляют. Возьмём например новые хранилища, появившиеся в HTML5 (Session Storage, Local Storage, Global Storage, Database Storage via SQLite). Этим вопросом занимался польский специалист по безопасности Samy Kamkar. В результате его работы появилась специальная JavaScript-библиотека evercookie, созданая для того, чтобы делать в браузере самые живучие кукисы. Зачем? Да для того, чтобы безошибочно идентифицировать посетителя страницы, если он снова зайдёт. Такие живучие кукисы часто называют Tracking cookies, которые некоторыми антивирусами даже опеделяются как угроза приватности. Evercookie может нарушить все планы остаться анонимным.

Дело в том, что evercookie сразу использует все хранилища доступные для браузера: LSO, обычные HTTP-кукисы, контейнеры HTML5. Плюс ко всему, есть несколько хитрых приемов, благодаря которым можно оставить на компьютере нужную метку. Например, использование history браузера, генерация особых PNG-изображений, хранение данных с помощью тега ETag, контейнер userData в Internet Explorer. Вариантов куча.

На сайте разработчика можно проверить эффективность этой работы — http://samy.pl/evercookie. Нажав кнопку «Click to create an evercookie», в браузере создадутся кукисы со случайным числом. Попробуйте везде где возможно стереть кукисы. Наверно ты подумал «Где еще можно удалить кукисы, кроме как в настройках браузера?». Перезагрузи страницу, можно даже сново открыть браузер. Теперь можно смело жать кнопку «Click to rediscover cookies». Что мы видим? Сайту наши действия не помешали где-то взять данные, поскольку в полях страницы отобразилось число, которое было сохранено в кукисах. Мы же их потерли? Как это могло выйти? Разберёмся с некоторыми техниками.

Кукисы в PNG

В Evercookie используется очень интересный приём — подход хранения данных в кэшированных PNG-изображениях. При установке куки evercookie обращается к скрипту evercookie_png.php со специальной HTTP «плюшкой», которая отличается от той, что используется для хранения стандартной информации о сессии. Этот вид кукисов считывается PHP-сценарием, создающим PNG-изображение, где значения RGB (цветов) выставляются соответственно информации о сессии. В итоге PNG-файл отсылается браузеру клиента с меткой: «файл необходимо кэшировать 20 лет».

Evercookie, получив эти данные, удаляет ранее созданные специальные HTTP-кукисы, потом выполняет тот же запрос к тому же PHP-сценарию, без предоставления инфы о пользователе. Тот не обнаруживает интересующих его данных нет, и не может сгенерировать PNG. Браузеру вместо этого возвращается ложный HTTP-ответ «304 Not Modified», в результате чего он вытаскивает файл из локального кэша. Изображение вставляется из кэша на страницу тегом HTML5 Canvas. После этого evercookie считывает каждый пиксель содержимого Canvas, получая RGB-значения и тем самым, восстанавливая данные изначальных кукисов, сохранённых в изображении. И вот пожалуйста, все работает!
Приём с Web History

Есть прием, который использует напрямую историю браузера. Когда браузер устанавливает плюшку, evercookie с помощью алгоритма Base64 кодирует данные, которые нужно сохранить. Допустим, что на месте этих данных стоит строка, полученная «bcde» после преобразований в Base64. Библиотека в фоновом режиме последовательно обращается к таким URL:

google.com/evercookie/cache/b
google.com/evercookie/cache/bc
google.com/evercookie/cache/bcd
google.com/evercookie/cache/bcde
google.com/evercookie/cache/bcde-

В результате, эти URL сохраняются в history. Дальше в ход идет особый прием — CSS History Knocker, который используя JS-скрипта и CSS позволяет проверить, заходил ли пользователь на указанный ресурс или нет. Чтобы проверить плюшки, evercookie проверяет все возможные символы Base64 на google.com/evercookie/cache, начиная с символа «a» и далее, но только с шагом в один символ. Когда скрипт видит URL-адрес, к которому было сделано обращение, он переходит к следующему символу. На практике этот подбор совершается очень быстро, потому что к серверу не выполняются никакие запросы. Поиск по history происходит локально за максимально короткое время. Библиотека поймёт, что дошла жо конца строки, когда URL будет заканчиваться символом «-«. Декодируем Base64 и получаем наши данные.

А что произойдёт, если пользователь удалит свои кукисы? Важная особенность библиотеки evercookie в том, что пользователю будет не так то легко удалить кукисы, оставленные в разных местах — на данный момент их 10. Если хоть в одном месте останутся эти куки, они автоматически восстановятся и во всех других местах. Допустим, если пользователь удалит свои стандартные кукисы и вдобавок очистит данные LSO и подчистит HTML5-хранилища, что уже врядли, останутся все равно куки, созданные с помощью кэшированного PNG и web history. Во время следующего посещения сайта с evercookie библиотека сможет найти затерявшуюся плюшку и к тому же восстановить их во всех остальных местах, которые поддерживает браузер клиента. Особый интерес представляет момент передачи «плюшек» между браузерами. Если пользователь получает кукисы в одном браузере, то высока вероятность, что они воспроизведутся и в остальных браузерах. Единственное условие, необходимое для этого, это сохранение данных в Local Shared Object куке.

Как это использовать?

Библиотека Evercookie абсолютно открыта, поэтому ею можно свободно пользоваться и подгонять под свои потребности. К серверу нет никаких особых требований. Нужен только доступ к JS-сценарию, в котором есть код evercookie. Для использования Flash-кукисов (Local Shared Object), в папке со скриптом должен находиться файл evercookie.swf, а для работы техник, основанных на PNG-кэшировании и использовании хранилища ETag, потребуется доступ к PHP-сценариям evercookie_png.php и evercookie_etag.php. Работать с evercookie можно на любой страничке сайта, подключив такой скрипт:




Библиотека evercookie открыта для каждого. Это пугает, тем более если совершенно не знаешь как защититься.

Почистить куки в браузере и Flash’е — не проблема. Нужно удалить данные везде, где свои следы оставил evercookie! Ведь если оставишь куки в одном месте,скрипт сразу автоматически восстановит значение во всех остальных хранилищах. Эта библиотека является по сути хорошей проверкой режима приватности, который есть практически у всех браузеров. Из Google Chrome, Opera, Internet Explorer и Safari только последний в режиме «Private Browsing» полностью блокировал все методы, которые использовал evercookie. Это значит, что после закрытия и открытия браузера скрипт не смог восстановить оставленное им значение. Над этим стоит задуматься, поскольку в ближайшее время разработчик evercookie собирался добавить в библиотеку еще пару техник хранения данных, в том числе с помощью технологии Isolated Storage в Silverlight и Java-апплета.

С сайта byru.biz