SC05:2023 - フロントランニング攻撃 (Front-running Attacks)

説明:

フロントランニングは、悪意のあるアクターがブロックチェーンネットワーク内の保留中のトランザクションに関する知識を悪用して不当に利益を得る攻撃の一種です。これは分散型金融 (DeFi) エコシステムで特によく見られます。攻撃者はメモリプール (保留中のトランザクションのリスト) を観察し、ターゲットとなるトランザクションよりも先に処理されるように、より高いガス価格の独自のトランザクションを戦略的に配置します。これは被害者に大きな金銭的損失をもたらし、スマートコントラクトの意図した機能を妨害する可能性があります。

事例 :

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract VulnerableSwap {
    address public pancakeRouter;
    address public ssToken;

    constructor(address _pancakeRouter, address _ssToken) {
        pancakeRouter = _pancakeRouter;
        ssToken = _ssToken;
    }

    function swapBNBForSSToken(uint256 amount) private {
        address[] memory path = new address[](2);
        path[0] = IPancakeRouter02(pancakeRouter).WETH();
        path[1] = ssToken;

        IPancakeRouter02(pancakeRouter).swapExactETHForTokensSupportingFeeOnTransferTokens{
            value: amount
        }(0, path, address(this), block.timestamp);
    }
}

注: 上記の事例では、ユーザーは BNB を SSToken に交換したいと考えています。しかし、この関数には適切なスリッページチェックがないため、フロントランニングに対して脆弱です。攻撃者は大規模なスワップトランザクションを観察し、より高いガス価格の独自のトランザクションを最初に処理されるように挿入して、被害者のトランザクションを不利なレートで実行されることができます。

影響:

  • トランザクションの順序を操作された結果、被害者はトークンに多額の代金を支払うことになったり、予想よりもはるかに少ない金額を受け取ることになる可能性があります。

  • フロントランナーは他者に先駆けて大規模な取引を実行することで、トークンの価格を人為的に上げ下げできます。

対策:

  • ネットワーク価格とスワップサイズに応じて 0.1% から 5% の間のスリッページ制限を導入し、フロントランナーがより高いスリッページレートを悪用することを防ぎます。

  • ユーザーが詳細を明かさずにアクションをコミットし、後に正確な情報を開示するという二段階プロセスを使用して、攻撃者がトランザクションを予測して悪用することを困難にします。

  • 複数のトランザクションをまとめて一つのユニットとして処理することで、攻撃者が個々の取引を特定して悪用することをより困難にします。

  • フロントランニングの機会を悪用する可能性のある自動化されたボットやスクリプトを継続的に監視し、早期検出と軽減に役立てます。

Last updated