@Dusk $DUSK

Achei que uma prova de conhecimento zero ou verifica tudo ou não verifica nada. nenhuma confiança parcial. descobri que o próprio código de provas do Dusk deixou quatro números completamente sem verificação, e isso foi suficiente para criar dinheiro a partir de uma prova inválida.

quando eu olhei isso pela primeira vez, eu literalmente pensei que uma prova forjada exigiria quebrar criptografia real. a falha real era bem mais simples do que isso.

é por isso. cada transação protegida (shielded) do Dusk carrega uma prova, e essa prova precisa convencer a rede de coisas como propriedade, saldos corretos e entradas válidas. quase todo número dentro dessa prova fica bloqueado, amarrado a um compromisso confiável para que o provador não consiga simplesmente mentir sobre isso. mas quatro números específicos, ligados à forma como a lógica da transação é verificada, nunca foram restringidos dessa maneira. eles existiam na prova, foram usados na matemática final, mas ninguém nunca os verificou em relação aos valores que deveriam representar.

assim, um provador malicioso poderia resolver diretamente os valores ausentes. uma divisão. é só isso. pesquisadores de segurança demonstraram o problema contra um nó do Dusk, criando 2000 DUSK do nada e enviando 1337 para uma carteira normal por meio de uma transação comum. o nó aceitou ambos como válidos.

o que deixou isso ainda mais difícil para mim é que o código do Dusk já havia passado por três auditorias separadas antes de isso ser descoberto.

a mesma concepção que torna as provas de conhecimento zero poderosas — confiar em um único veredito final em vez de você mesmo rechecá-lo de cada afirmação — foi exatamente o que permitiu que quatro números não restringidos ficassem escondidos à vista por tanto tempo.

a correção foi aplicada no Dusk em um dia após serem notificados, mas um bug quase idêntico foi descoberto de forma independente no sistema de provas de outro time na mesma época. se duas implementações não relacionadas lançaram o mesmo ponto cego, não sei quantos outros ainda estão lá, sem serem encontrados.

#dusk $TUT $ZRO
#zkProofs