A Vultisig atualizou as aplicações para Android e iOS em agosto para impedir novas tentativas automáticas de assinatura multipartidária quando a biblioteca de assinatura identifica um participante como malicioso. A correção, divulgada pela ChainSecurity em 21 de outubro, aborda uma falha que poderia permitir a um invasor com controlo de um dos signatários obter gradualmente a quota de chave de outro participante, através do envio de mensagens maliciosas e da análise das respostas de erro.
O problema afetava assinaturas ECDSA e evidencia um risco nas carteiras que distribuem a assinatura por vários dispositivos: a segurança depende não só da divisão da chave, mas também de a aplicação interromper a interação quando a biblioteca de assinatura dá essa instrução. Mesmo que uma tentativa falhada não produza uma transação utilizável, as respostas de erro podem revelar informação.
Respostas de erro podiam revelar uma semente do protocolo
As carteiras baseadas em computação multipartidária distribuem a capacidade de assinar por várias quotas de chave. Numa sessão normal, os participantes colaboram para gerar uma assinatura blockchain convencional sem reconstruir a chave privada completa. Numa configuração que exige dois dispositivos, um invasor que controle apenas um deles, em geral, ainda precisa da participação do outro para assinar.
O ataque descrito pela ChainSecurity parte do pressuposto de que um dos participantes já foi comprometido. O invasor poderia enviar várias mensagens de assinatura maliciosas a outro participante e observar se este devolve um erro. Segundo os investigadores, as respostas poderiam revelar aos poucos informação sobre uma semente interna reutilizável do protocolo. Com a exploração continuada, o invasor poderia obter a quota de chave do outro participante e, em última instância, reconstruir a chave privada completa.
A semente é um segredo utilizado internamente pelo protocolo. A biblioteca de assinatura partia do princípio de que, após um erro grave, a aplicação que a utiliza interromperia novas assinaturas até a semente ser substituída. As versões anteriores da aplicação não impunham essa condição: mostravam uma mensagem genérica de falha e podiam voltar a tentar assinar. A preocupação não era, portanto, que uma assinatura falhada pudesse ser transmitida para a blockchain, mas que a aplicação continuasse a comunicar com um participante que a biblioteca tinha assinalado.
Atualizações de agosto interrompem tentativas após erros de segurança
Os responsáveis pelo projeto integraram as alterações relevantes para Android e iOS em 21 de agosto, cerca de dois meses antes da divulgação pública do problema. O código anterior comparava falhas de assinatura com resultados bem-sucedidos da biblioteca, mas não tratava separadamente os erros que bloqueiam um participante malicioso. O processo podia repetir a tentativa até três vezes, enquanto o utilizador recebia uma mensagem genérica de falha. Esse limite não indica quantas mensagens seriam necessárias para obter uma chave, nem quantas sessões um ataque exigiria.
As aplicações atualizadas reconhecem os códigos de erro 100 a 109 da biblioteca de assinatura DKLS, que assinalam participantes maliciosos. Isso aplica-se a etapas como a configuração da sessão, o tratamento de mensagens e a conclusão da assinatura. Ambas as aplicações associam o participante assinalado a um identificador de dispositivo, impedem que o erro seja ocultado por novas tentativas automáticas e mostram um aviso localizado para que o utilizador não continue a usar esse dispositivo. A aplicação Android também interrompe o processo de recuperação através do relay.
A alteração distingue uma falha de assinatura comum da indicação da biblioteca criptográfica de que um participante é malicioso. Uma nova tentativa pode resolver um problema temporário, mas continuar a interação depois de a biblioteca ordenar a interrupção pode aumentar a exposição de informação.
As alterações estão documentadas no PR #5658 para Android e no PR #5235 para iOS. As notas de lançamento indicam 21 de agosto para o iOS v1.45.71 e 25 de agosto para o Android v1.0.118; ambas as versões incluem a correção.
Âmbito nas configurações de cofre continua por esclarecer
A Vultisig descreve dois modelos de assinatura. Num Fast Vault, o dispositivo do utilizador guarda uma quota e a VultiServer guarda outra; ambas participam na assinatura. Num Secure Vault, a assinatura é distribuída por dois ou mais dispositivos controlados pelo utilizador, sem depender da VultiServer. Os dois modelos recorrem a assinatura distribuída, mas têm dependências operacionais diferentes. A participação de dois intervenientes numa sessão específica não significa necessariamente que o cofre tenha apenas duas quotas.
A investigação publicada e os materiais das aplicações não apresentam uma correspondência completa entre as versões afetadas e as configurações de cofre. Assim, com a informação disponível, os utilizadores não conseguem identificar com precisão quais configurações foram afetadas nem como as atualizações abrangem as diferentes versões anteriores.
A documentação de segurança da Vultisig refere que a Trail of Bits auditou em 2024 a biblioteca DKLS23 da Silence Laboratories e que os relatórios de auditoria das aplicações móveis e de computador seriam disponibilizados após a publicação. Quando divulgou o problema, a ChainSecurity afirmou não ter analisado a correção da Vultisig nem auditado outras partes do protocolo. As alterações feitas ao nível da aplicação ficaram, por isso, fora do âmbito da sua avaliação.
Continua por esclarecer quais versões lançadas e configurações de cofre foram afetadas, bem como se a condição de paragem se aplica tanto às tentativas automáticas como ao reinício manual de uma sessão pelo utilizador. O ponto central é saber se a aplicação impõe de forma consistente a instrução da biblioteca para interromper a interação durante todo o processo de assinatura.