Front-running

Ocorre quando um atacante explora a ordem das transações pendentes no mempool para executar uma transação antes de outra que jÔ estÔ na fila, com o objetivo de obter uma vantagem indevida. Esse tipo de ataque é comum em plataformas DeFi, como exchanges descentralizadas (DEXs), onde o preço de um ativo pode ser impactado por grandes ordens de compra ou venda.

Exemplo:

Imagine que o usuÔrio A tenta comprar uma grande quantidade de um token em uma DEX. A transação do usuÔrio A é enviada para a rede e fica no mempool aguardando confirmação. Um atacante, monitorando o mempool, observa essa transação e percebe que a compra feita pelo usuÔrio A aumentarÔ o preço do token.

O atacante então envia uma transação com uma taxa de gas mais alta para comprar o token antes que a transação do usuÔrio A seja processada. Como os mineradores priorizam transações com taxas mais altas, a transação do atacante serÔ executada primeiro, comprando o token a um preço mais baixo. Quando a transação do usuÔrio A for finalmente executada, o preço do token terÔ subido, permitindo ao atacante vender o token adquirido por um valor mais alto e obter lucro imediato.

function swapTokens(uint amountIn, address tokenIn, address tokenOut) external {
    // Calculando o preço antes de executar a negociação
    uint priceBefore = getPrice(tokenOut);

    // Executar a troca de tokens
    uint amountOut = executeSwap(amountIn, tokenIn, tokenOut);

    // CÔlculo do preço após a troca
    uint priceAfter = getPrice(tokenOut);

    // Potencialmente, um invasor pode observar e executar uma transação antes disso
}

Mitigação:

  1. Uso de esquemas Commit-Reveal: Esse esquema envolve dividir a transação em duas fases: um ā€œcommitā€, onde Ć© enviado um hash da transação, e um ā€œrevealā€, onde a transação completa Ć© revelada. Durante a fase de commit, o atacante nĆ£o tem acesso Ć s informaƧƵes completas da transação e, portanto, nĆ£o pode realizar um ataque de front-running.

    solidityCopiar código
    mapping(address => bytes32) public commitments;
    
    function commitSwap(bytes32 _commitment) external {
        commitments[msg.sender] = _commitment;
    }
    
    function revealSwap(uint amountIn, address tokenIn, address tokenOut, uint nonce) external {
        require(commitments[msg.sender] == keccak256(abi.encodePacked(amountIn, tokenIn, tokenOut, nonce)), "Invalid reveal");
        // Executar o swap
    }
  2. Limite de Gas e Priorização de Transações: Contratos inteligentes podem definir limites de gas ou incluir regras que priorizam transações com base em fatores diferentes da taxa de gas, tornando mais difícil para um atacante simplesmente pagar mais para se adiantar na fila.

  3. TolerĆ¢ncia ao Slippage: Em exchanges descentralizadas (DEXs), os usuĆ”rios podem definir uma ā€œtolerĆ¢ncia ao slippageā€, que determina a variação mĆ”xima de preƧo aceitĆ”vel para a transação. Se o preƧo do ativo se mover alĆ©m desse limite devido a um possĆ­vel ataque de front-running, a transação serĆ” revertida automaticamente.

    function swapTokens(uint amountIn, address tokenIn, address tokenOut, uint minAmountOut) external {
        uint amountOut = executeSwap(amountIn, tokenIn, tokenOut);
        require(amountOut >= minAmountOut, "Slippage too high");
    }
  4. Mecanismos de Bloqueio Temporal: A introdução de atrasos controlados ou janelas de tempo durante as quais uma transação não pode ser confirmada imediatamente pode reduzir a capacidade de atacantes executarem transações em uma ordem vantajosa.

  5. Ordenação Aleatória de Transações: Em vez de processar as transações na ordem em que chegam ao mempool, elas podem ser ordenadas de forma aleatória ou utilizar sorteios (loterias) para determinar a ordem de execução, dificultando ataques de front-running.

  6. Flashbots e Proteção contra MEV: Ferramentas como o Flashbots permitem que os usuÔrios enviem transações diretamente aos validadores, sem passarem pela mempool pública, impedindo que fiquem visíveis para atacantes que tentam realizar front-running. Essa técnica ajuda a mitigar o risco de Maximal Extractable Value (MEV), que é o lucro que atacantes podem obter ao explorar a ordem de execução das transações.

Last updated