Este relatório analisa detalhadamente os detalhes técnicos, as causas raízes e os possíveis métodos de ataque da principal vulnerabilidade DoS existente na máquina virtual TON, ao mesmo tempo que demonstra a solução eficiente proposta pela equipe TonBit.

Recentemente, o sistema de máquinas virtuais da rede TON recebeu uma grande atualização de segurança. TonBit, uma equipe de segurança do BitsLab, descobriu e ajudou a corrigir uma vulnerabilidade central que poderia esgotar os recursos da máquina virtual TON. Esta vulnerabilidade explora o mecanismo recursivo da máquina virtual ao processar o aninhamento de continuação e pode ser abusada por contratos maliciosos, causando falhas no sistema e instabilidade na rede.

Se o exploit for maliciosamente explorado, pode causar a falha de todos os nós de validação sem consumir um único TON, ameaçando diretamente a disponibilidade da rede. Neste evento, a TonBit rapidamente localizou o exploit devido à sua excelente capacidade técnica e propôs uma solução inovadora que substitui a recursão por iteração, ajustando o mecanismo de controle interno da máquina virtual, criando um ambiente ecológico mais seguro para os usuários da TON. A equipe oficial da TON agradeceu especialmente à TonBit por suas contribuições excepcionais à segurança do ecossistema em seu mais recente comunicado de atualização.

Neste relatório de segurança detalhado, vamos analisar profundamente as causas, detalhes técnicos e soluções do presente exploit. O relatório descreve em detalhes como o exploit utiliza o aninhamento profundo da Continuação para construir uma cadeia recursiva que desencadeia um ataque de esgotamento de recursos, e como contratos maliciosos podem esgotar o espaço da pilha do host ao expandir a pilha de chamadas. Além disso, vamos apresentar como a equipe TonBit eliminou as falhas de design da cadeia recursiva, optando por um mecanismo de iteração colaborativa, ajudando a resolver completamente esse problema. Esta correção não apenas melhorou significativamente a estabilidade da rede TON, mas também forneceu uma referência importante para a segurança subjacente da indústria de blockchain.

Estudo de caso: Vulnerabilidade de DoS na TON VM e medidas de mitigação relacionadas

Introdução

Este relatório descreve uma vulnerabilidade DoS (negação de serviço) na máquina virtual TON e as medidas de mitigação para resolver esse problema. A vulnerabilidade é causada pela maneira como a máquina virtual lida com o aninhamento de Continuações durante a execução do contrato. Essa vulnerabilidade permite que contratos maliciosos criem Continuações e realizem um aninhamento profundo de uma maneira específica, acionando uma recursão profunda durante a avaliação, esgotando o espaço da pilha do host e fazendo a máquina virtual parar de funcionar. Para mitigar esse problema, a máquina virtual foi modificada na forma como lida com Continuações e fluxo de controle. Agora, a máquina virtual não realiza mais chamadas de cauda sequenciais por meio da cadeia de Continuações, mas itera ativamente sobre a cadeia. Essa abordagem garante que apenas um espaço de pilha constante do host seja utilizado, prevenindo estouros de pilha.

Resumo

De acordo com a documentação oficial, a TON VM é uma máquina virtual baseada em pilha que utiliza o Estilo de Passagem de Continuação (CPS, Continuation-Passing Style) como seu mecanismo de controle de fluxo, utilizado para processos internos e contratos inteligentes. O registrador de controle é acessível aos contratos, proporcionando flexibilidade.

A teoria da Continuação no TVM pode ser dividida em três categorias:

  • OrdCont (ou seja, vmc_std), que contém o segmento TON ASM a ser executado, é um objeto de primeiro nível no TVM. Os contratos podem criá-los explicitamente em tempo de execução e passá-los, permitindo controle de fluxo arbitrário.

  • Continuações não normais (Extraordinary continuations), geralmente contêm OrdCont como componentes, criadas por meio de primitivas de iteração explícitas e operações especiais implícitas para tratar do respectivo mecanismo de controle de fluxo.

  • ArgContExt adicional, encapsulando outras Continuações para preservar dados de controle.

Durante a execução do contrato, a máquina virtual entra em um loop principal, decodificando um caractere de cada vez do segmento do contrato e despachando a operação correspondente para o manipulador apropriado. O manipulador comum retorna imediatamente após executar a operação correspondente.

Relativamente, as instruções de iteração utilizam a Continuação fornecida como um componente para criar uma Continuação não normal e, no contexto apropriado, saltar para a Continuação não normal. A própria Continuação não normal implementa a lógica ao saltar e, com base nas condições, salta para um determinado componente. Por exemplo, ao usar a instrução WHILE, podemos demonstrar esse processo na Figura 1 (omitindo possíveis saídas).

Figura 1: Lógica da Continuação não normal

Causa raiz

Na versão da máquina virtual com a vulnerabilidade, esses saltos levam a chamadas de cauda dinâmicas contínuas, exigindo que a pilha do host mantenha um quadro de pilha para cada salto (como mostrado na Figura 2).

Tomando o WhileCont como exemplo, outras partes foram omitidas por brevidade.

Figura 2: Recursão de saltos triplos para aninhamento profundo

Idealmente, isso não deve ser um problema, pois os componentes geralmente são representados como OrdCont, cujo salto apenas salva o contexto atual e indica à máquina virtual para executar o fragmento que possui, antes de executar os fragmentos restantes do contrato, não introduzindo mais recursão. No entanto, a Continuação não normal, em teoria, permite que seus componentes acessem o registrador cc (c0) no TVM (ou seja, o ramo set_c0 acima mencionado). Portanto, o contrato pode abusar dessa funcionalidade para executar uma recursão profunda (que será descrita mais adiante). Em vez de alterar a implementação dessa funcionalidade convencional, é mais claro e fácil eliminar a recursão diretamente no processo de salto da Continuação não normal.

