"Quando a cobertura preta foi arrancada por um momento, Margarita se virou e viu que não havia apenas torres multicoloridas com um avião se desenrolando acima delas, mas também não havia nenhuma cidade que caísse no chão e deixasse apenas neblina".
M.A. Bulgakov
"Mestre e Margarita"Olá Habr! Provavelmente quase todas as organizações russas têm esses produtos em uma alegre coloração multicolorida. Estamos falando de produtos e software JaCarta para eles. Essa felicidade caiu sobre mim também, e eu decidi expandir um pouco a capa preta escondendo sua essência, ou API. Alguns bancos, especialmente emitindo tokens JaCarta GOST-2 para seus clientes, exigem a instalação do aplicativo JC-WebClient da Aladdin R.D. para funcionar.
Embora não haja uma nova distribuição no site oficial do desenvolvedor (na seção Demo, você pode baixar uma versão mais antiga, mas usa a API desatualizada), a distribuição pode ser encontrada usando o Google na linha "JC-WebClient-4.0.0.1186" nos sites da RB.
Depois de instalar o aplicativo no computador do usuário, a porta 24738 é aberta na qual esse cliente trabalha.
https://localhost:24738/JCWebClient.js
O site do desenvolvedor descreve abertamente e em detalhes a API desse aplicativo (bem como as funções de trabalhar com o sistema de arquivos de toda a linha de tokens deste fabricante por meio do jcFS.dll, que faz parte do pacote de instalação do "JaCarta Single Client") e, em última análise, usando várias funções, você pode assine a assinatura digital do token com qualquer coisa, escolha um código PIN ou bloqueie o token com tentativas sem êxito de inseri-lo. E tudo isso remotamente via Internet.
Não é segredo que os usuários costumam deixar o código PIN padrão para o token, ou aquele com o qual o receberam (geralmente têm medo de que, ao alterar o código PIN, tudo pare de funcionar).
Na maioria das vezes, são usados códigos PIN do tipo 123456 e o token é inserido na porta do computador ou no hub usb durante o dia útil ou mesmo ininterruptamente.
Graças ao JC-WebClient, se você enviar uma página da Web ou um email com JavaScript simples para esse usuário, você poderá, embora não obtenha as chaves do token (em alguns casos, isso é possível apenas acessando diretamente o sistema de arquivos do token,
um exemplo já foi fornecido ), mas tente pegue um código PIN, assine qualquer dado e envie-o para algum lugar.
No caso de 10 tentativas malsucedidas de iterar, o token é bloqueado e com que frequência isso acontece, se o código PIN do administrador para desbloqueio não estiver definido, apenas a inicialização ajudará. E isso não é pago com impostos a prazo (e, como resultado de juros e até mesmo bloqueando a conta tributária da organização do imposto), a perda dos fornecedores, em geral, o bem não é suficiente.

O problema de enumerar o código PIN pode ser resolvido tornando-o possível inseri-lo apenas na janela da interface do JC-WebClient ou como uma meia-medida, por exemplo, no caso de três tentativas malsucedidas de inseri-lo, bloquear uma autorização adicional exibindo uma mensagem para o usuário e esperar até ele confirmará suas ações.
Eu escrevi um pequeno script de teste que mostra essa vulnerabilidade. O script funciona em todos os navegadores modernos e relativamente modernos, mesmo no IE :)
Naturalmente, ele não envia nada para lugar algum, mas simplesmente exibe os resultados de uma sequência de funções.
O script implementa uma enumeração completa de 10 tentativas de inserir o código PIN para "matar" o token, para que você possa executar o script apenas com um token de teste!
Também deve ser lembrado que o uso desse script, exceto em seu próprio token de teste, é uma violação da lei.
Resultado do teste:

O script gera um par de chaves e um certificado usando o JC-WebClient para teste.
Você pode usar o EToken PRO Java 72 K, JaCarta GOST, JaCarta GOST-2. O token deve ser pré-inicializado com o PIN do usuário 111111.
Antes de iniciar o teste, você deve instalar o JC-WebClient versão 4 ou posterior.
E, na verdade, o próprio script de auditoria de segurança:
→
Fonte de informações da API do JC-WebClient