Modelo de segurança das Carteiras de Software

Uma carteira de criptomoedas é um dispositivo ou aplicativo capaz de gerenciar criptomoedas e realizar transações para uma ou várias criptomoedas. Seus principais recursos de segurança são armazenar as chaves privadas do usuário e usá-las para assinar transações.
 
Podemos distinguir dois tipos predominantes de carteiras: carteiras de software e hardware. Eles cumprem a mesma função, mas de uma forma diferente. As carteiras de software são consideradas mais simples de usar: um único programa é suficiente para criar, validar e assinar as transações. Com uma carteira de software, não é necessário criar a transação no software e confirmá-la em um dispositivo de hardware.
 
Duas semanas atrás, a Forbidden Stories revelou um ataque direcionado contra milhares de pessoas em todo o mundo. Este ataque explorou vulnerabilidades no Android e iOS, para instalar spyware desenvolvido pelo Grupo NSO: Pegasus. Este malware é capaz de monitorar toda a atividade do dispositivo e extrair informações pessoais como conversas de SMS, WhatsApp e Signal, chamadas telefônicas, etc. Este artigo explica como, nessas condições, tal malware seria capaz de extrair todos os segredos de carteiras de software e as diferenças do ponto de vista da segurança entre carteiras de software em telefones celulares e computadores desktop.
 
Este artigo pretende ser não muito técnico. Para mantê-lo relativamente simples, apenas os recursos básicos serão discutidos.
 

Protegendo segredos

O que é armazenado nas carteiras?
 
As carteiras não armazenam realmente as criptomoedas dos usuários: elas apenas armazenam os segredos, principalmente as chaves privadas, que permitem acessar as criptomoedas e gastá-las. Essas chaves privadas são, em sua maioria, chaves privadas ECC (criptografia de curva elíptica) em curvas diferentes dependendo da blockchain. As curvas mais comuns são secp256k1 (Bitcoin, Ethereum…), Ed25519 (Monero) ou BLS12-381 (Ethereum 2).
 
Essas chaves são usadas para assinar transações e, de maneira mais geral, para interagir com ativos de blockchain.
 
O armazenamento dessas chaves depende do tipo de carteira: determinística ou não. Uma carteira Hierárquica Determinística (HD) permite a criação de uma árvore de chaves a partir de um único segredo mestre chamado seed (semente) (cf BIP44). Esta semente é frequentemente derivada de uma sequência mnemônica de 12, 18 ou 24 palavras geradas aleatoriamente ou escolhidas pelo usuário (cf.BIP39). Esses mnemônicos permitem limitar o número de chaves a serem armazenadas: elas podem ser recomputadas a qualquer momento a partir da semente mestre. As carteiras HD armazenam apenas esse mnemônico ou a semente.
 
As carteiras não determinísticas geram uma nova chave para cada uso e devem armazenar todas elas. As carteiras não determinísticas não podem ser facilmente migradas para outra carteira, pois os backups não são compatíveis.
 
As principais características de segurança de uma carteira consistem em gerar, armazenar e utilizar esses segredos de forma adequada. Existem diferentes níveis de segurança contra diferentes tipos de ameaças:
 
  • Proteção contra ataques de “evil maid”: Um invasor com acesso temporário à carteira não deve ser capaz de adicionar um backdoor dentro da carteira permitindo roubar o PIN ou a senha que protege os segredos.
  • Material criptográfico seguro: as chaves e os objetos gerados pela carteira nunca devem ser previsíveis. Além disso, o conhecimento de segredos (exceto a semente) gerados em algum momento não deve permitir prever o segredo a ser gerado no futuro.
  • Proteção em repouso: se um invasor obtiver dados persistentes de uma carteira de software, ele não deve ser capaz de extrair as chaves.
  • Proteção durante o uso secreto: quando a carteira está desbloqueada, as chaves não podem ser acessadas por um invasor ou malware.

Carteiras de Hardware – Hardware wallet

O modelo de segurança de uma hardware wallet visa evitar essas ameaças à segurança. hardware wallets protegem contra malwares por padrão. Elas são dispositivos independentes que assinam transações por conta própria. Os materiais criptográficos sempre ficam dentro do dispositivo e nunca são enviados para o aplicativo de software com o qual se comunicam. A interface de comunicação é sempre simples, o que reduz drasticamente a superfície de ataque. Pode ser USB, Micro SD ou câmera + tela (através do código QR) ou Bluetooth Low Energy.
 
Além disso, as hardware wallets incorporam uma tela diretamente no dispositivo, permitindo ao usuário verificar as ações que está prestes a realizar quando interage com suas chaves secretas. Essas verificações manuais em dispositivos são uma contramedida muito eficiente contra malware no computador/celular. Quando o malware em um computador/dispositivo móvel pode acessar os segredos (seed ou chaves privadas) ou até mesmo trocar/modificar endereços ou valores quando o usuário está realizando uma transação, isso não é possível com uma hardware wallet.
 
