- Un commit de uBlock Origin reescribe el flujo de CNAME uncloaking en el procesamiento de red de Firefox y cambia el comportamiento para reflejar en
details.ipla IP obtenida mediante la consulta DNS - La caché
cnamesMap existente desaparece y se reemplaza por un ring buffer de 256 entradas basado endnsList,dnsDictydnsWritePtr, con una caché TTL de60000ms - La consulta DNS usa
browser.dns.resolve(hn, [ 'canonical_name' ]), y utilizacanonicalNameyaddresses[0]del resultado como CNAME e IP, respectivamente - El manejo de excepciones de CNAME mantiene las condiciones de 1st-party, lista de ignorados y documento raíz, y excluye de la reconsulta las direcciones IPv4 o los nombres de host que empiezan con
[ - La versión mínima de Chromium sube a
80.0, la de Opera a67.0, y se elimina el valor predeterminadocnameMaxTTLde la configuración oculta
Reescritura de la estructura de caché DNS en Firefox
- El código relacionado con CNAME uncloaking en
platform/firefox/vapi-background-ext.jspasa de una estructura centrada en un Map global a una estructura de caché DNS dentro de una clase - En lugar del estado global
cnameUncloakEnabledy el Mapcnamesexistentes, la caché se administra con los siguientes camposdnsList: ring bufferdnsWritePtr: siguiente posición de escrituradnsMaxCount: máximo de256dnsDict: mapeo de nombres de host a índices del ring bufferdnsEntryTTL:60000ms
- En el constructor,
canUncloakCnamesycnameUncloakEnabledse inicializan entrue
Flujo de procesamiento de solicitudes
onBeforeSuspendableRequest(details)extrae el nombre de host de la URL solicitada y primero revisa la caché condnsFromCache(hn)- Si la entrada DNS en caché tiene
ip, la configura endetails.ip - Si el resultado de llamar al
super.onBeforeSuspendableRequest(details)base termina en cancelación, redirección, etc., devuelve ese resultado tal cual - Si la entrada DNS en caché no es una
Promise, continúa el procesamiento posterior cononAfterDNSResolution(hn, details, dnsEntry) - Si no se cumplen las condiciones para una nueva consulta DNS o existe
details.proxyInfo?.proxyDNS, no realiza procesamiento DNS adicional
Consulta DNS y método de almacenamiento
dnsShouldResolve(hn)excluye de las consultas DNS los nombres de host vacíos, los nombres de host que empiezan con[y las formas de dirección IPv4dnsResolve(hn, details)registra el nombre de host en la posición actual del ring buffer y llama adnsAPI.resolve(hn, [ 'canonical_name' ])- Si la consulta tiene éxito, se ejecuta
dnsToCache(hn, rec, details); si falla, deja una entrada vacía en la caché condnsToCache(hn) dnsToCacheguardahny la hora de expiración en una nueva entrada de caché- Si
cnameFromRecorddevuelve un valor, lo guarda endnsEntry.cname - Si
ipFromRecorddevuelve un valor, lo guarda endnsEntry.ip
- Si
dnsFromCachedevuelve tal cual una entrada de caché si es unaPromise, y elimina las entradas vencidas dednsListydnsDict
Condiciones para reflejar CNAME e IP
cnameFromRecord(hn, record, details)no devuelve un CNAME sirecord.canonicalNameno existe o es igual al nombre de host original- Si
cnameIgnore1stPartyestá activado, excluye los casos en que el CNAME y el dominio del nombre de host original son iguales - Si existe
cnameIgnoreList, se excluyen los CNAME que no coinciden con esa expresión regular - Si
cnameIgnoreRootDocumentestá activado, excluye el caso en que el nombre de host de la solicitud es igual al nombre de host dedetails.documentUrl || details.url ipFromRecord(record)devuelve la primera direcciónaddresses[0]cuandorecord.addresseses un arreglo y no está vacío
Reescritura de URL y filtrado posterior
onAfterDNSResolutionreescribe la URL conuncloakURLsi la entrada DNS tiene CNAME ycnameUncloakEnabledestá activado- Al cambiar la URL, guarda la URL existente en
details.aliasURLy refleja la nueva URL endetails.url - Si la entrada DNS tiene IP y esta difiere de la
details.ipactual, actualizadetails.ip - Solo cuando ocurre una reescritura de CNAME o un cambio de IP vuelve a llamar a
onBeforeSuspendableRequest(details)de la clase base uncloakURLencuentra la posición del nombre de host dentro de la URL y la reemplaza por el CNAME; según el valor decnameReplayFullURL, concatena la URL completa o conserva solo hasta el inicio de la ruta
Cambios en configuración y manifest
- Se elimina el manejo de
cnameMaxTTLensetOptions - Al cambiar opciones, en lugar de inicializar el Map
cnamesexistente, se vacía la caché DNS condnsList.fill(null)ydnsDict.clear() - Se elimina
cnameMaxTTL: 120de los valores predeterminados de configuración oculta ensrc/js/background.js minimum_chrome_versionenplatform/chromium/manifest.jsoncambia de73.0a80.0minimum_opera_versionenplatform/opera/manifest.jsoncambia de60.0a67.0
1 comentarios
Opiniones de Hacker News
Creo que el título está mal. uBlock Origin ya soportaba esta función desde hace varios años, pero solo era posible en Firefox.
Este caso parece más una refactorización de ese código que una función completamente nueva.
Aunque no es perfecto, porque cuando un dominio tiene varias IP no se puede saber cuál elegirá el navegador.
Si proponen un título más preciso y neutral, se puede volver a cambiar. Pero, sin contexto adicional, un commit de GitHub normalmente no es muy buen material para un hilo de HN.
Aunque todavía no me ha afectado directamente, ya estoy retocando mis extensiones para Firefox, para poder cambiarme si Chrome de verdad elimina uBO.
Llegará dentro de unas cuantas versiones, así que hay que prepararse.
Como mucho, sería cambiar
background.service_workerporbackground.scripts; literalmente solo cambiar el nombre de la clave.uBlock Origin es algo que hace que Firefox sea mucho mejor, y una de las principales razones para usar Firefox en lugar de Chrome y otros.
Hace que internet sea realmente navegable.
Durante más de 10 años hubo problemas de visualización en algunos sitios, pero esos sitios también tenían problemas en Chrome.
Personalmente, considero que la publicidad es como un cáncer de la sociedad moderna. Mezcla mentiras piadosas y mentiras que no lo son, además de manipulación, y el hecho de que mueva cantidades enormes de dinero hace que sea todavía menos respetable.
Brave también es un proyecto de buena calidad, así que lo uso como respaldo, y a veces también mezclo Vivaldi por la división de ventanas y una gestión de pestañas mucho mejor.
¿CNAME cloaking se refiere a que los sitios de anuncios usan subdominios generados al azar que apuntan a registros wildcard?
Normalmente, cuando visitas contentsite.com, los anuncios se sirven desde adsite.com. Si las reglas de bloqueo de anuncios bloquean adsite.com, no ves los anuncios.
El CNAME cloaking consiste en que el sitio principal haga que un subdominio como adsite.contentsite.com apunte a adsite.com. Entonces el bloqueador de anuncios queda ante una tarea casi imposible: bloquear millones de subdominios que parecen pertenecer a un sitio legítimo.
El sitio legítimo puede seguir cambiando de subdominios, y el bloqueador de anuncios no tiene forma de saber qué subdominio es contenido legítimo y cuál es publicidad. Además, como el contenido se sirve desde el mismo dominio, también puede eludir algunas políticas de cookies para rastrear mejor a los usuarios.
Esta actualización permite configurar reglas que filtran según la IP resuelta.
Este es un buen ejemplo de por qué Manifest V3 es malo. Por definición no puede hacer cosas como esta, y tampoco permite heurísticas basadas en código en tiempo de ejecución.
Es una carrera armamentista contra los anunciantes, y Google es el vendedor de armas que le vende a ambos bandos. No va a darle a los usuarios lo que necesitan para ganar.
Por supuesto, todo esto depende de si el proveedor del navegador, es decir Google, quiere agregar esa API. Poder hacer procesamiento imperativo con “código en tiempo de ejecución” permite innovar en el espacio de usuario antes de que los fabricantes del navegador incorporen soporte nativo.
Por lo tanto, decir que cierta función es imposible “por definición” es incorrecto.
[1] https://blog.mozilla.org/addons/2022/05/18/manifest-v3-in-fi...
CNAME cloaking. Por ejemplo, supongamos que el proveedor SaaS A quiere ofrecerle a la empresa Q un excelente software de seguimiento publicitario.
Con el método antiguo, A le habría dicho a Q que insertara en su sitio web, ubicado en
https://q-company.example, un script de, por ejemplo, https://A-ads-tracking.example.Entonces, en las listas de bloqueo que usa uBlock Origin aparecería una regla como “bloquear las solicitudes al dominio A-ads-tracking.example”, y los anuncios quedarían bloqueados.
El CNAME cloaking consiste en que el proveedor SaaS A no aloja el servicio de seguimiento publicitario en el dominio A-ads-tracking.example, sino en una dirección IP específica, por ejemplo 29.1.2.3. Y la parte importante es que SaaS A le pide a la empresa Q que cree un subdominio de q-company.example y que su registro CNAME apunte a 23.1.2.3. Le ponen un nombre plausible, como media.q-company.example.
Después de que la empresa Q configura ese CNAME y agrega al sitio web una etiqueta de script para
media.q-company.example, SaaS A puede rastrear a todos los usuarios de ese sitio. Por esta capa de evasión, se genera en la práctica un juego infinito del gato y el ratón entre los dueños de la empresa Q y las listas públicas de bloqueo.Para evitar este problema, el software que ejecuta extensiones como uBlock Origin debe poder ver no solo el dominio de destino de la solicitud del navegador, sino también la dirección IP real de ese dominio. Este commit parece estar relacionado con habilitar ese comportamiento o, al menos, hacer que ese código funcione mejor.
Por ejemplo,
media.q-company.examplepodría ser un CNAME que apunta aq-company.ads-tracking.example, y luegoq-company.ads-tracking.exampletendría un registro A que devuelve la IP.No sé si el navegador les proporciona a las extensiones los nombres DNS intermedios. Por eso, algo como uBlock quizá tenga que depender de listas de IP, pero un filtrado basado en DNS como pihole puede bloquearlo simplemente con una regla para
ads-tracking.example.En cualquier caso, conviene usar tanto bloqueadores de contenido malicioso basados en navegador como basados en DNS.
Es lento y propenso a errores, pero cuando te acostumbras se vuelve más fácil, y te vuelve completamente inmune a este tipo de tonterías.
¿Chrome va a bloquear uBO? No siempre sigo la situación más reciente.
Tengo entendido que ahora sí van a permitir las cookies de terceros, así que tal vez haya alguna posibilidad.
Están quitando las API clave que uBO necesita para identificar lo que no debe cargarse y luego impedir que se cargue.
Google afirma que es por “rendimiento” o “seguridad”. Por supuesto, el único “rendimiento” o “seguridad” realmente afectado de forma importante es la capacidad de identificar, interceptar y detener descargas dañinas o relacionadas con publicidad antes de que comiencen.
https://developer.chrome.com/docs/extensions/develop/migrate...
https://www.bleepingcomputer.com/news/google/google-chrome-w...
Si usas una versión de Chromium que solo admite Manifest V3, queda oculto.
¿No hay algunos servidores DNS que tienen una función que se comporta como un CNAME resuelto por el servidor? Me refiero a cuando el administrador pone un registro que apunta a otro nombre DNS, pero el cliente solo ve registros A o AAAA.
uBO tiene esta función desde hace bastante tiempo. Desde la versión 1.34.0, y desde la 1.25.0 en la configuración avanzada.
https://github.com/gorhill/uBlock/wiki/Dashboard:-Settings#u...
Recuerdo que fue más o menos en 2021.
¿Cuál es el estado de uBO en Brave, Edge y Opera?
https://brave.com/blog/brave-shields-manifest-v3/
Aunque no es estrictamente necesario. Brave tiene un bloqueador de anuncios integrado bastante potente y, la última vez que revisé, estaba compilado como código nativo, tenía mejor rendimiento que uBO y también admitía por completo las mismas listas de anuncios.