Chave de criptografia de hardware de US $ 3 - isso é possível?


O resultado final é uma chave do tamanho de uma unidade flash

USB.A criptografia generalizada e, como resultado, uma abundância de chaves fazem você pensar sobre o armazenamento confiável. O armazenamento de chaves em dispositivos externos, de onde eles não podem ser copiados, há muito é considerado uma boa prática. Vou falar sobre como fazer esse dispositivo por US $ 3 e 2 horas.

O que a imagem significa?
. . : « — , … , ...». , , )

Brevemente sobre os princípios do trabalho


A criptografia nos dá a oportunidade de ocultar o que queremos enviar, para garantir que nos comuniquemos com quem pensamos e muitas outras coisas interessantes. Geralmente, para que tudo isso funcione bem, eles nos pedem apenas uma coisa: manter nossas chaves de criptografia em segredo . Parece fácil, não é? Bem, vamos ver como podemos esconder nossas chaves:

  • Salvar em um arquivo na área de trabalho é uma maneira antiga e comprovada de gravar algo ao longo dos anos. O problema é que, além do próprio usuário, vários outros programas têm acesso aos arquivos na área de trabalho. E se você tiver certeza absoluta de que todos fazem o que se destinam, não colete nenhum dado sobre você e simplesmente não os junte à rede - este artigo não é para você.
  • — - , . , , , - -
  • — , . , . , . , ( ssh-) .

Como você pode ver, o principal problema é que as teclas são armazenadas diretamente no seu computador ou inseridas lá usando um teclado, unidade flash etc. Mas, você se opõe, como então meu computador criptografará os dados se não souber a chave? A resposta correta não é possível. A solução já foi inventada. A idéia principal é conectar um dispositivo especial ao computador, que criptografará os dados. E o computador envia apenas dados e recebe o resultado. Assim, por exemplo, muitos cartões inteligentes funcionam.



Componentes Necessários


Então vamos começar. Montaremos nosso dispositivo em um microcontrolador barato e bastante popular da série STM32. Claro, você mesmo pode fazer uma placa de circuito impresso , mas queremos administrá-lo em 2 horas? Então, vamos dar uma solução pronta - o programador ST-Link v2. Este dispositivo tem esta aparência.



Curiosamente, o programador dos microcontroladores STM32 é montado no microcontrolador STM32. Este dispositivo se parece muito com uma unidade flash, que é exatamente o que podemos fazer. Além disso, seu corpo é feito de alumínio, então você não pode se preocupar com o dano. Custa um milagre para aliexpress 1.5-3 dólares. Vamos precisar de duas dessas coisas. Vamos refazer um deles, chave na mão, e usaremos o segundo para carregar o firmware no primeiro. Se você já possui um programador STM32, pode fazer uma coisa.

Total, precisamos de:

  • Programador ST-Link v2 - 2 peças
  • Ferro de solda
  • Poucos fios - como regra, os fios adequados já estão incluídos no ST-Link
  • Linux, para compilar e fazer upload de firmware

Compile o firmware


Então, vamos começar com a parte do software - montando o firmware da nossa chave. Os códigos-fonte do firmware podem ser encontrados neste repositório . Sugiro que baixe a versão estável mais recente (você pode encontrá-la na guia "Tags"). Você pode clonar o repositório ou fazer o download como um arquivo zip. Amassar os dedos, inicie o terminal e vá para a pasta do projeto. Vá para a pasta src

$ cd src

Para compilar e baixar o firmware, precisamos instalar vários pacotes:

  • arm-none-eabi-gcc
  • arm-none-eabi-newlib
  • openocd

Eu uso o gerenciador de pacotes pacman, no meu caso, fica assim


$ sudo pacman -S arm-none-eabi-gcc
$ sudo pacman -S arm-none-eabi-newlib
$ sudo pacman -S openocd

Se você está sentado no Ubuntu - use o apt.

Deixe-me lembrá-lo de que estamos na pasta src do projeto.
Execute o script de configuração

$ ./configure --vidpid=234b:0000

Executamos o utilitário make e observamos como nosso firmware é compilado.

$ make

Após a compilação, a pasta de compilação aparece e nela o arquivo gnuk.elf - precisamos dela.

Faça o download do firmware para o dispositivo


Agora que temos o arquivo finalizado com o firmware, precisamos apenas fazer o download para o dispositivo. Para isso, temos que trabalhar um pouco com um ferro de soldar. Não se preocupe, você não precisa de habilidades especiais, apenas solde 4 fios.

Então, pegamos um dos programadores e retiramos o caso dele. O programador selecionado será nosso doador. Aqui está o que encontramos lá dentro:



