Дискриминация котов: веб-трекинг через невидимые картинки

    image

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

    Почему дискриминация


    Что понимать под дискриминацией пользователей в интернете? Это когда цены на товары в онлайн магазинах меняются в зависимости от того, какие устройства используются для просмотра каталога. А нарушение приватности начинается тогда, когда сайты показывают вам рекламу средств от бессонницы, потому что вы засиживаетесь допоздна, так как это указывает на то, что данные о времени вашего пребывания в интернете передаются сторонним компаниям.

    Что такое веб маяки


    Веб маяк (в английском варианте «web beacon», или «1x1 pixel image») — это крошечная или прозрачная картинка, которая встраивается в страницу и используется для отслеживания действий пользователей.

    image

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

    Сбор данных и статистика


    В качестве начальных данных у меня было несколько JSON файлов со ссылками на картинки (как статически, так и динамически подгружаемых) с топ 800 доменов (по версии ALEXA). Оставалось разработать скрипт, который парсит эти файлы, проходит по ссылкам, закачивает картинки и сохраняет информацию о них в базе данных SQLite.

    image

    Эти JSON файлы содержали все ссылки на картинки, как 1st party (картинки находятся на том же сайте, где размещена ссылка на них) так и 3rd party (картинки хранятся на сторонних сайтах). И если в первом случае, маяки могут использоваться вполне в безобидных целях (для веб аналитики в пределах сайта), то во втором случае задействовано несколько сторон, и это уже межсайтовый трекинг. Так как интересовал именно последний случай, я использовала библиотеку tld, чтобы извлекать домен верхнего уровня.

    Скрипт работает так, как если бы все cookies очищались перед каждым запросом, поэтому в первоначальных запросах к серверам поле Cookies пустое. Если в ответе от сервера есть заполненное поле set-cookie, это значение заносится в базу данных.

    Есть два способа вычисления маяка: проверка размера и проверка поля в HTTP заголовке content size. Но не все ответы на запросы содержат поля content length и content type, так как они опциональные и даже могут содержать неправильные данные. Также встречаются маяки, которые при размере 1x1, возвращаются в пакете с content length > 100, так как картинка PNG формата. Поэтому при построении графиков я не учитывала значение content length.

    Что делать, если в ответе нет картинки? Бывает, что сервер возвращает статус 204. Это означает, что контента нет, но, тем не менее, прохождение по ссылке зафиксировано. Поэтому если статус 204 и content type в HTTP заголовке содержит «image/», скрипт предполагает, что это веб маяк и помещает в базу значения width = 0 и height = 0. Таких маяков встретилось 37 294 (1.53%).

    Всего было проверено 8 586 314 ссылок на картинки, в базе содержатся данные о 5 873 372 3rd party картинках, из них 2 431 277 маяка (41% от количества сторонних картинок это веб маяки!).

    И еще немного статистики


    В таблице image_domains хранится информация о провайдерах картинок (то есть это не те 800 топ сайтов со ссылками на картинки, а сервера, непосредственно хранящие эти картинки).

    Количество доменов: 800
    Количество доменов, где встретился хотя бы один маяк: 760
    Количество страниц: 124 214
    Количество страниц, где встретился хотя бы один маяк: 111 442
    Количество провайдеров картинок: 4 348
    Количество провайдеров картинок-маяков: 1 325

    И то, что есть 40 доменов, на которых не встретился ни один маяк, не говорит о том, что они их не используют. Возможно, они используют маяки нестандартного размера (1x2, 3x1), которые тоже встречались при выборочной проверке ссылок.

    Топ игроки на рынке веб трекинга


    Итак, в базе 2 431 277 маяков. Интересно узнать, маяки каких из 1 325 провайдеров чаще всего встречались на страницах топ 800 доменов.

    def plot1(dbname, condition):
        #providers of beacons - count of beacons 
        logname = open(u'plot1'+dbname+'.csv', 'w')
        db = SqlConnector(dbname)
        output = db.execute("SELECT image_domains.domain, count(images.id) \
                    as imgcount FROM images INNER JOIN image_domains ON \
                    image_domains.id = images.id_image_domains WHERE " + condition +
                    " group by image_domains.domain order by imgcount DESC;")
        for item in output:
            logname.write("{0};{1}\n".format(item[0], item[1]));
        logname.close() 

    Здесь condition это «width <= 1 and height <= 1».

    Стоит заметить, что, так как одни и те же найденные маяки могут встречаться на разных страницах, количество маяков не равно количеству уникальных маяков, то есть в таблице images могут быть дубликаты (поле url не уникальное).

    По оси x — провайдеры маяков, по оси y — количество маяков.

    image

    Теперь посмотрим на количество страниц среди топ 800 доменов, которые отслеживаются провайдерами маяков. То есть, на каждой из этих страниц встречается хотя бы один маяк.

    SELECT image_domains.domain, count(distinct images.id_pages) 
                    as pagescount FROM images INNER JOIN image_domains ON 
                    image_domains.id = images.id_image_domains WHERE width<=1 and height<=1
                    group by image_domains.domain order by pagescount DESC;
    

    По оси x — провайдеры маяков, по оси y — количество страниц.

    image

    А ниже вы увидите самый интересный график, который показывает как много уникальных доменов (те самые топ 800) отслеживаются провайдерами маяков, то есть у каждого такого домена есть хотя бы одна страница с хотя бы одним маяком.

    SELECT image_domains.domain, count(distinct pages.id_domains) 
                    as domainscount FROM images INNER JOIN image_domains ON 
                    image_domains.id = images.id_image_domains INNER JOIN pages ON 
                    images.id_pages = pages.id WHERE width<=1 and height<=1
                    group by image_domains.domain order by domainscount DESC;

    По оси x — провайдеры маяков, по оси y — количество доменов.

    image

    На последнем графике видно, что в основном провайдеры относятся к категориям «веб аналитика» и «реклама». Но интересно, что встречаются маяки от поискового движка Google и социальных сетей Facebook и Twitter. Эти провайдеры наиболее интересны потому что если пользователь авторизован, такой трекинг не является анонимным.

    Невидимые трекинг картинки на примере Facebook и Google


    Facebook pixel


    Facebook пиксели используются для перекрестной аналитики; каждый пользователь Facebook может бесплатно создать свой маяк в Adverts Manager. И в принципе понятно, почему это бесплатно ведь Facebook имеет свою выгоду: он получает данные о посещениях пользователей различных сайтов и может использовать их для таргетированной рекламы.

    Всего в базе данных было обнаружено 751 уникальных пикселей Facebook, которые встретились на 59 023 страницах в Интернете.

    Следующий эксперимент покажет, как это работает. Можно создать тестовую html страницу с каким-нибудь Facebook pixel или найти сайт, где он есть. Затем нужно зайти в настройки браузера и удалить все сохраненные cookies перед началом. Также нужно, чтобы в настройках браузера было разрешено сохранение и отправка сторонних cookies.

    Если пользователь не авторизован в Facebook, всё, что отправляется в заголовке Send-Cookie к Facebook pixel это поле «fr» (видимо, локация пользователя).

    image

    В этом случае собирается анонимная статистика, не нарушающая приватность пользователя. Но, что если пользователь авторизован в Facebook? В этом случае отправляются значения, идентифицирующие пользователя.

    image

    Получается, что Facebook знает, какие сторонние сайты посещают пользователи, хотя, конечно, мы с этим соглашаемся (см. политику cookies на Facebook).

    Google beacon


    Google также умеет отслеживать пользователей, авторизованных в их сервисах. На скриншотах можно увидеть серфинг на одном из крупных дискаунтеров, где мне встретился маяк от Google. После авторизации в Gmail серфинг прекратил быть анонимным, так как стали отправляться пользовательские идентификаторы “SID”, “HSID”, “SSID”, “APISID”, “SAPISID”.

    До авторизации в Gmail:

    image

    После авторизации в Gmail:

    image

    Как защититься


    Нужно ли защищаться каждый решает для себя сам, лично мне не хочется, чтобы информацию о посещённых мною сайтах продавали третьим лицам без моего ведома (см. cookie syncing, cookie matching). Рассмотрим, существуют ли какие-то способы защиты.

    Каждый раз очищать cookies


    При каждой новой сессии можно очищать cookies, получая новые идентификаторы от трекеров. Но, как показано в прошлом разделе, это бесполезно, если на соседней вкладке вы авторизованы, например, в Facebook. К тому же, сейчас популярна техника отпечаток браузера (fingerprint), которая позволяет реидентифицировать хосты, очистившие cookies. Есть даже такое понятие, как «вечные cookies» — это такие техники, которые мешают попыткам пользователя замести следы, заново вычисляя его идентификаторы. Достигается это дублированием cookies в HTML5 LocalStorage, Flash LSOs, в кэше Etags и fingerprint. Техники идентификации пользователя по браузеру продолжают совершенствоваться, недавно появилась работа о межбраузерном отпечатке.

    Блокировка JavaScript


    Отключение поддержки JavaScript эффективно против трекеров, которые требуют API доступ, чтобы собирать данные, но бесполезно, если трекер использует HTML редиректы и просто устанавливает cookies через HTTP заголовок. К тому же, веб маяки легко закачиваются и без скриптов. Вот, например, как это реализовано в Facebook pixel:

    <script>
    !function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?
    n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n;
    n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0;
    t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window,
    document,'script','https://connect.facebook.net/en_US/fbevents.js');
    fbq('init', '777', {em: 'insert_email_variable,'});
    fbq('track', 'PageView');
    </script>
    <noscript><img height="1" width="1" style="display:none"
    src="https://www.facebook.com/tr?id=777&ev=PageView&noscript=1"
    /></noscript>

    Do Not Track


    DNT — это HTTP-заголовок, предполагающий позволить обойти отслеживание действий пользователей сайтами. Но на самом деле нет никакой гарантии, что просьба «не отслеживать» будет удовлетворена. Более того, этот флаг даже используется в качестве одного из многих параметров в fingerprint техниках для более точной идентификации браузера…

    Блокировка сторонних cookies


    К счастью, в браузерах есть опция, позволяющая блокировать сторонние cookies. Отключенная по умолчанию, она хорошо скрывается в недрах настроек. Сложнее всего её было найти в Chrome.

    Отключить её можно в Settings/Show advanced settings.../Content settings/Block third-party cookies and site data.

    В Firefox: Options/Privacy/Uses custom settings for history/Accept third-party cookies: Never.
    В Safari: Preferences/Cookies and website data/Allow from current website only
    В Opera: Settings/Cookies/Block third-party cookies and site data

    Если включить эту опцию и повторить предыдущие эксперименты, можно увидеть, что cookies сторонних сайтов (Facebook и Google соответственно) не будут приниматься и отправляться. Казалось бы, можно на этом успокоиться, но что если идентификаторы будут храниться где-то ещё (вспоминая «вечные cookies»)? Тогда, после авторизации в Facebook, идентификаторы могут сохраниться не только в стандартные cookies, но и продублироваться в локальное хранилище браузера и тогда уже с другого сайта код, отвечающий за скачивание веб маяка, может получить эти идентификаторы и связать их с пользователем. Здесь как раз бы помогло отключение Javascript…

    Выводы


    Получается, что веб трекинг через невидимые картинки довольно широко распространён. Маяки, оставаясь невидимыми для пользователя, могут иметь нестандартные размеры (например, 1x5) и быть разных форматов. И хотя современные браузеры имеют возможность блокировать отправку и сохранение сторонних cookies, по умолчанию эта опция отключена и не является панацеей: с развитием web технологий мы можем опасаться того, что сервисы будут повсеместно использовать другие способы для хранения пользовательских идентификаторов, ведь это их хлеб.

    И если раньше никто в интернете не догадывался, что ты — кот, теперь это, увы, не так.

    Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

    Заблокированы ли в вашем браузере сторонние cookies?

    Поделиться публикацией

    Комментарии 38

      +2

      Есть решение чуть более громоздкое, но простое — два разных браузера. Пользуетесь как основным чем-то на основе хромиума — поставьте лисичку и ходите в соц-цети только с нее, или наоборот. Конечно еще вариант использовать разные профили в браузере или два производных от хромиума/две лисы, но лучше не рисковать.


      Для полной секъюрности соц-сети можно держать на портабл версии браузера, стоящей в отдельном шифрованном томе и стирать его перед использованием.

        0

        Какой риск использования разных профилей пользователя и почему это хуже чем портабл-версия браузера?

          0

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

            0

            Насколько я знаю, для портабл-версий используется тот же самый механизм, что и для переключения профилей пользователей...

              0

              И что с того, если это две независимые копии браузера? У портабельной версии заданы относительные пути что-бы она хранила и использовала нужные файлы из своих собственных папок (в основном, может отличаться от браузера к браузеру).


              Ну и что-бы наверняка см. пункт 1 — "два разных браузера"

            0
            Какой риск использования разных профилей
            Главный риск — человеческий фактор. Лучше, чтобы браузеры для разных сценариев отличались как можно сильнее. И привычка не даст ошибиться, когда окно логина выглядит «как-то не так».
          0
          1. Некоторые сайты приотключении сторонних кук перестают работать :)
          2. AdBlock
            0

            AdBlock не блокирует маяки, они и не являются рекламой сами по себе. Они фиксируют, на каких сайтах был пользователь и передают эту информацию заинтересованной стороне.
            Я еще не сталкивалась с тем, что блокировка 3rd party cookies приводит к неработоспособности сайта. Вы не путаете с 1st party cookies?

              0
              Большая часть «маяков» идут вместе с рекламой — так что — блокирует.

              Остальное что ставят напрямую: метрика — гугл аналитика — шаринг соц. сетей и реже ставят пиксели для ретаргетинга.

              По поводу не принимать сторонние куки — как я помню — достаточно 1 раз посетить сайт *.domain.com и куки будут приниматься и посылаться при запросах на *.domain.com со сторонних сайтах.
                0
                Если включить эту опцию и повторить предыдущие эксперименты, можно увидеть, что cookies сторонних сайтов (Facebook и Google соответственно) не будут приниматься и отправляться.

                Они не будут отправляться при включенной опции "Блокировать сторонние cookies", это и проверялось в эксперименте в браузерах Firefox, Safari и Chrome.


                А на 2012 год ситуация была, как вы помните:


                While Firefox blocks third-party cookies both from being set as well as from being sent, most other browsers
                (including Chrome, Safari, and Internet Explorer) only block the setting of third-party cookies. So, for example,
                Facebook can set a first-party cookie when the user visits facebook.com; in browsers other than Firefox, this
                cookie, once set, is available to Facebook from a thirdpartyposition (when embedded on another page).
                  0
                  Большая часть «маяков» идут вместе с рекламой — так что — блокирует.

                  В смысле реклама идёт с маяком? Запросы возвращают одну картинку 1x1, цель которой только получить идентификатор пользователя. А реклама может показываться совсем с других доменов. То, что AdBlock блокирует рекламу — да, но это не отменяет тот факт, что, например, Facebook знает какой пользователь заходил на какие сайты. Потому что он в одном окне авторизован в Facebook, а в других сёрфит сайты, напичканные маяками.

                  0
                  Похоже, Atlassian не пускает:

                  Something has gone wrong
                  Please make sure your browser has third-party cookies enabled and then try again using the button below. Don't refresh the page.
                +1
                Интересная статья, продажа пользовательской информации — огромнейший бизнес для компаний.
                  0
                  Disconnect.
                    0
                    Уже давно есть специальные плагины для браузеров, которые блокируют трекеры, например, Ghostery. Он показывает, какие трекеры стоят на странице, позволяет отключить все или выборочно.

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

                    Если хочется анонимности, то надо ходить по Сети не логинясь ни в какие аккаунты вообще.
                      0
                      А можете эти топ-20 доменов выложить в виде текстового списка?
                      Интересно в hosts добавить и посмотреть, не отвалится ли что-нибудь.
                        +2

                        Вот держите топ-50


                        но у вас отвалится google, например

                        google-analytics.com
                        doubleclick.net
                        google.fr
                        rubiconproject.com
                        facebook.com
                        twitter.com
                        gstatic.com
                        mathtag.com
                        pubmatic.com
                        advertising.com
                        googlesyndication.com
                        rlcdn.com
                        adnxs.com
                        casalemedia.com
                        quantserve.com
                        bluekai.com
                        smartadserver.com
                        exelator.com
                        stickyadstv.com
                        betrad.com
                        bidswitch.net
                        demdex.net
                        yahoo.com
                        adform.net
                        nexac.com
                        krxd.net
                        turn.com
                        bidr.io
                        360yield.com
                        adsrvr.org
                        load.s3.amazonaws.com
                        openx.net
                        mookie1.com
                        chango.com
                        lijit.com
                        adledge.com
                        adsafeprotected.com
                        teads.tv
                        adgrx.com
                        atdmt.com
                        kiosked.com
                        tapad.com
                        truste.com
                        yldcrt.com
                        moatads.com
                        scorecardresearch.com
                        d5nxst8fruw4z.cloudfront.net
                        agkn.com
                        everesttech.net
                        gwallet.com

                          0
                          Спасибо!

                          P.S. А что именно отвалится? Проверил сейчас — поиск работает, почта работает, Hangouts работает, переводчик работает…
                          А больше мне и не надо ничего.)
                            0

                            А, потому что в списке google.fr
                            Вот так отвалится поиск:
                            0.0.0.0 www.google.com
                            0.0.0.0 www.google.ru

                            Только блокировать google через hosts это серьезно)

                              +1
                              Ну так я google блокировать и не планировал)
                              Только рекламные домены и аналитику (типа google-analytics.com).
                      • НЛО прилетело и опубликовало эту надпись здесь
                          +3

                          Закрыть вкладку. Самый надежный способ отказа.

                          0
                          В Firefox есть приватное окно, по идее оно должно спасать от открытых залогиненых страниц в основном окне.
                            +2
                            В Firefox ещё есть контекстные контейнеры. Можно создать контекстный контейнер, например для соц сетей. И только через него в них заходить.
                              0
                              Что-то у себя в FF 52.2.0 ничего такого в меню не нашел.
                                0
                                Зачем такую старую версию использовать? Недавно уже Firefox 44 вышел.
                                Вообще, нужно зайти в about:config, там найти privacy.userContext и выставить true. После перезагрузки заработают. Но в 52 версии, вроде ещё нельзя было их редактировать, может даже новые ещё нельзя создавать. Вот в 44 версии всё ок. Советую обновиться до последней версии.
                                  0
                                  Это последняя версия для хп. Да в конфиге есть, но как-то муторно немного всё, перепутать вкладки легко да еще и искать надо в куче других, у меня их много обычно открыто… приватное окно на мой взгляд удобнее, да и особого смысла куки сохранять не вижу. Открыл прив.окно выбрал сайт в избранном и всё.
                                    0
                                    Контекстные вкладки подсвечиваются, они отличаются от стандартных.
                            0
                            Кроме AdBlock'а есть еще AdGuard. Насколько я знаю — он блокирует 'маяки'. Его и использую.
                              0
                              Интересно поданный приступ критической паранойи, но, как говорилось, реклама — двигатель прогресса, вы не получаете никакой проблемы вроде, кроме сменяющихся картинок в соц.сетях (какие-то будут всегда).
                              А вообще, чем не подходит каждый раз заходить из-под инкогнито? Тот же самый ТОР каждый раз создает новое соединение с чистого листа.
                                0
                                Проблемы появляются для пользователей если собранную статистику начинает использовать тот кто может проанализировать большой объем информации. Например крупный ретейлер как Amazon или Uber.
                                  –1
                                  Проблемы в виде рассылок? Что мешает настроить ящик на спам? Многие проблемы выдумывают сами пользователи.
                                    +1
                                    Изменение цены на один и тот же товар/услугу, для разных пользователей, опираясь на предположение о платежеспособности этих самых пользователей.
                                0
                                >использовала tld библиотеку
                                Пожалуйста, поправить. Россия язык не использует такие конструкции.
                                  0
                                  Для FB можно тупо поставить приложение из магазина и вообще в браузере в него не логиниться. То же самое с VK.
                                    +2
                                    Ха-ха. И сдать им сразу всё.
                                      0
                                      Поставить на отдельный телефон, где кроме FB ничего нет.
                                        0

                                        Оно же ограничено разрешениями.

                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                    Самое читаемое