Browser Extension Pentesting Methodology
Last updated
Last updated
Вивчайте та практикуйте 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
Розширення Chrome - це просто ZIP-папка з .crx розширенням файлу. Ядро розширення - це manifest.json
файл у корені папки, який вказує макет, дозволи та інші параметри конфігурації.
Приклад:
content_scripts
Скрипти контенту завантажуються щоразу, коли користувач переміщується на відповідну сторінку, у нашому випадку будь-яка сторінка, що відповідає виразу https://example.com/*
і не відповідає регулярному виразу *://*/*/business*
. Вони виконуються як власні скрипти сторінки і мають довільний доступ до Document Object Model (DOM) сторінки.
Щоб включити або виключити більше URL-адрес, також можна використовувати include_globs
та exclude_globs
.
Це приклад контентного скрипта, який додасть кнопку пояснення на сторінку, коли API зберігання для отримання значення message
з пам'яті розширення.
Повідомлення надсилається на сторінки розширення скриптом контенту, коли натискається ця кнопка, через використання 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.
Впровадити JS файл при натисканні:
Впровадити функцію при натисканні:
Щоб включити або виключити більше URL-адрес, також можна використовувати include_globs
та exclude_globs
.
run_at
Поле run_at
контролює коли JavaScript файли впроваджуються на веб-сторінку. Бажане та значення за замовчуванням - "document_idle"
.
Можливі значення:
document_idle
: Коли це можливо
document_start
: Після будь-яких файлів з css
, але до того, як буде побудовано будь-яке інше DOM або запущено будь-який інший скрипт.
document_end
: Негайно після завершення DOM, але до того, як підресурси, такі як зображення та фрейми, завантажилися.
manifest.json
Шляхом service-worker.js
background
Повідомлення, надіслані скриптами контенту, отримуються фоновою сторінкою, яка відіграє центральну роль у координації компонентів розширення. Зокрема, фонову сторінку зберігається протягом усього життя розширення, працюючи непомітно без прямої взаємодії з користувачем. Вона має власну модель об'єктів документа (DOM), що дозволяє здійснювати складні взаємодії та управління станом.
Ключові моменти:
Роль фонової сторінки: Виконує функцію нервового центру для розширення, забезпечуючи зв'язок і координацію між різними частинами розширення.
Постійність: Це завжди присутня сутність, невидима для користувача, але важлива для функціональності розширення.
Автоматичне створення: Якщо не визначено явно, браузер автоматично створить фонову сторінку. Ця автоматично згенерована сторінка міститиме всі фонові скрипти, зазначені в маніфесті розширення, забезпечуючи безперебійну роботу фонових завдань розширення.
Зручність, яку надає браузер, автоматично створюючи фонову сторінку (коли не оголошено явно), забезпечує інтеграцію та функціонування всіх необхідних фонових скриптів, спрощуючи процес налаштування розширення.
Приклад фонового скрипту:
Він використовує runtime.onMessage API для прослуховування повідомлень. Коли отримується повідомлення "explain"
, він використовує tabs API для відкриття сторінки в новій вкладці.
Щоб налагодити фоновий скрипт, ви можете перейти до деталей розширення та перевірити сервісний робітник, це відкриє інструменти розробника з фоновим скриптом:
Розширення браузера можуть містити різні види сторінок:
Сторінки дій відображаються у випадному меню, коли натискається іконка розширення.
Сторінки, які розширення буде завантажувати в новій вкладці.
Сторінки параметрів: Ця сторінка відображається поверх розширення при натисканні. У попередньому маніфесті в моєму випадку я зміг отримати доступ до цієї сторінки за адресою chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca
або натиснувши:
Зверніть увагу, що ці сторінки не є постійними, як фонові сторінки, оскільки вони динамічно завантажують вміст за необхідності. Незважаючи на це, вони мають певні можливості з фоновою сторінкою:
Зв'язок з контентними скриптами: Подібно до фонової сторінки, ці сторінки можуть отримувати повідомлення від контентних скриптів, що полегшує взаємодію в межах розширення.
Доступ до специфічних для розширення API: Ці сторінки мають всебічний доступ до специфічних для розширення API, залежно від дозволів, визначених для розширення.
permissions
& host_permissions
permissions
та host_permissions
є записами з manifest.json
, які вказують які дозволи має розширення браузера (сховище, місцезнаходження...) і на яких веб-сторінках.
Оскільки розширення браузера можуть бути такими привілейованими, зловмисне або скомпрометоване може дозволити зловмиснику різні способи викрадення чутливої інформації та шпигунства за користувачем.
Перевірте, як працюють ці налаштування і як їх можна зловживати в:
BrowExt - permissions & host_permissionscontent_security_policy
Політику безпеки вмісту також можна оголосити всередині manifest.json
. Якщо вона визначена, вона може бути вразливою.
За замовчуванням налаштування для сторінок розширення браузера є досить обмежувальними:
Для отримання додаткової інформації про CSP та потенційні обходи, перегляньте:
Content Security Policy (CSP) Bypassweb_accessible_resources
щоб веб-сторінка могла отримати доступ до сторінки розширення браузера, наприклад, .html
сторінки, ця сторінка повинна бути зазначена в полі web_accessible_resources
файлу manifest.json
.
Наприклад:
Ці сторінки доступні за URL, як:
У публічних розширеннях extension-id доступний:
Однак, якщо параметр 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"
оголошує які розширення та веб-сторінки можуть підключатися до вашого розширення через 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()
для створення постійного з'єднання замість надсилання окремих повідомлень, його можна використовувати для надсилання та отримання повідомлень, як у наступному прикладі:
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)