As hardware wallets também são projetadas para proteger contra ataques “evil maid” (ataque que permite obter dados no armazenamento de determinado dispositivo) e contra um invasor com acesso físico. Dependendo da hardware wallet, elas possuem diferentes níveis de segurança, mas em todos os casos elas são projetados para proteger contra ameaças. Uma descrição detalhada dos modelos de ameaça da Ledger Nano S e Ledger Nano X pode ser encontrada aqui.
 

Carteiras de Software

As carteiras de software (software wallets) regulares protegem os segredos com meios regulares: mecanismos de segurança do sistema operacional em que são executados e, às vezes, um controle de acesso baseado em um PIN ou uma senha.
 
A seguir, são consideradas as carteiras de desktop (Windows, macOS, Linux) e as carteiras móveis. As principais diferenças entre eles dependem principalmente dos mecanismos de segurança oferecidos pelo sistema operacional.
 

Carteiras de software em um computador

Várias carteiras populares, como ElectrumExodusAtomic ou Bitcoin core, são executadas em computadores.
 
Em um computador, os mecanismos de segurança oferecidos pelo sistema operacional para isolar um processo de carteira de outros processos são limitados. A maioria dos aplicativos é executada pelo mesmo usuário, e os aplicativos têm permissão para ler os dados de outros aplicativos.
 
A segurança dessas carteiras de software depende principalmente da segurança da senha que as protege, e também do fato de que nenhum malware roda no SO (o que é bastante difícil de garantir, veja as notícias recentes sobre Pegasus).
 
Na maioria das vezes, a semente é armazenada em um contêiner criptografado protegido por senha. Um ataque direto consiste, para um malware ou ferramenta de administração remota, recuperar esse contêiner criptografado e enviá-lo ao invasor. Então, a senha pode ser forçada de forma bruta (ataque de força bruta ou brute force attack) ou obtida por meio de um keylogger.
 
Em um cenário em que um invasor só consegue acessar o contêiner criptografado (o invasor encontra uma chave USB contendo uma carteira ou instala malware em um computador, mas a vítima nunca abre seu aplicativo de carteira), o invasor precisa usar a “força bruta” para quebra da senha.
 
A maioria das senhas são ruins. Existem bilhões de senhas que vazaram na web e muitas pessoas tendem a reutilizar suas senhas para vários serviços. Ferramentas prontas permitem que você recupere senhas para carteiras de criptomoedas, como btcrecover ou hashcat. As senhas podem ser complexas, mas atrás de cada carteira há dinheiro de verdade, portanto, os invasores não hesitarão em investir recursos para violar essas senhas.
 
Dois princípios básicos de segurança para manter suas senhas seguras são: usar um gerenciador de senhas e nunca reutilizar sua senha para finalidades diferentes.
 
A ameaça mais preocupante para carteiras de software são malware e ladrões dedicados, desenvolvidos especificamente para drenar seus fundos. Esses malwares, como KPOT ou ElectroRAT, não precisam nem mesmo fazer brute force em sua senha: eles podem capturá-la diretamente quando você a inserir, descriptografar os dados de configuração da carteira e extrair a semente.
 
Aqui está um aplicativo de brinquedo, desenvolvido para este artigo, que tem como alvo a carteira Electrum (embora pudesse ser outra carteira de software). Ele simula um malware que rouba a senha do usuário quando é inserida pela vítima. A senha é então usada para descriptografar os dados da carteira e exibir a semente:
 
Como você pode ver, mesmo que a senha seja complexa, o aplicativo é capaz de extrair a semente ao farejá-la diretamente na memória de forma imediata.
 
Este exemplo é muito semelhante às recentes campanhas de malware .SCR usadas para roubar criptomoedas. Os criminosos usaram técnicas de engenharia social para induzir os usuários a baixar um protetor de tela malicioso. Este protetor de tela estava, na verdade, roubando informações da vítima do computador, incluindo carteira e informações de exchange de criptomoedas.
 
Para concluir sobre carteiras de software em execução em computadores:
 
  • Na maioria dos casos, carteiras de software em execução em computadores “protegem” a semente do usuário usando uma senha.
  • O controle de acesso para esses arquivos de carteira depende principalmente da segurança do computador. Na prática, é difícil proteger os computadores contra malware e, à medida que as criptomoedas se tornam comuns, os ataques contra carteiras se tornam cada vez mais sofisticados.
  • Usar essas carteiras de software para proteger criptomoedas não é uma boa ideia. Qualquer malware especializado será capaz de obter os arquivos da carteira e encontrar as senhas off-line ou obter a senha por meio de um keylogger