preste atenção aos 4 pinos na placa. Nós precisaremos soldar a eles. Eu recomendo usar os fios que acompanham o ST-Link para isso. Limpamos os fios de uma extremidade e os soldamos nos contatos. Se tivermos sorte, no quadro haverá sinais desses contatos.

"

Agora, conectamos a segunda extremidade dos fios ao programador restante. Se você tiver sorte, basta conectar os fios de acordo com as inscrições:

GND para GND
3.3V a 3.3V
SWDIO para SWDIO
SWCLK para SWCLK

Se não houver etiquetas na placa, você deverá puxar aleatoriamente para usar o testador. Usando-o, você pode encontrar facilmente o GND (ele está conectado ao GND nos terminais do programador doador), semelhante ao 3.3V. Os dois fios restantes deverão ser conectados aleatoriamente. Felizmente, existem apenas duas opções.Como resultado, obtemos algo semelhante a



este.Nesta foto, o dispositivo azul é o programador, que usamos apenas como programador. Não se confunda com o fato de que na foto no início do artigo, o dispositivo final tem uma cor azul do corpo. Não é ele. O futuro dispositivo está à direita.

Download do firmware


Estamos a um passo do sucesso, resta apenas fazer o download do firmware. Abra o terminal, vá para a pasta com o nosso firmware (gnuk.elf).

Execute o comando:

$ openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c 'program build/gnuk.elf verify reset exit'

Então, agora carregamos o firmware para o nosso dispositivo. Ainda havia um passo - proibir a leitura da memória do microcontrolador. ATENÇÃO! Esse é um estágio muito importante, que não permitirá que a pessoa que roubou sua chave extraia dela informações secretas.

Para fazer isso, execute o comando:

openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c init -c "reset halt" -c "stm32f1x lock 0" -c reset -c exit   

Agora está tudo pronto.

Colocando tudo de volta


Agora que todas as etapas estão atrasadas, resta cuidar da aparência do nosso dispositivo. Soldamos os fios. Também não precisamos mais da barra de contato original, para que você possa dessoldá-la com segurança.



Quebre a montagem e solde os contatos, um de cada vez.



Agora recolocamos o estojo e selamos a parede traseira com um pedaço de plástico adequado.

Como posso usar


O que montamos é um emulador de cartão inteligente OpenPGP . Esse cartão pode armazenar chaves GPG e SSH. O escopo é bastante amplo, por exemplo:

  • Assinando git commits - um problema de segurança já foi levantado aqui
  • Armazenamento de chaves SSH
  • Criptografia e assinatura de email S / MIME - não verificou, mas eles escrevem que funciona
  • Como entrar no sistema operacional sem senha - um bom guia já está no hub

Como você pode ver, você pode fazer muitas coisas interessantes e úteis.

Exemplo de uso para ssh


E no final, vamos ver como você pode usar essa chave para armazenar chaves ssh e conectar-se a um servidor remoto.

Existem duas maneiras - gerar uma nova chave ou importar uma chave existente em um token.

Vamos ver as duas opções. Nós inserimos o token no USB. No dmesg, você pode ver informações sobre o dispositivo conectado.


$ dmesg
[11073.599862] usb 1-3: USB disconnect, device number 11
[11311.647551] usb 1-3: new full-speed USB device number 12 using xhci_hcd
[11311.796881] usb 1-3: New USB device found, idVendor=234b, idProduct=0000, bcdDevice= 2.00
[11311.796884] usb 1-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[11311.796885] usb 1-3: Product: Gnuk Token
[11311.796887] usb 1-3: Manufacturer: Free Software Initiative of Japan

Nova geração de chaves ssh


É importante entender que a chave é gerada no próprio dispositivo , e não no seu computador. Portanto, essa chave nunca sai do dispositivo.

Vá para o gpg:


$ gpg --card-edit

O modo interativo gpg é aberto, ative o modo admin com o comando admin:


gpg/card> admin

Em seguida, execute o novo comando de geração de chave:


gpg/card> generate

A seguir, é apresentado o procedimento padrão de geração de chave gpg. Durante o qual você será solicitado a salvar a chave de backup em disco. Os desenvolvedores recomendam fazer backups, mas você decide.
A única coisa é que a geração de hardware de chaves RSA de até 2048 bits é suportada. Se você precisar do 4096, precisará gerar a chave no computador e importá-la para o próprio dispositivo.
Em seguida, você precisará de códigos PIN. Por padrão, os seguintes códigos PIN estão protegidos no firmware:

PIN DO CARTÃO - 123456
PIN ADMIN - 12345678

No futuro, eles devem ser alterados.

