Browser Extension Pentesting Methodology
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Основна інформація
Розширення браузера написані на JavaScript і завантажуються браузером у фоновому режимі. Воно має свій DOM, але може взаємодіяти з DOM інших сайтів. Це означає, що воно може скомпрометувати конфіденційність, цілісність і доступність (CIA) інших сайтів.
Основні компоненти
Макети розширень виглядають найкраще, коли їх візуалізують, і складаються з трьох компонентів. Давайте розглянемо кожен компонент детальніше.
Скрипти контенту
Кожен скрипт контенту має прямий доступ до DOM однієї веб-сторінки і, таким чином, піддається потенційно шкідливому вводу. Однак скрипт контенту не має жодних дозволів, окрім можливості надсилати повідомлення до ядра розширення.
Ядро розширення
Ядро розширення містить більшість привілеїв/доступу розширення, але ядро розширення може взаємодіяти з веб-контентом лише через XMLHttpRequest та скрипти контенту. Крім того, ядро розширення не має прямого доступу до хост-машини.
Рідний бінарний файл
Розширення дозволяє рідний бінарний файл, який може доступатися до хост-машини з повними привілеями користувача. Рідний бінарний файл взаємодіє з ядром розширення через стандартний інтерфейс програмування додатків плагінів Netscape (NPAPI), який використовується Flash та іншими плагінами браузера.
Межі
Щоб отримати повні привілеї користувача, зловмисник повинен переконати розширення передати шкідливий ввід від скрипта контенту до ядра розширення і від ядра розширення до рідного бінарного файлу.
Кожен компонент розширення відокремлений один від одного сильними захисними межами. Кожен компонент працює в окремому процесі операційної системи. Скрипти контенту та ядра розширення працюють у пісочницях, недоступних для більшості служб операційної системи.
Більше того, скрипти контенту відокремлені від своїх асоційованих веб-сторінок, працюючи в окремій купі JavaScript. Скрипт контенту та веб-сторінка мають доступ до одного й того ж базового DOM, але двоє ніколи не обмінюються вказівниками JavaScript, що запобігає витоку функціональності JavaScript.
manifest.json
manifest.json
Розширення Chrome - це просто ZIP-папка з .crx розширенням файлу. Ядро розширення - це manifest.json
файл у корені папки, який вказує макет, дозволи та інші параметри конфігурації.
Приклад:
content_scripts
content_scripts
Скрипти контенту завантажуються щоразу, коли користувач переміщується на відповідну сторінку, у нашому випадку будь-яка сторінка, що відповідає виразу https://example.com/*
і не відповідає регулярному виразу *://*/*/business*
. Вони виконуються як власні скрипти сторінки і мають довільний доступ до Document Object Model (DOM) сторінки.
Щоб включити або виключити більше URL-адрес, також можна використовувати include_globs
та exclude_globs
.
Це приклад контентного скрипта, який додасть кнопку пояснення на сторінку, коли API зберігання буде використовуватися для отримання значення message
з пам'яті розширення.
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2585115637-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FhAv2kYoPrT3n8552GaQU%252Fuploads%252Fgit-blob-f963370a18f80faa11a2ae0ddac24ce6e6393190%252Fimage%2520%2823%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=c3d31daf&sv=1)
Повідомлення надсилається на сторінки розширення скриптом контенту, коли ця кнопка натискається, через використання runtime.sendMessage() API. Це пов'язано з обмеженнями скрипта контенту в прямому доступі до API, з storage
, що є одним з небагатьох винятків. Для функціональностей, що виходять за межі цих винятків, повідомлення надсилаються на сторінки розширення, з якими можуть спілкуватися скрипти контенту.
Залежно від браузера, можливості скрипта контенту можуть трохи відрізнятися. Для браузерів на базі Chromium список можливостей доступний у документації Chrome Developers, а для Firefox основним джерелом є MDN. Також варто зазначити, що скрипти контенту мають можливість спілкуватися зі скриптами фону, що дозволяє їм виконувати дії та передавати відповіді назад.
Для перегляду та налагодження скриптів контенту в Chrome меню інструментів розробника можна відкрити з Options > More tools > Developer tools АБО натиснувши Ctrl + Shift + I.
Після відображення інструментів розробника потрібно натиснути на вкладку Source, а потім на вкладку Content Scripts. Це дозволяє спостерігати за запущеними скриптами контенту з різних розширень та встановлювати точки зупинки для відстеження потоку виконання.
Впроваджені скрипти контенту
Зверніть увагу, що скрипти контенту не є обов'язковими, оскільки також можливо динамічно впроваджувати скрипти та програмно впроваджувати їх на веб-сторінках через tabs.executeScript
. Це насправді надає більше докладних контролів.
Для програмного впровадження скрипта контенту розширення повинно мати дозволи хоста для сторінки, на яку потрібно впровадити скрипти. Ці дозволи можуть бути отримані або запитуючи їх у маніфесті розширення, або на тимчасовій основі через activeTab.
Приклад розширення на основі activeTab
Вставити JS файл по кліку:
Впровадити функцію при натисканні:
Приклад з дозволами на скрипти
Щоб включити або виключити більше URL-адрес, також можна використовувати include_globs
та exclude_globs
.
Content Scripts run_at
run_at
Поле run_at
контролює коли JavaScript файли впроваджуються на веб-сторінку. Бажане та значення за замовчуванням - "document_idle"
.
Можливі значення:
document_idle
: Коли це можливоdocument_start
: Після будь-яких файлів зcss
, але до того, як буде побудовано будь-яке інше DOM або запущено будь-який інший скрипт.document_end
: Негайно після завершення DOM, але до того, як підресурси, такі як зображення та фрейми, завантажилися.
Via manifest.json
manifest.json
Через service-worker.js
background
background
Повідомлення, надіслані скриптами контенту, отримуються фоновою сторінкою, яка відіграє центральну роль у координації компонентів розширення. Зокрема, фонову сторінку зберігається протягом усього життя розширення, працюючи непомітно без прямої взаємодії з користувачем. Вона має власну модель об'єктів документа (DOM), що дозволяє здійснювати складні взаємодії та управління станом.
Ключові моменти:
Роль фонової сторінки: Виконує функцію нервового центру для розширення, забезпечуючи зв'язок і координацію між різними частинами розширення.
Постійність: Це завжди присутній об'єкт, невидимий для користувача, але важливий для функціональності розширення.
Автоматичне створення: Якщо не визначено явно, браузер автоматично створить фонову сторінку. Ця автоматично згенерована сторінка міститиме всі фонові скрипти, зазначені в маніфесті розширення, забезпечуючи безперебійну роботу фонових завдань розширення.
Зручність, яку надає браузер, автоматично створюючи фонову сторінку (коли вона не оголошена явно), забезпечує інтеграцію та функціонування всіх необхідних фонових скриптів, спрощуючи процес налаштування розширення.
Приклад фонового скрипту:
Він використовує runtime.onMessage API для прослуховування повідомлень. Коли отримується повідомлення "explain"
, він використовує tabs API для відкриття сторінки в новій вкладці.
Щоб налагодити фоновий скрипт, ви можете перейти до деталей розширення та перевірити сервісний робітник, це відкриє інструменти розробника з фоновим скриптом:
Сторінки параметрів та інше
Розширення браузера можуть містити різні види сторінок:
Сторінки дій відображаються у випадному меню, коли натискається іконка розширення.
Сторінки, які розширення буде завантажувати в новій вкладці.
Сторінки параметрів: Ця сторінка відображається поверх розширення при натисканні. У попередньому маніфесті в моєму випадку я зміг отримати доступ до цієї сторінки за адресою
chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca
або натиснувши:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2585115637-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FhAv2kYoPrT3n8552GaQU%252Fuploads%252Fgit-blob-9674c12c62b3f1bd2ef1f2bc724900e3e14689c8%252Fimage%2520%2824%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=8707fe01&sv=1)
Зверніть увагу, що ці сторінки не є постійними, як фонові сторінки, оскільки вони динамічно завантажують вміст за необхідності. Незважаючи на це, вони мають певні можливості з фоновою сторінкою:
Зв'язок з контентними скриптами: Подібно до фонової сторінки, ці сторінки можуть отримувати повідомлення від контентних скриптів, що полегшує взаємодію в межах розширення.
Доступ до специфічних для розширення API: Ці сторінки мають повний доступ до специфічних для розширення API, відповідно до дозволів, визначених для розширення.
permissions
& host_permissions
permissions
& host_permissions
permissions
та host_permissions
є записами з manifest.json
, які вказують які дозволи має розширення браузера (сховище, місцезнаходження...) і в яких веб-сторінках.
Оскільки розширення браузера можуть бути настільки привілейованими, зловмисне або скомпрометоване може дозволити зловмиснику різні способи викрадення чутливої інформації та шпигунства за користувачем.
Перевірте, як ці налаштування працюють і як їх можна зловживати в:
BrowExt - permissions & host_permissionscontent_security_policy
content_security_policy
Політику безпеки вмісту також можна оголосити всередині manifest.json
. Якщо вона визначена, вона може бути вразливою.
За замовчуванням налаштування для сторінок розширення браузера є досить обмежувальними:
Для отримання додаткової інформації про CSP та потенційні обходи, перегляньте:
Content Security Policy (CSP) Bypassweb_accessible_resources
web_accessible_resources
щоб веб-сторінка могла отримати доступ до сторінки розширення браузера, наприклад, .html
сторінки, ця сторінка повинна бути зазначена в полі web_accessible_resources
файлу manifest.json
.
Наприклад:
Ці сторінки доступні за URL, як:
У публічних розширеннях extension-id доступний:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2585115637-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FhAv2kYoPrT3n8552GaQU%252Fuploads%252Fgit-blob-55da1d3803492ee4681e3e82b9eb1da17f8b25f6%252Fimage%2520%281194%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=212252fa&sv=1)
Хоча, якщо параметр manifest.json
use_dynamic_url
використовується, цей id може бути динамічним.
Зверніть увагу, що навіть якщо сторінка згадується тут, вона може бути захищена від ClickJacking завдяки Content Security Policy. Тому вам також потрібно перевірити це (розділ frame-ancestors) перед підтвердженням можливості атаки ClickJacking.
Доступ до цих сторінок робить їх потенційно вразливими до ClickJacking:
BrowExt - ClickJackingДозволяючи завантажувати ці сторінки лише через розширення, а не через випадкові URL, можна запобігти атакам ClickJacking.
Зверніть увагу, що сторінки з web_accessible_resources
та інші сторінки розширення також можуть контактувати з фоновими скриптами. Тому, якщо одна з цих сторінок вразлива до XSS, це може відкрити більшу вразливість.
Більше того, зверніть увагу, що ви можете відкривати лише сторінки, вказані в web_accessible_resources
всередині iframe, але з нової вкладки можливо отримати доступ до будь-якої сторінки в розширенні, знаючи ID розширення. Тому, якщо XSS виявлено, зловживаючи тими ж параметрами, це може бути використано, навіть якщо сторінка не налаштована в web_accessible_resources
.
externally_connectable
externally_connectable
Згідно з документацією, властивість маніфесту "externally_connectable"
оголошує які розширення та веб-сторінки можуть підключатися до вашого розширення через runtime.connect та runtime.sendMessage.
Якщо ключ
externally_connectable
не оголошений у маніфесті вашого розширення або він оголошений як"ids": ["*"]
, всі розширення можуть підключатися, але жодні веб-сторінки не можуть підключатися.Якщо вказані конкретні ID, як у
"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]
, тільки ці програми можуть підключатися.Якщо вказані збіги, ці веб-додатки зможуть підключатися:
Якщо вказано як порожнє:
"externally_connectable": {}
, жоден додаток або веб не зможе підключитися.
Чим менше розширень і URL-адрес вказано тут, тим менша площа атаки буде.
Якщо веб-сторінка вразлива до XSS або захоплення вказана в externally_connectable
, зловмисник зможе надсилати повідомлення безпосередньо до фонового скрипта, повністю обходячи Контентний скрипт і його CSP.
Отже, це дуже потужний обхід.
Більше того, якщо клієнт встановить шкідливе розширення, навіть якщо йому не дозволено спілкуватися з вразливим розширенням, воно може впроваджувати XSS дані на дозволеній веб-сторінці або зловживати WebRequest
або DeclarativeNetRequest
API для маніпуляції запитами на цільовому домені, змінюючи запит сторінки на файл JavaScript. (Зверніть увагу, що CSP на цільовій сторінці може запобігти цим атакам). Ця ідея походить з цього опису.
Підсумок комунікації
Розширення <--> Веб-додаток
Для комунікації між контентним скриптом і веб-сторінкою зазвичай використовуються повідомлення. Тому в веб-додатку ви зазвичай знайдете виклики функції window.postMessage
і в контентному скрипті слухачі, такі як window.addEventListener
. Зверніть увагу, що розширення також може спілкуватися з веб-додатком, надсилаючи Post Message (і тому веб повинен це очікувати) або просто змусити веб завантажити новий скрипт.
Всередині розширення
Зазвичай функція chrome.runtime.sendMessage
використовується для надсилання повідомлення всередині розширення (зазвичай обробляється background
скриптом), а для отримання та обробки його оголошується слухач, який викликає chrome.runtime.onMessage.addListener
.
Також можливо використовувати chrome.runtime.connect()
для створення постійного з'єднання замість надсилання окремих повідомлень, його можна використовувати для надсилання та отримання повідомлень, як у наступному прикладі:
Last updated