
🕵️♂️ 🔎 🕸️ Eu sei que você instalou estas extensões do Chrome abaixo.
[中文文档]
crx-scouter.js pode detectar quais extensões do Chrome estamos usando silenciosamente, e pode detectar se a pessoa diante do navegador é um hacker incrível ou um programador de alto nível 🐱. Pode ser usado para honeypots, identificação humano-máquina, contramedidas de bloqueio de anúncios, pré-verificações para exploração de extensões, e assim por diante.
O princípio do crx-scouter.js é baseado em um experimento que fiz com o evi1m0 em 2017. O Google parece querer resolver esse problema, mas com pouco sucesso. Detalhes podem ser encontrados em o documento do princípio.
Demonstração em: https://blog.neargle.com/crx-scouter/.
Detectar uma extensão específica
const { check_one } = await import('./scouter/scouter')
check_one("aapbdbdomjkkjkaonfhkkikfgjllcleb", console.log)
A saída de console.log como abaixo:
{
"extid": "aapbdbdomjkkjkaonfhkkikfgjllcleb",
"url": "https://chrome.google.com/webstore/detail/google-translate/aapbdbdomjkkjkaonfhkkikfgjllcleb",
"name": "Google Translate"
}
Claro, também existe uma função check_all_crx(callback) que suporta a detecção de todas as extensões nas impressões digitais.
✨ Demonstração de Detecção Online é baseada nesta função, e o efeito é o seguinte:

Por que podemos fazer isso?
Desenvolvedores de extensões do Chrome devem saber que no pacote com o sufixo crx, o arquivo de configuração manifest.json fornece informações importantes da extensão. O arquivo com sufixo crx pode ser descomprimido diretamente com unzip. Exemplo de manifest.json como abaixo:
{
"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" ]
}
Se o usuário precisar acessar os recursos da extensão na página web, ele deve declarar a LISTA em web_accessible_resources, tomando o json-view como exemplo:
"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" ]
O formato da URL para acessar esses recursos é o seguinte:
chrome-extension://' + extension id + /assets/options.html
Desenvolvi um crawler para obter os manifestos das extensões de toda a Google Store, categorias como as seguintes: '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' e assim por diante.
Então, obtemos todas as impressões digitais das extensões que incluem web_accessible_resources.
Cinco anos depois, o Chrome ainda atualizou um recurso de segurança para contornar esse problema. Ou seja, o web_accessible_resources adiciona um recurso de segurança de lista de permissões (whitelist) de matches, e apenas URLs dentro da lista de permissões podem acessar os web_accessible_resources, evitando a detecção por impressão digital no front-end.
Mas... das 110.000 extensões que rastreei este ano, apenas 286 plugins adicionaram a lista de permissões de matches do web_accessible_resources; e a maioria deles estão configurados com listas de permissões inúteis como *://*/* e outras listas de permissões claramente contornáveis.
Isso mostra como é impotente um recurso de segurança que ninguém usa ou que é usado de forma errada.