Hardening de segurança para carteiras digitais
1. Introdução
Este artigo aborda controles de segurança que reduzem o risco de acesso não autorizado ou uso indevido, vazamento de informações e acesso físico não autorizado, principalmente. Esses controles podem ser aplicados em qualquer situação mas o foco deste artigo é destacar o uso dos controles para reduzir o risco de um atacante descobrir a chave privada ou seed de uma carteira de moedas digitais.
Everyone wants there to be simple answers in security, but sometimes there are no simple answers.
— Tavis Ormandy (@taviso) December 15, 2017
1.1. Estratégia
Para uma utilização mais fácil e melhor gestão de riscos as carteiras podem ser segregadas. O ideal é que a carteira principal (que contém a maior parte dos seus recursos) fique isolada do dispositivo usado no dia-a-dia, como se fosse um cofre. O seu computador pode ter outra carteira, para pagamentos corriqueiros e o seu celular outra, para pequenos pagamentos quando estiver fora de casa. Há várias opções para o “cofre”:
a) Uma hardware wallet, como Ledger wallet ou Trezor (se houver suporte à moeda) b) Um hardware dedicado, como um laptop c) Dual boot em pendrive ou HD externo (necessário ver o espaço disponível se for necessário baixar a blockchain de várias moedas) d) Um sistema virtualizado (dedicado) e) Uma paper wallet apenas (não permite PoS) f) Hardware compartilhado com outras atividades (menos seguro)
Usuários que escolheram uma das estratégias entre a) e e), já resolveram a maior parte dos seus problemas e podem ler as recomendações da seção 3 apenas para conhecer mais sobre segurança da informação de uma forma geral. Já os usuários que precisam usar uma carteira em um dispositivo usado para outros fins precisam mesmo ver a seção 3 com bastante atenção.
1.2. Abordagem
Neste artigo os controles de segurança sugeridos seguem a abordagem whitelist.
1.2.1. Blacklist
A abordagem por blacklist define tudo o que não é permitido, fazendo com que tudo que não é explicitamente bloqueado seja permitido.
1.2.2. Whitelist
A abordagem whitelist define tudo o que é permitido. Aquilo que não é explicitamente permitido será bloqueado. Essa é uma abordagem mais segura e prática. Mais segura porque não é possível imaginar todo tipo de ataque que será executado, todos os sites maliciosos, todos os aplicativos infectados. Em algum momento algo vai conseguir burlar a blacklist. É mais prático porque é mais rápido e fácil permitir apenas um pequeno conjunto de conexões, sites, extensões de browser, etc. do que tentar bloquear todas as novas ameaças que surgem todos os dias.
2. Ameaças
Algumas ameaças consideradas para a sugestão dos controles de segurança na seção 3:
2.1. Acesso lógico não autorizado
Dependendo da vulnerabilidade explorada é possível que o atacante acesse o arquivo da carteira no HD, capture teclas digitadas e movimento do mouse, tire screenshots da tela, leia conteúdo da memória podendo obter o todo ou parte da chave privada ou da seed.
2.2. Vazamento de informações
Mesmo que o atacante não consiga acessar a seed ou a chave privada ele pode tentar obter o máximo de informações sobre o usuário com o objetivo de fazer login nas exchanges e transferir recursos, garimpando emails, senhas e informações que ajudem a responder as pesquisas de segurança em caso de esquecimento de senha.
2.3. Acesso físico não autorizado
Se o setup do dispositivo permitir dual boot é possível dar boot com Linux em um pendrive e copiar as informações da carteira digital no HD. Veja a recomendação 3.18.
3. Recomendações
Disclaimer: As recomendações a seguir são baseadas apenas em estudos, experiência profissional e preferências pessoais. Sempre faça sua própria pesquisa, avalie os seus riscos e faça backup antes de implantar qualquer controle de segurança.
Muitas das recomendações feitas aqui são muito difíceis para o usuário comum. No mundo ideal segurança seria algo fácil, como marcar uma checkbox. Infelizmente segurança nem sempre é algo trivial. O usuário comum deve pelo menos seguir as recomendações 3.1, 3.2, 3.4, 3.5, 3.6, 3.9, 3.11, 3.12, 3.13, 3.14, 3.15, 3.17, 3.19. Isso mesmo, quase toda a lista.
3.1. Não use software pirata
Qualquer especialista dirá que quase todas, senão todas, as cópias piratas de Windows estão infectadas com algum código malicioso. Alguns anos atrás o objetivo era roubar credenciais de Internet Banking. Até nisso os bancos estão perdendo espaço. É muito mais fácil para o hacker roubar moedas digitais. Não deixam rastros, não dependem de outros controles de segurança como os bancos e contam com uma grande adoção no mercado. Esses códigos maliciosos geralmente impedem que o antivírus detecte sua presença, por isso nunca confie no antivírus de um Windows pirata.
A mesma recomendação vale para outros aplicativos piratas (“crackeados”): não use, podem estar infectados. Alguns precisam de credenciais administrativas, mesmo que apenas na instalação. Outros buscarão explorar vulnerabilidades do sistema operacional ou ler chaves e senhas a partir da memória. Há ainda aqueles que tentarão localizar na pasta do usuário arquivos de senhas e carteiras de moedas para enviar ao atacante.
3.2. Não use a conta administrativa regularmente
Qualquer tarefa executada com poderes administrativos tem muito mais alcance dentro do sistema operacional do que aquilo que é executado com um usuário comum. Usuários comuns tem acesso ao próprio ambiente apenas. Usuários administrativos podem fazer praticamente tudo dependendo do sistema operacional. Deixe os usuários administrativos apenas para tarefas administrativas.
Linux
No Linux, crie um usuário comum. Instale o sudo (Super User do) e adicione-o ao grupo sudo (grupo de usuários que podem executar o comando sudo). Daí em diante passe a usar o sudo para executar comandos que requerem poderes de root.
# apt-get install sudo
# usermod -aG sudo [username]
Para verificar se o usuário faz parte do grupo sudo:
# groups [username]
Mac e Windows
No Mac e no Windows deve-se fazer logon com um usuário comum e fornecer as credenciais administrativas quando necessário.
3.3. Instale um firewall
O firewall é apenas mais um controle de segurança e não será a solução de todos os problemas. O objetivo do firewall é filtrar pacotes e conexões indesejadas. Como regra geral nenhuma conexão deve ser permitida se não há um motivo.
Linux
Os usuários de Linux já contam com um firewall nativo do kernel: iptables. Como recomendação geral pode-se aplicar as seguintes regras (as listas abaixo não são exaustivas):
$ sudo iptables -A INPUT -i lo -j ACCEPT
$ sudo iptables -A INPUT -m state --state INVALID -j DROP
$ sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$ sudo iptables -A INPUT -j LOG
$ sudo iptables -P INPUT DROP
$ sudo iptables -P FORWARD DROP
As regras de DROP recusam todos os pacotes, a segunda regra permite apenas o tráfego localhost (interno) e a quarta regra permite apenas o tráfego relacionado com atividades iniciadas pelo próprio computador. Poderia ser aplicada uma regra restringindo a saída de pacotes para evitar a comunicação de códigos maliciosos com o atacante. Essa regra teria efeito praticamente nulo já que a muitos desses códigos se comunicam via HTTPS (TCP/443) e de forma obfuscada. Seria necessário bloquear todo o tráfego de saída para a Internet e impedir até as atualizações via HTTPS.
$ sudo iptables -A OUTPUT -o lo -j ACCEPT
$ sudo iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$ sudo iptables -A OUTPUT -m multiport -p tcp --dports 80,443 -j ACCEPT
$ sudo iptables -A OUTPUT -m multiport -p tcp --dports 9108,9109 -m comment --comment "dcrd p2p, RPC" -j ACCEPT
$ sudo iptables -A OUTPUT -m multiport -p tcp --dports 19108,19109 -m comment --comment "testnet dcrd p2p, RPC" -j ACCEPT
$ sudo iptables -A OUTPUT -p udp --dport 53 -m comment --comment "DNS Queries" -j ACCEPT
$ sudo iptables -A OUTPUT -p tcp --dport 53 -m comment --comment "DNS Extended Queries" -j ACCEPT
$ sudo iptables -A OUTPUT -p tcp --dport 11371 -m comment --comment "GPG HKP" -j ACCEPT
$ sudo iptables -A OUTPUT -j LOG
$ sudo iptables -P OUTPUT DROP
Para permitir acesso externo ao dcrd (Decred) é necessário abrir outras portas no firewall (chain INPUT) e configurar o NAT no roteador. Veja em: https://github.com/decred/dcrd/blob/master/docs/default_ports.md
Para salvar as regras e recarrega-las automaticamente instale o iptables-persistent:
$ sudo apt-get install iptables-persistent
Para salvar as novas regras use:
$ sudo iptables-save > /etc/iptables/rules.v4
Mac
Usuários de Mac podem tentar usar o firewall de rede nativo pfsense e habilitar o firewall de aplicação nativo, ou avaliar outras soluções mais amigáveis como Little Snitch e Hands Off.
Windows
Usuários de Windows podem usar o Windows Firewall (que é melhor do que nada) ou buscar uma solução mais robusta.
3.4. Mantenha sistema e aplicativos atualizados
Todos os sistemas operacionais e aplicativos, de qualquer plataforma, vêm com vulnerabilidades que são descobertas, corrigidas e atualizadas frequentemente. Mantenha seus dispositivos sempre atualizados. Habilite as atualizações automáticas ou use a ferramenta do sistema para procurar atualizações diariamente.
Mac
Abra a App Store e clique em Updates.
Debian Linux
$ sudo apt-get update && apt-get upgrade
Redhat Linux
$ sudo yum update
Windows
Execute o Windows Update (em algum lugar dentro do Painel de Controle)
3.5. Use senhas de difícil dedução
Uma senha de difícil dedução não é inviolável, apenas torna quase impossível a sua descoberta pelo atacante através de brute force pelo tempo necessário para testar as combinações. Essas senhas costumam ter mais de 14 caracteres, letras maiúsculas [A-Z], letras minúsculas [a-z], números [0-9] e símbolos [!@#$%^&*();:-=+], para citar alguns. Nunca use palavras existentes em dicionário, de qualquer idioma. Nunca use dados que podem ser obtidos pelo atacante em bases de dados de provedores de serviços como, nomes, emails, datas de nascimento, etc.
O aplicativo MasterPassword pode ajudar quem tem dificuldade de inventar novas senhas. Ele gera novas senhas através de um algoritmo que combina uma senha mestra (que precisa ser escolhida e memorizada pelo usuário) e o nome dos sites que serão acessados. Não faz qualquer tipo de conexão externa e não armazena localmente as senhas geradas. Todo o processo é determinístico, nada é aleatório, então pode ser reproduzido da mesma forma em outros dispositivos sem a necessidade de sincronia.
Senha da carteira
Sempre configure a sua carteira com uma senha de difícil dedução. A carteira é um arquivo que fica no dispositivo e esse arquivo contém a chave privada que permite transferir os recursos. Se o atacante tiver acesso a uma carteira com senha será mais difícil acessar os recursos.
3.6. Use 2FA em tudo
O segundo fator de autenticação (2FA) aumenta consideravelmente a proteção de credenciais de login. É chamado de segundo fator porque o primeiro geralmente é o que você sabe (senha). Outros fatores são o que você tem (um token OTP como esse) e quem você é (autenticação biométrica). OTP significa One-Time Password e tem esse nome porque um novo número é gerado a cada 30 segundos. Saber o número anterior não aumenta as chances de prever o próximo. O uso do OTP faz com que o atacante precise acertar a senha e esse número em uma janela de 30 segundos, o que torna virtualmente impossível o login não autorizado. Nunca divulgue o seed, que geralmente tem 16 caracteres (ou o QR code) e é usado para configurar o app no celular, mas faça backup caso precisa reinstalar em outro dispositivo.
Nunca confie na segurança de um site. Alguns sites armazenam senhas em texto claro (ou seja, sem criptografia, o que permite acesso ao atacante em caso de invasão), outros existem para coletar usuários e senhas e tentar roubar informações do usuário em outros sites. Não use a mesma senha em vários sites, mesmo com 2FA.
Os aplicativos 2FA mais usados são Authy e Google Authenticator, que disponibiliza no Github o código fonte.
3.7. Desabilite o Javascript
Muitos ataques ao browser dependem de Javascript. Desabilitar completamente o Javascript fará com que quase todos os sites deixem de funcionar. Uma solução intermediária é a instalação da extensão ScriptSafe disponível para Firefox e Chrome. Nela é possível bloquear e permitir (blacklist e whilelist) sites e tags que podem ter Javascript executado. Leva um certo tempo até ir desbloqueando apenas as necessárias e que fazem os sites funcionar, além de aprender quais são os Javascripts relacionados aos trackers, mas depois é possível exportar a lista e importar em outros dispositivos.
3.8. Habilite bloqueio de anúncios (Ads)
Anúncios são pedaços de HTML com Javascript vindos de fontes não confiáveis. Muitas vezes são usados para violar a privacidade dos usuários (trackers) e podem carregar no browser Javascript duvidoso. Uma extensão que pode ser usada para bloquear anúncios é a uBlock.
3.9. Não clique em tudo que vê pela frente
Sempre que acessar um site verifique o endereço no browser para garantir que não está acessando um site falso. É necessário ter cuidado também com os anúncios que aparecem no mecanismo de busca, como o Google. Muitas vezes o atacante paga um anúncio para que o site falso apareça em primeiro lugar. Esse site falso geralmente possui um endereço muito parecido com o original e sua estrutura é uma cópia fiel do original. O objetivo é capturar login e senha dos usuários que serão usados no site original, como exchanges, por exemplo. Veja o 2FA em 3.6.
Importante: Não existe essa história de “eu só vou entrar, não vou clicar em nada”. Basta abrir uma página qualquer de um site para que seu código, incluindo Javascript, seja carregado no seu browser.
Short URLs
Antes de clicar em uma URL “encurtada” use um serviço como o Unshorten.it para saber qual URL foi encurtada e para onde você será levado. Esse é um dos sites que dependem de Javascript.
3.10. Use HTTPS em tudo
Quando for enviar informações sensíveis como login e senha, verifique se o cadeado (https) está presente na barra de endereços. HTTPS Everywhere é uma extensão para Firefox, Chrome e Opera que força conexões criptografadas com os maiores sites, evitando que alguns objetos sejam carregados por fora da conexão criptografada, o que pode inclusive divulgar o verdadeiro endereço IP de um usuário.
3.11. Desabilite extensões de browser
Extensões de browser conseguem ler e alterar as informações digitadas pelo usuário, como senhas, por exemplo. Desabilite todas as extensões e mantenha apenas as necessárias e confiáveis.
3.12. Instale somente os aplicativos e serviços necessários
Cada novo aplicativo ou serviço instalado amplia a superfície de ataque de um dispositivo. Novos aplicativos trazem novas vulnerabilidades, novas portas abertas, novas configurações (que precisam ser ajustadas) e novas dependências de outras bibliotecas. Tudo isso aumenta a probabilidade de um ataque ser bem sucedido e também o esforço administrativo para manter o ambiente atualizado e seguro.
3.13. Use apenas aplicativos confiáveis, de fontes confiáveis
De uma forma geral, a recomendação é baixar aplicativos apenas do site do fabricante ou desenvolvedor (ou indicados por eles). No caso de carteiras de moedas digitais o importante é que o aplicativo seja seguro em primeiro lugar e funcional em segundo. Veja se a carteira fornecida pelo desenvolvedor é código aberto e se atende às suas necessidades. Provavelmente será a melhor escolha.
3.14. Verifique a assinatura digital
Antes de instalar ou usar qualquer aplicativo verifique sua assinatura digital.
3.15. Reinicie o processo do browser
Inicie um novo browser, sem guias abertas, antes de fazer qualquer coisa relacionada a criptocurrencies. Isso não é a mesma coisa que abrir uma nova janela. O processo (executável) deve ser fechado e aberto novamente. O objetivo é evitar que códigos maliciosos carregados através de algum site e atrelados ao processo do browser estejam em execução no momento do acesso aos sites de exchanges, por exemplo. Quando terminar, feche o browser (processo) e inicie outro para outras atividades.
3.16. Habilite o isolamento de processos e contextos de segurança
Se você usa o Google Chrome habilite o isolamento de processos. Cada site aberto será carregado no seu próprio executável na memória, isolado dos dados de outros sites carregados por outros processos. Veja mais aqui.
Se você usa o Firefox não é necessário fazer nada. As versões mais novas já possuem o isolamento de processos por padrão. Você pode verificar isso seguindo as instruções em Electrolysis e pode se informar mais sobre o Sandbox.
Contextos de segurança
Usuários do Firefox podem habilitar a segregação em contextos de segurança, que lembra a virtualização do Qubes OS. Essa segregação de contextos dá mais controle ao usuário sobre os dados que os sites podem acessar (ex: cookies, localStorage, indexedDB, etc).
3.17. Instale um antivírus
Em algum momento um usuário comum se comportará como um usuário comum. Assim, é melhor ter algum antivírus instalado. Se esse usuário não roda executáveis aleatórios não confiáveis não há necessidade.
Yep, but the context here is "how to not get hacked" guides. If you're not running random untrusted executables, then antivirus is a liability. If you are running untrusted exes, then you're gonna get hacked.
— Tavis Ormandy (@taviso) November 16, 2017
3.18. Criptografe todo o disco
Criptografar todo o disco reduz a ameaça de acesso físico não autorizado. Se o dispositivo não será transportado e o acesso físico não autorizado ao seu ambiente não será considerado, essa não deve ser a maior preocupação. No entanto é preciso notar que, enquanto no Mac é possível habilitar a criptografia a qualquer momento, no Linux é necessário particionar o disco com esse suporte ANTES de instalar o sistema ou copiar os dados. Ou seja, inclua segurança no design, seja pró-ativo.
- Mac, Filevault2: https://support.apple.com/en-us/HT204837
- Debian, LUKS: https://xo.tc/setting-up-full-disk-encryption-on-debian-jessie.html
- Microsoft, Bitlocker: https://docs.microsoft.com/en-us/windows/device-security/bitlocker/bitlocker-overview
O disco de backup pode ser criptografado usando uma solução como Veracrypt.
3.19. Faça backup
Fazer backup é uma recomendação geral de segurança da informação. O problema é que a restauração não é preventiva, é corretiva. Isso significa que depois que o atacante acessar a sua chave privada ou seed já não há mais nada que possa ser feito. Assim, enquanto o backup serve para resolver muitos problemas, a segurança da carteira precisa ser totalmente preventiva. Lembre-se: sempre faça backup da seed da carteira para um papel de pão, a chamada “paper wallet”.
Fazer backup (cópia de segurança) não significa mover todos os arquivos para um pendrive ou HD externo. Significa manter uma cópia dos arquivos em outro local, desconectado da Internet. É preciso que o arquivo exista em pelo menos dois lugares ao mesmo tempo.
O backup deve ser feito preferencialmente com o dispositivo desconectado da Internet, para reduzir o risco de um ransomware criptografar o disco principal e o de backup. Um ransomware é um código malicioso que criptografa todos os arquivos do dispositivo e exige o pagamento de um resgate para que o usuário receba a chave para obter seus arquivos de volta. Geralmente esse resgate deve ser pago em Bitcoin ou outra criptomoeda e não há nenhuma garantia de que o usuário conseguirá acessar seus arquivos novamente.
3.20. Use um sistema criado para ser (razoavelmente) seguro
Os mais paranóicos podem experimentar o Qubes OS e o Subgraph, dois sistemas operacionais Linux orientados à segurança.
4. Recuperação
Se você suspeita que há algo errado com o seu sistema a única recomendação segura é: reinstale do zero (a partir da mídia de instalação, não a partir de um backup do sistema que já pode estar infectado). Não há software, técnica ou antivírus capaz de garantir que qualquer código malicioso que possa ter sido instalado no sistema foi removido. Isso acontece porque há muitos códigos maliciosos que ainda não foram identificados pelas empresas de segurança ou simplesmente porque não se pode garantir que se conhece 100% do seu funcionamento, ou seja, identificar todas as modificações feitas no sistema operacional pelo código.
Durante essa reinstalação procure não cometer os mesmos erros de antes para não reproduzir o mesmo estado de insegurança. Se fizer sempre as mesmas coisas obterá os mesmos resultados.
Além da reinstalação, caso o usuário suspeite de acesso indevido deve também criar uma nova carteira e transferir para ela todos os seus recursos da carteira antiga. Assim evita o risco de o atacante ter acesso a carteira que contém os recursos, com ou sem senha.