
🕵️♂️ 🔎 🕸️ Я знаю, ты установил эти расширения Chrome ниже.
[中文文档]
crx-scouter.js может незаметно определять, какие расширения Chrome вы используете, и выяснять, является ли человек перед браузером крутым хакером или программистом высокого уровня 🐱. Его можно использовать для ловушек (honeypots), идентификации человек-машина, контрмер блокировки рекламы, предварительных проверок для эксплуатации расширений и т. д.
Принцип работы crx-scouter.js основан на эксперименте, который я провёл с evi1m0 в 2017 году. Google, похоже, пытается решить эту проблему, но безуспешно. Подробности можно найти в документе о принципах работы.
Демо: https://blog.neargle.com/crx-scouter/.
Определить указанное расширение
const { check_one } = await import('./scouter/scouter')
check_one("aapbdbdomjkkjkaonfhkkikfgjllcleb", console.log)
Вывод console.log будет примерно таким:
{
"extid": "aapbdbdomjkkjkaonfhkkikfgjllcleb",
"url": "https://chrome.google.com/webstore/detail/google-translate/aapbdbdomjkkjkaonfhkkikfgjllcleb",
"name": "Google Translate"
}
Конечно, есть и функция check_all_crx(callback), которая поддерживает обнаружение всех расширений по отпечаткам.
✨ Онлайн-демо определения основано на этой функции, и результат выглядит следующим образом:

Почему это возможно?
Разработчики расширений Chrome должны знать, что в пакете с суффиксом crx файл конфигурации manifest.json содержит важную информацию о расширении. Файл с суффиксом crx можно напрямую распаковать с помощью unzip. Пример manifest.json выглядит так:
{
"background": {
"scripts": [ "background.js" ]
},
"content_scripts": [ {
"all_frames": true,
"js": [ "content.js" ],
"matches": [ "http://*/*", "https://*/*", "ftp://*/*", "file:///*" ],
"run_at": "document_end"
} ],
"description": "Validates and makes JSON documents easy to read. Open source.",
"homepage_url": "https://github.com/teocci/JSONView-for-Chrome",
"icons": {
"128": "assets/images/jsonview128.png",
"16": "assets/images/jsonview16.png",
"48": "assets/images/jsonview48.png"
},
"key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApA/pG/flimvWWAeUelHGaQ+IJajQm01JkfK0EYOJPyfsdTkHLwD3Aw16N3zuFkmwz09DcGDT+ehww7GSpW7RpbX5kHrovsqyHXtwt+a2Sp8bYFFdpRPj3+HG6366kNkwttDHMtsDkwuKaBtrQofQe5Ud9mKu9h1FDPwc2Qql9vNtvOqKFhV+EOD0vD2QlliB6sKCteu4nYBlFEkh6pYWRaXdAYSKYdE1SYIuQzE3dk11+KCaAC1T6GffL3sia8n5brVX7Qd+XtXyBzuM54w5e3STwK7uLMhLGDIzHoTcldzWUUflfwuI86VQIFBxPbvXJKqFFFno+ZHs/S+Ra2SPmQIDAQAB",
"manifest_version": 2,
"minimum_chrome_version": "21",
"name": "JSON Viewer",
"permissions": [ "clipboardWrite", "http://*/", "contextMenus", "https://*/", "ftp://*/" ],
"short_name": "JSONViewer",
"update_url": "https://clients2.google.com/service/update2/crx",
"version": "0.7.0",
"web_accessible_resources": [ "assets/options.html", "assets/csseditor.html", "assets/css/jsonview.css", "assets/css/jsonview-core.css", "assets/css/content_error.css", "assets/images/options.png", "assets/images/close_icon.gif", "assets/images/error.gif" ]
}
Если пользователю нужно получить доступ к ресурсам расширения на веб-странице, он должен объявить СПИСОК в web_accessible_resources, возьмём json-view в качестве примера:
"web_accessible_resources": [ "assets/options.html", "assets/csseditor.html", "assets/css/jsonview.css", "assets/css/jsonview-core.css", "assets/css/content_error.css", "assets/images/options.png", "assets/images/close_icon.gif", "assets/images/error.gif" ]
Формат URL для доступа к этим ресурсам выглядит следующим образом:
chrome-extension://' + extension id + /assets/options.html
Я разработал краулер для получения манифестов приложений расширений во всём Google Store, категории выглядят так: 'ext/10-blogging', 'ext/15-by-google', 'ext/12-shopping', 'ext/11-web-development', 'ext/1-communication', 'ext/7-productivity', 'ext/38-search-tools', 'ext/13-sports', 'ext/22-accessibility', 'ext/6-news', 'ext/14-fun', 'ext/28-photos' и так далее.
Затем мы получаем отпечатки всех расширений, которые включают web_accessible_resources.
Пять лет спустя Chrome всё же обновил функцию безопасности, чтобы обойти эту проблему. А именно, в web_accessible_resources добавлена функция белого списка matches, и только URL-адреса из белого списка могут получить доступ к web_accessible_resources, предотвращая обнаружение по отпечаткам на фронтенде.
Но... из 110 000 расширений, которые я сканировал в этом году, только 286 плагинов добавили белый список matches для web_accessible_resources; и большинство из них настроены с бесполезным белым списком *://*/* и другими явно обходимыми белыми списками.
Это показывает, насколько бесполезна функция безопасности, которую никто не использует или используют неправильно.