11月30日、当社のセキュリティインシデント監視システム ThunderForecast は、イーサリアム上の履歴トランザクションをスキャンした結果、Loopringプロトコルへの攻撃を検出しました(ブログ記事:EN, CN)。結論として、この攻撃の根本原因は sellTokenForLRC 関数におけるアクセス制御の欠如です。攻撃者は当時80.97 ETH(48,849.2 USD相当)を不正に取得しました。
2020年12月11日、当社の監視システム ThunderForecast は、異常な取引レートで取引された一連のトランザクションを報告しました。その後、当社の研究チームが開発したEthScopeシステムを使用してこれらのトランザクションを分析し、これがアービトラージ目的でSeal Finance Protocolの脆弱性を悪用した攻撃であることを発見しました。
Sealとは?
Sealのホワイトペーパーで言及されているように、「SEAL - 主要なDeFiプロトコル間の仲介役として機能し、それらの間の流動性を深める実験的なプロトコルです」。現在、Sealを他のさまざまな著名なトークン(UNI、YFI、USDT、SNXなど)と連携させる10以上の流動性プールが存在します。ボーナスを獲得するために、投資家はLPトークンをSEAL報酬コントラクトに預け、Farmコントラクトのbreed()関数をトリガーして新しいSEALトークンを生成する必要があります。Farmコントラクトは各Sealプールにデプロイされ、コントラクト内のbreed()関数は新しいSealトークンを発行するために使用されます。breed()の設定では、追加の1.6%のSealトークンが発行されます。さらに、発行されたSealトークンの0.8%は別のトークンと交換され、残りの0.8%の発行されたSealトークンは流動性としてプールに預けられます。しかし、breed()関数にはアクセス制御が設計されていなかったため、誰でもこの関数をトリガーでき、この基本的な設計が報告された攻撃の根本原因となりました。
以下は、breed()関数の確認されたソースコードです。
function breed() external {
require(now / 1 days > today);
today += 1;
uint256 sealPairAmount = seal.balanceOf(address(cSeal));
uint256 tokenPairAmount = token.balanceOf(address(cSeal));
uint256 newSeal = sealPairAmount.mul(spawnRate).div(1e18);
uint256 amount = UniswapV2Library.getAmountOut(newSeal, sealPairAmount, tokenPairAmount);
seal.mint(address(cSeal), newSeal);
if(address(seal) < address(token))
cSeal.swap(0, amount, address(this), "");
else
cSeal.swap(amount, 0, address(this), "");
token.transfer(address(cSeal), amount);
seal.mint(address(cSeal), newSeal);
cSeal.mint(address(this));
}
詳細
攻撃トランザクションの1つ[(https://phalcon.blocksec.com/explorer/tx/eth/0xddcbc6f146ce81dd2c0104d02c24b75605defa0cbbbca9adfcbae038ba61ad5b)]で、攻撃者は利益を最大化するために10のSealプールで攻撃ロジックを繰り返しました。以下の分析では、Seal-SNXプールで実行された攻撃に焦点を当てます。

この攻撃は3つのステップで実行されました。
- ステップ1:Seal-SNXプールで1,084 Sealを2,787 SNXにスワップします。取引レートは1 Seal = 2.57 SNXでした。
- ステップ2:
Farmコントラクトのbreed()関数をトリガーします。この関数は13.08 Sealを発行し、それを10.20 SNXにスワップします。取引レートは1 SNX = 0.78 Sealになりました。これは、プール内のSNXの大部分がSealにスワップされたため、SNXとSealの量の間に大きな差が生じたためです。次に、Uniswapの価格計算アルゴリズムに基づいて、SNXはプール内で非常に価値のあるものになりました(価格は3倍以上に上昇しました)。 - ステップ3:Seal-SNXプールで2787 SNXを1100 Sealにスワップします。この取引はSNXの価格をさらに上昇させたため、攻撃者はより多くのSealトークン(追加で16 Seal)をアービトラージしました。
損失をさらに測定および確認するために、当社のシステムEthScopeを使用して、攻撃前のブロック状態でのbreed()関数をリプレイしました。その結果、Farmは通常の呼び出しと比較して18個の追加Sealトークンを発行しました。攻撃者は16 Sealを奪い、プールには2 Sealしか残りませんでした。
利益と損失
このトランザクションで、攻撃者は合計175 Sealの利益を得ました。
攻撃の規模
2020年12月13日現在、オンチェーンで3つの悪意のあるコントラクト(0x49f93e, 0x8b3710, 0x0f20b6)がデプロイされ、22件のトランザクションが成功裏に実行され、4,247 Sealトークンがラップされました。当時の価格に基づくと、攻撃者はSealプロトコルの脆弱性を悪用して約58,467 USDを獲得しました。Sealプロトコルの脆弱性は依然として攻撃の対象となっていることを言及する価値があります!!!
さらに、得られたSealトークンのフローを分析した結果、約900のSealトークンがDEXに預けられ、残りは6つの異なるアドレスに分散されていることがわかりました。以下の図に示すように、これらのアドレスは、Seal FinanceとUniswap V2の流動性プールを除いて、すべてSealトークンのトップホルダーです。

終わりに
EthereumのDeFiエコシステムの発展に伴い、さまざまなセキュリティ問題が徐々に出現しています。実際、2020年12月13日現在、22件のトランザクションを通じてSealに相当な損失(58,467 USD)を引き起こした攻撃の根本原因であるアクセス制御。
更新(2021/01/04)
2020年11月30日の最初の攻撃後、攻撃者は3番目の攻撃コントラクトをデプロイし、5回の攻撃を実行しました。最後の攻撃は2020年12月24日に行われ、取得したSealトークンはこのアドレスに転送されました。このプロセスで、攻撃者は6,021 Sealトークンを取得しました。
タイムライン:
- 2020/12/11:不審なトランザクションが発見される
- 2020/12/12:分析完了
- 2020/12/13:Seal Financeに報告
- 2021/01/03:詳細が公開される
- 2021/01/03:CVE-2021–3006が割り当てられる
BlockSecについて
BlockSecは、2021年に世界的に著名なセキュリティ専門家グループによって設立された、先駆的なブロックチェーンセキュリティ企業です。当社は、Web3の普及を促進するために、新興のWeb3の世界のセキュリティと使いやすさの向上に取り組んでいます。この目的のため、BlockSecはスマートコントラクトおよびEVMチェーンのセキュリティ監査サービス、セキュリティ開発と脅威のプロアクティブなブロックのためのPhalconプラットフォーム、資金追跡と調査のためのMetaSleuthプラットフォーム、およびWeb3ビルダーが仮想通貨の世界を効率的にサーフィンするためのMetaSuites拡張機能を提供しています。
現在までに、同社はMetaMask、Uniswap Foundation、Compound、Forta、PancakeSwapなど300社以上の著名なクライアントにサービスを提供しており、Matrix Partners、Vitalbridge Capital、Fenbushi Capitalなどの著名な投資家から2回の資金調達で数千万米ドルを獲得しています。
公式ウェブサイト:https://blocksec.com/
公式Twitterアカウント:https://twitter.com/BlockSecTeam