Os smartphones Android e iOS oferecem, por padrão, recursos de segurança que não são amplamente usados em sistemas operacionais de desktop.
 
Os sistemas operacionais móveis oferecem proteção de aplicativos e dados do usuário. Em particular, sandboxes de aplicativos são obrigatórios para todos os aplicativos. Este não é o caso, por exemplo, do Windows: por padrão, qualquer aplicativo pode acessar os dados do usuário.
 
Portanto, um aplicativo malicioso não pode ler dados de outro aplicativo, exceto se:
 
  • Ele encontra uma vulnerabilidade nesse aplicativo.
  • Ou consegue aumentar os privilégios, por exemplo, explorando uma vulnerabilidade do kernel, permitindo que ele obtenha acesso root ao sistema.
Infelizmente, esses ataques existem. Eles são muito mais fáceis em versões desatualizadas do Android e iOS e em dispositivos mais antigos ou baratos, onde o código de terceiros costuma ser menos seguro.
 
Em um sistema operacional atualizado, esses ataques são mais difíceis, mas não remotamente inviáveis. Por exemplo, Ian Beer mostrou um ataque de zero clique extremamente impressionante no iOS 13.5 em dezembro de 2020. Guang Gong apresentou uma cadeia de exploit para enraizar remotamente uma ampla gama de dispositivos Android baseados na Qualcomm em junho de 2020. E, duas semanas atrás, Forbidden Stories revelou que o Grupo NSO usou uma cadeia de exploração para visar dispositivos iOS e Android recentes usando vulnerabilidades zero day.
 
Atacantes menos sofisticados podem usar vulnerabilidades locais, permitindo-lhes extrair dados da carteira de um aplicativo malicioso. Vulnerabilidades de corretoras, como o Zerodium, pagam até US $200.000 por um aumento de privilégio para fazer root no Android e iOS, mas até US $1.500.000 por ataques remotos.
 
Estudamos algumas carteiras Android/iOS. Sua segurança depende do próprio aplicativo, mas também dos recursos de segurança do sistema operacional subjacente. Claro, quando a segurança do sistema operacional é derrotada, o aplicativo não é mais seguro
 
Dois métodos para proteger a semente são comumente usados:
 
  • Proteção por senha – os dados da carteira são protegidos por uma senha inserida pelo usuário. O design é o mesmo das carteiras para desktop. Na prática, os dados são mais difíceis de extrair do que de um computador, pois recuperar dados de aplicativos de um aplicativo malicioso é tecnicamente mais difícil, pelos motivos explicados acima. No entanto, recuperar a senha depois que os dados foram roubados é, na prática, mais fácil: inserir senhas complexas em telefones celulares é tedioso, portanto, os usuários tendem a escolher as mais simples. Além disso, os mecanismos de derivação de chave (usados para criar uma chave a partir de uma senha) em dispositivos móveis são geralmente mais simples de quebrar, pois costumam ser mais leves por motivos de desempenho.

Coinomi e Metamask são exemplos de tais carteiras.

No vídeo a seguir, mostramos outro aplicativo de brinquedo desenvolvido para este artigo. É um malware disfarçado como um widget de Bitcoin ticker falso. O malware explora uma vulnerabilidade conhecida em um dispositivo sem patch para obter um acesso root no dispositivo e para extrair a semente criptografada para um servidor remoto. O servidor então usa força bruta na senha para descriptografar a semente.

Este método não é específico para uma carteira. Pode ser (mais ou menos) facilmente adaptado a qualquer carteira protegida por senha. Aqui está o mesmo exemplo com a Carteira Coinbase:

  • Segurança baseada no Android Keystore (ou iOS Keychain) – Neste caso, os dados da carteira são criptografados com uma chave de criptografia armazenada no Android Keystore (iOS Keychain). Esses serviços foram inicialmente projetados para armazenar com segurança as chaves de criptografia (comumente conhecidos como gerenciador de senhas nativo do sistema ou não), e muitos aplicativos os usam para gerar uma chave que irá criptografar todos os dados confidenciais do usuário.

Os aplicativos que usam Keystore implementam o seguinte mecanismo:

– O aplicativo pede ao Keystore para gerar uma chave de criptografia para um determinado identificador. Keystore gera a chave e a armazena com segurança.
– Quando o aplicativo deseja criptografar ou descriptografar um blob, ele envia o blob junto com o identificador de chave para o Keystore.
– Finalmente, o keystore verifica se o aplicativo tem realmente os direitos para usar essa chave e envia de volta os dados de saída para o aplicativo.

 

