Оффтоп Anton Mironov
266

Расширения браузеров могут следить за вами, и это не их вина

Блокировщики рекламы, VPN сервисы, менеджеры паролей, и другие расширения, которые вы устанавливаете в браузеры, имеют полный доступ ко всем вашим данным на всех страницах, включая пароли, кредитные карты, и приватные фотографии.

В закладки

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

Что я вообще несу, с чего я все это взял?

У меня есть расширение для Гугл Хрома, которое сейчас установлено у 14 000 человек. Ко мне раз в месяц приходят предложения монетизировать пользователей.

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

Например, установленный бесплатный VPN может отбивать затраты на серверы незаметно заменяя все ссылки на Amazon на аффилированные, все блоки Яндекс.Директа на свои баннеры, или вообще отсылать на свой сервер все что введено в поля с типами email и password, и продавать эту информацию. Никто ведь все равно не читает политики сбора информации, правда? Да и написать там можно все что угодно.

Как так получилось?

Разработчики браузеров — большие молодцы, что позволили появиться целым экосистемам над браузерами. Расширения позволяют добавить функций в браузер, и я рекомендую ими пользоваться. Основная проблема кроется в доступе, который запрашивает расширение при установке.

Здесь и дальше я буду писать и приводить примеры про Гугл Хром как самый популярный браузер, но Файрфокс, Опера и Яндекс Браузер используют тот же стандарт расширений, поэтому проблемы едины.

Проблема слишком широкого доступа

Все, кто ставил хоть одно расширение, видел следующий диалог:

Вы заметили? Расширение только что попросило доступ на чтение и модификацию всех данных на всех страницах, которые я буду посещать. И я разрешил. Господа из мира UX подтвердят, что диалог воспринимается как обычный диалог подтверждения установки "Вы действительно хотите установить расширение?". Даже если внимательно прочитать текст, не до конца понятно, что значит фраза про "чтение и модификацию данных".

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

У расширений есть возможность указать на каких сайтах они будут работать, но нет возможности запросить только определенные действия. Например, нельзя запросить:

  • добавление на загруженные сайты своего кода, и ТОЛЬКО ЭТО
  • заполнение форм, и ТОЛЬКО ЭТО
  • удаление кусков кода, и ТОЛЬКО ЭТО

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

Проблема дополнительных доступов

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

Нередко можно встретить рекомендации для разработчиков расширений запрашивать сразу больше доступов, так сказать, "впрок", вдруг потом в заветной версии 2.0 пригодится. Пусть будет, есть не просит. Отсюда такое количество расширений в маркетплейсе с широчайшим доступом.

Итак, мы разобрались, как работают доступы, и чем страшен "read and change all your data...". Вернемся теперь к монетизации.

На почту разработчикам расширений присылают подобные предложения:

{ "items": [{"title":"\u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u043f\u0438\u0442\u0447","image":{"type":"image","data":{"uuid":"9b93573b-5146-ad19-138c-7db30f3027a3","width":1538,"height":1040,"size":145969,"type":"png","color":"","external_service":[]}}},{"title":"\u0413\u0430\u0440\u0440\u0438 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043f\u0438\u0441\u044c\u043c\u0430\u0445 \u0443\u0442\u043e\u0447\u043d\u0438\u043b \u0447\u0442\u043e \u0438\u043c\u0435\u043b \u0432\u0432\u0438\u0434\u0443 15 \u0446\u0435\u043d\u0442\u043e\u0432 \u0441 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430 \u0432 \u043c\u0435\u0441\u044f\u0446","image":{"type":"image","data":{"uuid":"76dd1349-e496-01a4-0898-b885c58e1c0a","width":3076,"height":1608,"size":446054,"type":"png","color":"","external_service":[]}}}] }

Теперь представьте, что вы "инди" разработчик (ака нищеброд). Пассивно зарабатывать хотя бы $1000 на своем расширении — звучит достаточно заманчиво, не правда ли?

Какие способы монетизации предлагаются:

  • fill empty spaces in the sidebar with banners
  • replace images with banners
  • insert banners at the bottom of the page
  • popup banners
  • insert promotional posts on facebook
  • insert promotional search result in google
  • video preroll
  • replace links to amazon with referral links
  • insert middlepage between click and the actual page load

Вы спросите "но как же это все может быть, в маркетплейсе же есть модерация?!". Есть.