Construir uma Continuação não normal de nível superior repetidamente usando a Continuação não normal obtida permite criar uma Continuação profundamente aninhada através da iteração. Essas Continuações profundamente aninhadas, ao serem avaliadas, podem esgotar o espaço de pilha disponível do host, levando o sistema operacional a emitir um sinal SIGSEGV e encerrar o processo da máquina virtual.

A Figura 3 fornece a prova de conceito (PoC) do processo aninhado.

Figura 3: Processo aninhado

Observamos que a cada iteração, o sujeito expande um WhileCont{chkcond=true}. Ao executar o cc gerado e salvo na iteração anterior, obtemos uma pilha de chamadas semelhante a esta:

É evidente que o espaço da pilha tem uma relação de dependência linear com o nível de aninhamento (ou seja, o número de iterações), o que sugere que pode levar ao esgotamento do espaço da pilha.

Sobre a exploração em ambientes reais

Em blockchains reais, as limitações de taxas de combustível tornam a construção de contratos maliciosos bastante difícil. Devido à complexidade linear do processo aninhado (o design do TVM efetivamente previne construções mais baratas via autorreferência), desenvolver um contrato malicioso viável não é uma tarefa fácil. Especificamente, um nível de aninhamento gera uma sequência de chamadas que consome três quadros de pilha do host (320 bytes) no arquivo binário de depuração, enquanto consome dois (256 bytes, as duas últimas chamadas são in-line para uma) no arquivo binário de lançamento. Para nós, nós de validação em sistemas operacionais POSIX modernos, o tamanho padrão da pilha é de 8MiB, o que é suficiente para suportar mais de 30.000 níveis de aninhamento no arquivo binário de lançamento. Embora ainda seja possível construir um contrato que possa esgotar o espaço da pilha, isso é muito mais difícil do que o exemplo da seção anterior.

Medidas de mitigação

Este patch modifica o comportamento dos saltos em casos de aninhamento de Continuações. Podemos ver que a assinatura do salto da Continuação mudou.

Tomando o UntilCont como exemplo, outras partes foram omitidas por brevidade.

Não chamando mais VmState::jump para saltar para a próxima Continuação, isso significa que a execução recursiva de saltos triplos em cada Continuação e a espera pelo valor de retorno para se propagar para trás não ocorrem mais. Agora, o salto da Continuação apenas resolve o próximo nível da Continuação e devolve o controle à máquina virtual.

A máquina virtual itera colaborativamente sobre cada nível da continuação até encontrar um NullRef, indicando que a análise da cadeia foi concluída (como implementado em OrdCont ou ExuQuitCont). Durante esse processo de iteração, apenas um salto de continuação é alocado na pilha do host, garantindo que o uso da pilha permaneça constante.

Conclusão

Para serviços que exigem alta disponibilidade, o uso de recursão pode se tornar um vetor de ataque potencial. Ao lidar com lógica definida pelo usuário, forçar a interrupção da recursão pode ser desafiador. Esta vulnerabilidade de DoS demonstra um caso extremo de abuso acidental da funcionalidade normal sob condições de recursos limitados (ou outras limitações). Se a recursão depender da entrada do usuário, problemas semelhantes podem ocorrer, o que é bastante comum nas primitivas de controle de fluxo da máquina virtual.

Este relatório analisa detalhadamente os detalhes técnicos, as causas raiz e as possíveis formas de ataque do núcleo da vulnerabilidade de DoS na máquina virtual TON, enquanto apresenta a solução eficiente proposta pela equipe TonBit. Ao ajustar o mecanismo de salto recursivo da máquina virtual para processamento iterativo, a TonBit propôs com sucesso uma solução para corrigir a vulnerabilidade, ajudando a remediar essa vulnerabilidade crítica que poderia levar à paralisação da rede, proporcionando uma segurança mais robusta para o ecossistema TON. Este evento não só reflete o profundo acúmulo da TonBit na área de segurança de tecnologia subjacente de blockchain, mas também mostra seu papel importante como Provedor de Garantia de Segurança (SAP) oficial da TON.

Como parceiro de segurança indispensável do ecossistema TON, a TonBit está sempre na vanguarda da proteção da estabilidade da rede blockchain e da segurança dos ativos dos usuários. Desde a descoberta da vulnerabilidade até o design da solução, a TonBit, com sua forte capacidade técnica e compreensão profunda do desenvolvimento de blockchain, estabeleceu uma base sólida para o desenvolvimento a longo prazo da rede TON. Além disso, a equipe TonBit continua a se esforçar em áreas como arquitetura de segurança da rede, proteção de dados dos usuários e aprimoramento da segurança em cenários de aplicação de blockchain. No futuro, a TonBit continuará a impulsionar o progresso da tecnologia de segurança por meio da inovação, fornecendo suporte contínuo e garantias para o ecossistema TON e para o desenvolvimento saudável de toda a indústria de blockchain. A descoberta da vulnerabilidade e o trabalho de correção receberam reconhecimento elevado da TON, consolidando ainda mais a posição da TonBit na área de segurança de blockchain e demonstrando seu compromisso firme em promover o desenvolvimento de ecossistemas descentralizados.

Site oficial da TonBit: https://www.tonbit.xyz/

Twitter oficial da TonBit: https://x.com/tonbit_

Telegram: https://t.me/BitsLabHQ

Linkedin: https://www.linkedin.com/company/tonbit-team/

Blog: https://www.tonbit.xyz/#blogs

Contato para auditoria do Telegram: @starchou