A chave pode ser gerada um pouco mais do que se fosse gerada diretamente no computador, por isso temos um pouco de paciência.

Importar uma chave existente


Agora vamos ver o que fazer se você já tiver uma chave ssh que gostaria de usar.
Para fazer isso, importe a chave no gpg:


$ pem2openpgp temporary_id < id_rsa  | gpg --import

Agora precisamos descobrir o ID da chave. Para fazer isso, liste todos os disponíveis em gpg:


$ gpg -K

E encontramos a chave importada:


sec>  rsa2048 2020-02-05 [C]
      DFEFF02E226560B7F5A5F2CAB19534F88F8FE4EC
      Card serial no. = FFFE 87144751
uid           [ unknown] temporary_id


No meu caso, o ID da chave é DFEFF02E226560B7F5A5F2CAB19534F88F8FE4EC

Vá para o modo interativo para editar a chave gpg:


$ gpg --edit-key DFEFF02E226560B7F5A5F2CAB19534F88F8FE4EC

E damos o comando para copiar a chave do cartão inteligente:


gpg> keytocard

Tudo, a chave é gravada.

Exportar chave pública no formato ssh


Obtemos a chave pública desejada do token para colocá-la no servidor:

$ pkcs15-tool --list-keys

No meu caso, a saída é assim:


Using reader with a card: Free Software Initiative of Japan Gnuk (FSIJ-1.2.15-87144751) 00 00
Private RSA Key [Signature key]
	Object Flags   : [0x03], private, modifiable
	Usage          : [0x20C], sign, signRecover, nonRepudiation
	Access Flags   : [0x1D], sensitive, alwaysSensitive, neverExtract, local
	ModLength      : 2048
	Key ref        : 0 (0x00)
	Native         : yes
	Auth ID        : 01
	ID             : 01
	MD:guid        : f3de5f55-d100-4973-d572-40d67e20f033

Aqui estamos interessados ​​na chave de identificação da chave, no meu caso 01. Agora exportamos a chave pública:


$ pkcs15-tool --read-public-key 01

Copie a chave pública no arquivo pub.key:


-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyzHQIWEApliWYaf0T8jb
Vh2nc5+LklKXeuJFTN3BW2VqdrTw1rpKXiANWpi+qbtZhZ2nP3CJX6qoGobXyCOd
/iAiygFlyW4BwTQpnAm81IE9lPzfasOK7SBuKJ+ZbB4WpuYJRozgtt/gpWzmnWnW
84/CU9Lqbhz95v/C/DImSf6LiwVdmiEj4CUNInl5pY4trguDsSfkw1u8gGqSPEsD
ZXtlVRx8iBGi0JR02g9KTL4dDGocUtcTK8W0eY+BDbQSXfTGCy93v8sEyhdQjHs8
oDiwkvFQ86gYqwL5DJ7U/rFSO3A5X6zmkFFV8nJZjxB2qfE5aommtXxow4iPml3x
YwIDAQAB
-----END PUBLIC KEY-----

E converta-o para o formato ssh-rsa:


$ ssh-keygen -f pub.key -i -mPKCS8 

Acontece que a chave pública no formato desejado:


ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDLMdAhYQCmWJZhp/RPyNtWHadzn4uSUpd64kVM3cFbZWp2tPDWukpeIA1amL6pu1mFnac/cIlfqqgahtfII53+ICLKAWXJbgHBNCmcCbzUgT2U/N9qw4rtIG4on5lsHham5glGjOC23+ClbOadadbzj8JT0upuHP3m/8L8MiZJ/ouLBV2aISPgJQ0ieXmlji2uC4OxJ+TDW7yAapI8SwNle2VVHHyIEaLQlHTaD0pMvh0MahxS1xMrxbR5j4ENtBJd9MYLL3e/ywTKF1CMezygOLCS8VDzqBirAvkMntT+sVI7cDlfrOaQUVXyclmPEHap8Tlqiaa1fGjDiI+aXfFj

A seguir, é apresentado o procedimento padrão para configurar o ssh para efetuar logon com uma determinada chave - você precisa adicionar a chave ao arquivo ~ / .ssh / allowed_keys no servidor remoto.

Configuração ssh


Agora, para entrar no servidor usando nosso token, você precisa chamar ssh com a opção -I e passar o caminho para o driver do token. Nosso token é compatível com um dos drivers padrão, então vamos usá-lo

$ ssh -I /usr/lib/opensc-pkcs11.so martin@remotehost

No entanto, será mais conveniente usar o arquivo de configuração (~ / .ssh / config)
Adicione as seguintes linhas a ele.

Host digitalOceanServer
        HostName 192.168.0.1
        User root
        PKCS11Provider /usr/lib/opensc-pkcs11.so

