Agentes de IA que pagavam chamadas de API com os SDKs x402 podiam assinar pagamentos no valor de todo o saldo de um token compatível caso uma API maliciosa solicitasse isso, informou a empresa de segurança V12 em 22/10.
A causa era o cliente padrão dos SDKs, que não definia um limite de gastos. Esse controle foi incluído em versões lançadas em 18/08. O risco se restringia a agentes que assinavam pagamentos automaticamente e a aplicativos sem limites próprios.
A ausência de um limite é uma das 25 falhas encontradas pela V12 no código do x402 e uma das três que a empresa classificou como críticas e detalhou. A x402 Foundation, responsável pela manutenção dos SDKs, já havia corrigido as três falhas críticas nas versões de 18/08.
Uma das outras duas falhas permitia que um facilitador, serviço que verifica pagamentos x402, aceitasse como pagamento válido uma transação Solana que não transferia tokens. Entre os SDKs x402, apenas o de TypeScript tinha esse problema. A outra falha permitia que um servidor malicioso induzisse um agente a assinar uma mensagem de autenticação destinada a outro site.
A V12 encontrou as falhas por meio de uma revisão do código e de testes locais. Nem a empresa nem a x402 Foundation relataram publicamente ataques que as explorassem.
A fundação não publicou avisos de segurança sobre as três falhas, e os registros de alterações mencionam as correções sem identificá-las como medidas de segurança. Em 23/10, o comando npm audit não apontava avisos para as últimas versões de TypeScript anteriores às correções. O PyPI também não listava vulnerabilidades na última versão de Python lançada antes delas, segundo apuração do The Hacker News. Assim, desenvolvedores que dependessem dessas verificações não receberiam um alerta para atualizar os pacotes.
A Coinbase criou o x402 e o transferiu neste ano para a x402 Foundation, um projeto da Linux Foundation que tem Visa e Mastercard entre seus membros. A Coinbase ocupa o cargo mais alto no comitê técnico de direção da fundação.
Cliente padrão não tinha limite de gastos
O x402 é um padrão aberto que permite a softwares, inclusive agentes de IA, pagar por uma chamada de API dentro da própria solicitação HTTP, sem exigir que uma pessoa aprove cada pagamento.
Um servidor que exige pagamento responde com o código HTTP 402, “Pagamento necessário”, e informa as opções disponíveis, cada uma com um valor, um token e um destinatário. O cliente escolhe uma opção, assina o pagamento e envia a solicitação novamente.
O cliente padrão escolhia a primeira opção da lista e, antes da correção, não limitava o valor do pagamento.
Uma API hostil poderia transformar uma solicitação rotineira de dados em um pedido de pagamento equivalente a todo o saldo da carteira em um token compatível, afirmou a V12. Um pagamento pequeno feito anteriormente poderia revelar o endereço da carteira, permitindo que o servidor consultasse o saldo.
Se o agente usasse um assinador automático e o aplicativo não tivesse configurado uma política de pagamento, o cliente poderia assinar uma transação naquele valor. No caso de um token compatível com transferências assinadas, o atacante poderia então enviar o pagamento assinado à rede e receber os fundos.
As versões lançadas em 18/08 adicionaram controles de gastos aos clientes de TypeScript, Python e Go. Por padrão, agora limitam cada pagamento a US$ 1 e aceitam apenas moedas estáveis atreladas ao dólar que sejam reconhecidas pelo SDK, como USDC.
Aprovações de tokens aceitas como pagamentos Solana
No x402, o servidor do comerciante depende de um facilitador para verificar cada pagamento e enviá-lo à blockchain. Na Solana, o facilitador também paga a taxa da transação.
O código do facilitador de TypeScript para Solana verificava se o pagamento chamava um programa de token permitido, mas depois o interpretava como uma transferência sem conferir o tipo da instrução. Uma aprovação de token, que permite que outra conta gaste tokens posteriormente, mas não transfere nenhum naquele momento, difere de uma transferência apenas pelo primeiro byte.
Em um teste local da V12, o facilitador aceitou uma aprovação como pagamento válido. O teste não enviou uma transação real.
Com isso, um comerciante que dependesse do facilitador poderia entregar um recurso pago sem receber tokens, afirmou a V12, que descreveu o problema como um “contorno completo do pagamento”. O atacante precisava de uma conta de token, mas não de saldo. A cada tentativa, o facilitador pagava a taxa da transação.
Os SDKs de Python e Go já verificavam o tipo da instrução. As versões de 18/08 acrescentaram a mesma verificação ao código de TypeScript.
A apuração do The Hacker News nas versões publicadas dos pacotes constatou que todas as versões de @x402/svm entre 2.0.0 e 2.22.0 não tinham a verificação. Ela está presente em todas as versões a partir da 2.23.0.
Mensagens de autenticação assinadas para outros sites
O x402 também oferece uma extensão de autenticação chamada Sign-In-With-X (SIWx). Ela permite que um agente entre em uma conta assinando uma mensagem curta com sua carteira. Assim, por exemplo, o agente pode comprovar um pagamento anterior em vez de pagar novamente. Na Ethereum, a mensagem identifica o site, o endereço da carteira e um código de uso único.
O cliente automatizado assinava essas mensagens sem verificar se o site indicado era o mesmo ao qual havia se conectado.
Um servidor malicioso poderia obter uma nova mensagem de autenticação de outro site, repassá-la ao agente e usar a assinatura para acessar esse site como se fosse a carteira do agente, segundo a V12. Isso seria possível sempre que o outro site aceitasse a mensagem retransmitida, e o atacante obteria o acesso permitido por aquela autenticação.
As versões de 18/08 fazem com que os clientes de TypeScript, Python e Go recusem a assinatura quando o site indicado na mensagem não corresponder ao que enviou a resposta 402. O projeto também alterou a especificação SIWx, que agora determina que o cliente recuse a assinatura quando os sites forem diferentes.
O código de TypeScript que chama createSIWxPayload diretamente precisa agora receber a URL da resposta 402, após eventuais redirecionamentos. Os componentes @x402/fetch e @x402/axios fazem esse repasse automaticamente.
O que atualizar
A atualização para as versões mais recentes também inclui correções posteriores, entre elas uma para outra falha que permitia contornar pagamentos, corrigida no @x402/core 2.27.0, em setembro. Em 23/10, as versões mais recentes eram 2.28.0 para @x402/core, @x402/svm, @x402/extensions, @x402/fetch e @x402/axios; v2.28.0 para o módulo Go; e 2.25.0 para o pacote Python.
Em TypeScript, os clientes recebem a correção do limite de gastos ao atualizar @x402/fetch ou @x402/axios para a versão 2.23.0 ou posterior, que inclui a versão correspondente de @x402/core. Aplicativos que usam SIWx também precisam atualizar @x402/extensions para a versão 2.23.0 ou posterior, que contém a verificação de autenticação. Facilitadores que verificam pagamentos Solana precisam do @x402/svm 2.23.0 ou posterior.
Após a atualização, os clientes existentes ficam limitados a US$ 1 por pagamento e só podem usar moedas estáveis reconhecidas, a menos que o aplicativo configure controles próprios de gastos. Aplicativos que definem spendControls: false desativam todos esses controles.
Equipes que ainda não puderem atualizar podem registrar uma política de pagamento para rejeitar qualquer opção acima de um valor definido. Os clientes antigos oferecem esse recurso por meio de registerPolicy em TypeScript e Go e de register_policy em Python, que também inclui uma política pronta chamada max_amount.
A V12 recomenda que os clientes verifiquem se a mensagem de autenticação SIWx identifica o mesmo site ao qual se conectaram antes de assiná-la. A empresa também aconselha definir limites para cada pagamento e para o total gasto, além de restringir os tokens, as redes e os destinatários autorizados.
Publicidade
Tenha acesso aos melhores hackers éticos do mercado através de um serviço personalizado, especializado e adaptado para o seu negócio. Guardsi: qualidade, confiança e especialidade em segurança ofensiva de quem já protegeu centenas de empresas. Saiba mais...