Com este modelo, o aplicativo não pode saber o valor da chave, mas pode usá-lo. Também é possível associar controles de acesso adicionais à chave: por exemplo, o acesso à chave pode ser condicionado a uma autenticação do usuário (solicitação de um PIN ou padrão de desbloqueio).

 
Esse mecanismo pode fornecer segurança adicional, em comparação com a proteção baseada em senha. De fato, em telefones recentes, o Keystore é apoiado por um Trusted Execution Environment (TEE), ou às vezes um Secure Element.

Isso significa que um invasor com privilégios de root não será capaz de extrair chaves de criptografia do armazenamento de chaves. No entanto, eles serão capazes de usar o Keystore como um oráculo de descriptografia e criptografar ou descriptografar quaisquer dados que desejarem.

Keystore oferece criptografia, mas também serviços de assinatura. Então, uma carteira poderia proteger suas chaves de criptografia, tornando-as difíceis de extrair? Infelizmente, a resposta é não: carteiras de software não usam Keystore para assinar transações e as chaves privadas são sempre manipuladas em texto simples pelo aplicativo.
 
Isso é por um motivo simples: KeyStore e KeyChain oferecem serviços genéricos de assinatura e criptografia, mas não oferecem suporte à criptografia usada em criptomoedas. Por exemplo, o KeyStore implementa a assinatura ECDSA, mas apenas nas curvas NIST definidas no FIPS 186-4 (P-224, P-256, P-384 e P-521). O Bitcoin usa outra curva, secp256k1, que ainda não é compatível.
 
Para resumir, Keystore e Keychain são bons serviços para proteger chaves secretas e privadas. Eles podem oferecer alguma segurança criptografando dados confidenciais: algumas classes de vulnerabilidades (leitura arbitrária de arquivos, por exemplo) serão corrigidas pela criptografia do Keystore. No entanto, se um escalonamento de privilégio raiz não for suficiente para extrair os valores-chave de um Keystore com suporte de hardware, será suficiente descriptografar os dados confidenciais. Um invasor capaz de instrumentar o aplicativo é capaz de recuperar seus segredos.
 
Para concluir sobre carteiras móveis:
 
  • O mecanismo de isolamento entre aplicativos fornecidos pelo iOS/Android aumenta o nível de segurança em comparação com uma carteira de software em execução em um computador. O invasor precisa primeiro de um escalonamento de privilégios para acessar os dados do aplicativo. Isso é viável em dispositivos desatualizados. Atacantes habilidosos (Ian Beer fez isso em 6 meses sozinho, mas… É Ian Beer) também podem fazer isso em dispositivos com patches recentes.
  • Os serviços de proteção de chave (KeyStore, KeyChain) podem adicionar uma camada adicional de segurança para proteger segredos em repouso. No entanto, como eles não suportam algoritmos criptográficos para aplicativos de criptomoeda, a chave ainda pode ser extraída.
  • Em todos os casos, um invasor com acesso root pode recuperar a semente em repouso, quando usada, ou aproveitar os direitos do usuário para esvaziar a carteira usando a carteira do software como um oráculo.

Aqui está um último exemplo de um spyware de demonstração que tem como alvo a carteira Blockchain.com (embora isso pudesse ser executado em muitas outras carteiras com a mesma facilidade). Ele é instalado remotamente e monitora a carteira. Depois que o usuário se autentica usando sua impressão digital, a chave de criptografia é desbloqueada e os dados da carteira são descriptografados. O spyware instrumenta o aplicativo para recuperar essa chave de criptografia. Em seguida, ele exporta a chave e os dados da carteira para um servidor remoto:

Conclusão

Em conclusão, as carteiras de software possuem diferentes níveis de segurança. No entanto, seu modelo de ameaça não cobre o caso de um malware em execução no sistema operacional com escalonamento de privilégios. Isso ocorre por design: o aplicativo de carteira não pode ser mais seguro do que o sistema operacional em que é executado.

  • O mecanismo de isolamento entre aplicativos fornecidos pelo iOS/Android aumenta o nível de segurança em comparação com uma carteira de software em execução em um computador. O invasor precisa primeiro de um escalonamento de privilégios para acessar os dados do aplicativo.
  • Os serviços de proteção de chave (KeyStore, KeyChain) podem adicionar uma camada adicional de segurança para proteger segredos em repouso. No entanto, como eles não suportam algoritmos criptográficos para aplicativos de criptomoeda, as chaves devem ser manipuladas diretamente do aplicativo, portanto, oferecem uma proteção limitada.
  • Em todos os casos, um invasor com acesso root pode recuperar a semente em repouso, quando usada, ou aproveitar os direitos do usuário para esvaziar a carteira usando a carteira do software como oráculo.

Fonte: donjon.ledger.com