Divergência de estado permite acesso não autorizado

Tradução automática do conteúdo disponibilizado no feed de Trail of Bits. Original: https://blog.trailofbits.com/2026/08/25/state-divergence-enables-unauthorized-access/

Encontramos e reportamos um bug no Provenance Blockchain, uma cadeia pública proof-of-stake construída sobre o Cosmos SDK, que permitia que qualquer usuário concedesse a si mesmo controle administrativo sobre contas de marcadores sem possuir um único token. O problema afetava as versões anteriores à 1.28.0. Foi mitigado no PR #2627 (commit c81fd65), lançado na v1.28.0 em 1º de maio de 2026, e corrigido no PR #2734, lançado na v1.29.0 em 8 de junho de 2026.

A causa era uma divergência de estado: para marcadores de oferta não fixa, o campo de oferta armazenado permanecia em zero, enquanto a oferta circulante real era mantida no módulo bancário. A verificação comparava o campo obsoleto com o saldo do solicitante; quando ambos eram zero, qualquer usuário passava na autorização.

O atacante podia enviar uma transação MsgAddAccessRequest para conceder a si mesmo permissões ACCESS_ADMIN, ACCESS_MINT e ACCESS_WITHDRAW. Em seguida, podia usar MsgMintRequest para criar tokens ou MsgWithdrawRequest para retirar ativos mantidos no saldo de custódia do marcador.

No momento da descoberta, 82 marcadores ativos na rede principal eram exploráveis. Entre eles havia marcadores com ativos em custódia, incluindo aproximadamente 30 × 10 15 nhash, ou cerca de US$ 500.000 aos preços do HASH na época da descoberta.

O PR #2627 adicionou uma proteção contra oferta zero. O PR #2734 corrigiu completamente o problema ao substituir `m.GetSupply()` por `k.bankKeeper.GetSupply(ctx, m.GetDenom())`, fazendo a comparação usar a oferta circulante real do módulo bancário. A correção também impede a autorização quando a oferta é zero.