A chamada ssh agora é ainda mais fácil:


$ ssh digitalOceanServer

Como alterar códigos PIN padrão


Um passo igualmente importante será instalar seus próprios códigos PIN. Primeiro, você precisa entender que existem dois códigos PIN diferentes usados:

  • Código PIN - esse código é usado para operações de rotina com um cartão inteligente - para criptografar algo, assinar etc.
  • Código PIN do administrador - esse código é necessário para alterar / excluir chaves e executar todos os tipos de tarefas "administrativas"
  • Redefinir código - um código que permitirá desbloquear o token após três tentativas incorretas de inserir o código PIN. Seu uso é opcional, então cabe a você

Você tem apenas 3 tentativas para cada um dos códigos. Após o qual o token é bloqueado.

Agora vamos começar. Para fazer isso, entramos novamente no modo GPG interativo:


$ gpg --card-edit

E digite o comando passwd:


gpg/card> passwd

Uma janela será aberta, onde você poderá alterar o código PIN do token.

Agora você precisa alterar o PIN do administrador. Para fazer isso, vá para o modo administrador:


gpg/card> admin

Digite o comando passwd novamente:


gpg/card> passwd

No entanto, agora ele funciona no modo avançado e ofereceremos várias opções:


1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit

Your selection?

Selecionamos alterar PIN do administrador e definimos a senha do administrador de acordo com o esquema padrão. Deixe-me lembrá-lo de que o PIN do administrador padrão é 12345678.

Sobre a segurança do dispositivo


Obviamente, por US $ 3, você não pode obter uma segurança de nível chave por mais de 200 dólares. No entanto, o dispositivo montado pode ser considerado uma chave de nível de entrada. Tanto quanto eu sei, as chaves de fábrica do Nitrokey Start usam o mesmo firmware. De qualquer forma, o uso desse dispositivo aumentará a segurança em pelo menos um nível superior. Portanto, essa é uma ótima maneira de começar a usar chaves de hardware.

Agora vamos falar um pouco sobre o que acontecerá se você perder essa chave. A chave em si é protegida por um código PIN. Após várias tentativas malsucedidas, a chave está bloqueada. A memória do dispositivo em si é protegida contra leitura, portanto, não funcionará diretamente para ler as chaves escritas nele.
Existem alguns tipos de ataques ao próprio chip (por exemplo, a preparação e conexão de microeletrodos, que permitem medir a tensão em qualquer lugar do chip, incluindo memória), mas eles são muito caros.

Então, repito mais uma vez, esta é uma ótima opção de nível de entrada e, mesmo com ela, a segurança atingirá um nível totalmente novo.

Links para materiais úteis


No processo de uso do dispositivo, certamente haverá necessidade de informações adicionais. Eu montei uma lista de boas fontes.


O dispositivo que montamos está sendo desenvolvido pelo projeto GNUK de código aberto (na verdade, é chamado de token), para que mais informações possam ser encontradas no Google a pedido do "GNUK".

Upd. Os comentários sugeriram que há firmware que permite usar o dispositivo para autenticação de dois fatores. O código do firmware pode ser encontrado aqui
Upd. 2 15/02/2020 Os comentários sugeriram que, para esse chip em particular, existe uma vulnerabilidade que pode drenar o conteúdo da memória. Pelo que entendi, ainda não foi publicado, mas foi anunciado. Então, por enquanto, nem tudo está claro. Eles também sugeriram uma boa solução - despeje epóxi no corpo do dispositivomisturado com pó de alumínio. Este método foi descrito no livro de Kevin Mitnick, "The Art of Deception". Assim, para obter acesso ao chip, será necessário quebrar a cola, que, se for manuseada sem cuidado, pode danificar permanentemente o chip. Obviamente, esse método pode ser contornado, isso aumenta ainda mais o custo dos hackers. É claro que, se necessário, o Mossad fará as coisas do Mossad e isso não o impedirá, mas apenas o atrasará.
Upd. 3Muitas mensagens chegaram ao PM dizendo que as pessoas não podem obter o firmware ST-Link. Depois de descobrir isso, descobrimos que agora os fabricantes chineses começaram a economizar ativamente em componentes e a usar chips com 64Kb de memória a bordo. E isso não é suficiente para o firmware, procure um chip de 128Kb a bordo. Portanto, recomendo que, ao comprar, verifique qual chip está instalado (se possível) ou verifique com o vendedor / nos comentários.
Upd. 4 Acontece que você ainda pode usar programadores chineses com um chip de 64 KB (embora você precise usar a versão mais recente do firmware) - um artigo interessante sobre isso apareceu no hub .

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


All Articles