- La actualización MV3 de Chrome elimina el permiso
webRequestBlockingpara debilitar la funcionalidad de los bloqueadores de anuncios existentes - El autor descubrió en 2023 un bug que permitía eludir
webRequestBlockingincluso en el entorno MV3 - Este bug se producía por una estructura débil en los bindings de JavaScript y porque código antiguo seguía presente
- Al manipular el ID de instancia de WebView, era posible eludir la verificación de permisos y usar funciones de bloqueo incluso en el entorno MV3
- Actualmente ya se aplicó un parche, por lo que este método de evasión ya no funciona
MV3 y los cambios en los bloqueadores de anuncios
- Chrome está eliminando gradualmente las extensiones MV2 y avanzando en la transición hacia MV3
- MV3 elimina el permiso
webRequestBlocking, impidiendo que los bloqueadores de anuncios bloqueen dinámicamente solicitudes de red mediante scripts - En lugar de ese permiso, se añadió la API
declarativeNetRequest, pero no ofrece el mismo nivel de flexibilidad - Como resultado de este cambio, el rendimiento de los bloqueadores de anuncios se redujo de forma significativa
Limitaciones de la estructura de bindings de JavaScript
- Aunque el núcleo de Chrome está desarrollado en C++, las extensiones funcionan con JavaScript y también acceden a las API de extensiones mediante bindings de JS
- Hasta 2015~2016, las API se inicializaban y validaban insertando archivos JS (módulos de bindings de extensiones) en los sitios
- Este enfoque era vulnerable al override de funciones globales y prototipos de JS, lo que provocó varios bugs de Universal XSS
- Después, Google migró los bindings principales a C++, pero algunos archivos de bindings en JS aún permanecen
- Incluso hoy, ciertas API como
chrome.webRequestsiguen usando una estructura de bindings en JS
Evasión usando la clase de eventos de solicitudes web
-
En MV2, el bloqueo de solicitudes web podía implementarse con el siguiente código
chrome.webRequest.onBeforeRequest.addListener(() => { return { cancel: true } }, { urls: ['*://*.example.com/*'] }, ['blocking']) -
En MV3, la opción
blockingestá prohibida, por lo que el bloqueo normal no es posible -
Sin embargo, es posible crear un objeto de evento arbitrario mediante
.constructordel eventowebRequest -
Internamente, una clase wrapper especial de los bindings de JS administra ese objeto de evento
-
Si se especifica
opt_webViewInstanceId, uno de los parámetros del constructor, es posible saltarse la lógica de permiso exclusiva para apps de plataforma y evadir la verificación del permiso de bloqueolet WebRequestEvent = chrome.webRequest.onBeforeRequest.constructor let fakeEvent = new WebRequestEvent("webRequest.onBeforeRequest", 0, 0, 0, 1337) fakeEvent.addListener(() => { return { cancel: true } }, { urls: ['*://*.example.com/*'] }, ['blocking']) -
Aunque estaba diseñado para que solo lo usaran apps de plataforma, la validación deficiente del ID de WebView permitió su abuso por extensiones normales
Resultado y parche de seguridad
- Gracias a esta vulnerabilidad, en la práctica sí era posible desarrollar un bloqueador de anuncios completo incluso en el entorno MV3
- El autor reportó este bug a Google en 2023, y en Chrome 118 fue corregido verificando correctamente la propiedad de los permisos de WebView
- No se pagó recompensa, debido a la naturaleza estructural del problema, que solo permitía evadir permisos sin exponer datos adicionales
- Este caso muestra que modificar unas cuantas decenas de líneas de código puede inutilizar una actualización de seguridad de una gran empresa
Conclusión y referencia
- El bug ya fue corregido y ya no funciona
- Como caso similar e interesante de vulnerabilidades relacionadas con extensiones de Chrome, también existe un issue que recibió un número CVE y una recompensa de $10,000 (ver una entrada de blog aparte)
4 comentarios
Probablemente, después de esa actualización, las empresas de bloqueadores de anuncios aumentaron aún más sus ingresos.
Las apps independientes que bloquean por completo a nivel de red solo se pueden usar de forma pagada, así que seguramente se vendieron bastante.
Subir una vulnerabilidad que ya no significa nada después de 2 años, y encima decir que no le pagaron... en lo personal no me parece muy cool.
Pero supongo que también hay que escribir este tipo de cosas en un blog para demostrar el propio valor, ¿no?
Sinceramente, yo también quisiera aprender esa mentalidad y escribir mucho más en mi blog.
Simplemente usen Firefox. En los últimos 1 o 2 años se ha vuelto mucho más rápido, así que no está nada mal.
Yo lo he usado como navegador principal durante años y de vez en cuando lo comparo con Chrome; sobre todo últimamente siento que Firefox ya es lo suficientemente bueno para usarse sin problema.
Incluso las páginas web que ignoraban los estándares web, como los bancos de Corea, últimamente han corregido bastante eso, así que la mayoría también funciona bien en Firefox.
Además, la personalización es mucho más fácil en Firefox.
Comentarios de Hacker News
Aunque me gustaría probar Firefox, los bugs ocasionales al cargar sitios web y el hecho de que no se puedan instalar PWA (Progressive Web Apps) son el mayor obstáculo. Chrome y los navegadores derivados lo soportan desde hace mucho tiempo, y no entiendo bien por qué Firefox todavía no lo implementa. Encontré una extensión de terceros (PWAs for Firefox), pero me da desconfianza usarla por temas de privacidad
Aunque exista una forma de esquivar lo que hace Google, no creo que esa sea la dirección correcta. Si la gente no está de acuerdo con los movimientos de Google, la única forma correcta es abandonar por completo Chrome y todos los navegadores basados en Chromium. Es importante golpear el monopolio de Google y quitarle el control sobre el rumbo futuro de la web
La verdadera solución es usar Firefox. uBlock Origin funciona mejor en Firefox
uBlock Origin works best on Firefox
También dudo que MV3 sea realmente más seguro que MV2 para Google. No parece que cambiar a MV3 refuerce la seguridad de forma esencial
Sobre el caso de alguien que encontró una forma de saltarse el adblocker y fue a avisarle a Google, hubo una reacción del tipo: “lo descubre y va corriendo a delatarlo con Google, genial”
OP reportó a Google un “issue” que no le causaba ningún problema y así bloqueó una forma en que los desarrolladores de extensiones podían saltarse las limitaciones de MV3. Ojalá haya valido al menos $0
Desde que empecé a usar Brave, no extraño Chrome para nada
Brave
Stop using Brave browser
Frente a la afirmación de que “los adblockers necesitan sí o sí
webRequestBlocking, y como Google gana dinero con la publicidad, quitar esa función fue algo muy intencional”, también hay quien opina que “eso no es cierto; cualquiera puede usar uBlock Origin Lite en Chrome y en manifest v3, rinde bien y no noto diferencia con el uBlock Origin de antes. Todo se filtra en C++, así que es mucho más rápido. Claro, existe un límite máximo de reglas, pero por ahora sigue siendo totalmente manejable”Fuera de la laptop del trabajo, casi nunca uso Chrome y en mi día a día sigo con Firefox. Aun así, me da pena no poder usar uBlock Origin en la navegación laboral, donde sí me ayudaba mucho para investigar, consultar documentación y cosas así
Si lo único que quieres es un bypass, basta con instalar Firefox