Перед публикацией и при каждом обновлении расширения модераторы проверяют эти самые расширения. У Гугл Хрома, очевидно, это происходит автоматически, потому что проверка проходит буквально несколько минут. Просто технически невозможно на 100% определить, делает ли минимизированный код расширения что-то подозрительное. Кроме того, расширение может дополнительно скачать кусок кода из интернета уже после установки, и исполнить его уже без чьего-либо одобрения. Я уже молчу про нетривиальные кей логгеры и другие методики.

Проблема неочевидного интерфейса

Кроме всего описанного выше, есть ощущение, что Гугл Хром специально скрывает эту проблему. Вот смотрите, Хром недавно обновил свою страницу установленных расширений:

Удачи в определении, какое расширение имеет доступ к сайтам, что я посещаю!

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

Если с первыми двумя проблемами бороться должны разработчики браузеров, то с третьей мы можем справиться и сами. Я выложил в опен сорц простейшее расширение, которое показывает в удобном виде установленные расширения, а также человеческим языком пишет, к чему они имеют доступ:

Установить можно по ссылке: https://chrome.google.com/webstore/detail/augeas-clean-browser-from/kkpflicclofohaiajaldnlcheeflcifi

Зачем нужно еще одно расширение?

Получить доступ к списку установленных расширений в браузере можно только с помощью доступа chrome.management. Он не доступен сайтам, но доступен расширениям. Рекомендую взглянуть критическим взглядом на установленные расширения, подумать так ли они вам нужны, и удалить подозрительные, и те, которым вы не доверили бы свою кредитную карту.

После этого рекомендую удалить и сам Augeas. А также рекомендую внимательнее следить за доступами, которые запрашивают расширения при установке.

Материал опубликован пользователем. Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "Anton Mironov", "author_type": "self", "tags": [], "comments": 5, "likes": 7, "favorites": 0, "is_advertisement": false, "subsite_label": "flood", "id": 39282, "is_wide": false }
00
дни
00
часы
00
мин
00
сек
(function(){ var banner = document.querySelector('.teaserSberbank'); var isAdsDisabled = document.querySelector('noad'); if (!isAdsDisabled){ var countdownTimer = null; var timerItem = document.querySelectorAll('[data-sber-timer]'); var seconds = parseInt('15395' + '50799') - now(); function now(){ return Math.round(new Date().getTime()/1000.0); } function timer() { var days = Math.floor(seconds / 24 / 60 / 60); var hoursLeft = Math.floor((seconds) - (days * 86400)); var hours = Math.floor(hoursLeft / 3600); var minutesLeft = Math.floor((hoursLeft) - (hours * 3600)); var minutes = Math.floor(minutesLeft / 60); var remainingSeconds = seconds % 60; if (days < 10) days = '0' + days; if (hours < 10) hours = '0' + hours; if (minutes < 10) minutes = '0' + minutes; if (remainingSeconds < 10) remainingSeconds = '0' + remainingSeconds; if (seconds <= 0) { clearInterval(countdownTimer); } else { timerItem[0].textContent = days; timerItem[1].textContent = hours; timerItem[2].textContent = minutes; timerItem[3].textContent = remainingSeconds; seconds -= 1; } } timer(); countdownTimer = setInterval(timer, 1000); } else { banner.style.display = 'none'; } })();
{ "id": 39282, "author_id": 8849, "diff_limit": 1000, "urls": {"diff":"\/comments\/39282\/get","add":"\/comments\/39282\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/39282"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 199791 }

5 комментариев 5 комм.

Популярные

По порядку

–2

да вы что - к паролям и кредитным картам? а если я не храню пароли и кредитные карты в браузере?

Ответить
4

Вы заполняете формы на сайтах, эти данные любое расширение может перехватывать.

Ответить
0

это да

но, в режиме инкогнито расширения отключены

и если вдруг оно перехватило номер банковской карты - это лечится легко

Ответить
0

Но речь же шла не только об инкогнито + некоторые пользователи включают в режиме инкогнито некоторые расширения вроде AdBlock.
И если расширение в обычном режиме перехватило данные карты поможет только её перевыпуск.

Ответить
0

а перевыпуск делается за 2 секунды

ну если пользователь вводит карту не в инкогнито - сам виноват

adblock что-то перехватывает? смотрите на траффик. кто-то бы уже давно заметил.

Ответить
0

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } } ]
Команда калифорнийского проекта
оказалась нейронной сетью
Подписаться на push-уведомления