Appearance
DeFiの深淵に潜む「Compromised」:脆弱性を突いて資産を救出せよ!
DeFi(分散型金融)の世界は、革新的な金融サービスを提供する一方で、巧妙に仕掛けられた脆弱性によって、予期せぬリスクを孕んでいます。今回紹介するCTF(Capture The Flag)チャレンジ「Compromised」は、まさにそんなDeFiの深淵を覗き見、その脆弱性を暴き出すスリリングな体験を提供します。
異変の兆候:奇妙なサーバー応答
物語は、とある有名なDeFiプロジェクトのWebサービスを調査している最中に始まります。そこで遭遇したのは、サーバーからの奇妙なHTTP応答でした。
HTTP/2 200 OK
content-type: text/html
content-language: en
vary: Accept-Encoding
server: cloudflare
4d 48 67 33 5a 44 45 31 59 6d 4a 68 4d 6a 5a 6a 4e 54 49 7a 4e 6a 67 7a 59 6d 5a 6a 4d 32 52 6a 4e 32 4e 6b 59 7a 56 6b 4d 57 49 34 59 54 49 33 4e 44 51 30 4e 44 63 31 4f 54 64 6a 5a 6a 52 6b 59 54 45 33 4d 44 56 6a 5a 6a 5a 6a 4f 54 6b 7a 4d 44 59 7a 4e 7a 51 30
4d 48 67 32 4f 47 4a 6b 4d 44 49 77 59 57 51 78 4f 44 5a 69 4e 6a 51 33 59 54 59 35 4d 57 4d 32 59 54 56 6a 4d 47 4d 78 4e 54 49 35 5a 6a 49 78 5a 57 4e 6b 4d 44 6c 6b 59 32 4d 30 4e 54 49 30 4d 54 51 77 4d 6d 46 6a 4e 6a 42 69 59 54 4d 33 4e 32 4d 30 4d 54 55 35
この一見無意味な16進数の羅列は、何らかのデータがエンコードされていることを示唆しています。これは、このチャレンジの「Compromised」たる所以であり、プレイヤーに深淵を覗き見るための鍵となります。
疑惑のコレクティブル:「DVNFT」の異常な価格
このDeFiプロジェクトは、現在「DVNFT」と呼ばれるコレクティブルを販売しています。しかし、その価格たるや異常な999 ETH。この価格は、3つの信頼されたリポーターからの情報に基づき、オンチェーンオラクルによって決定されています。
0x188...0880xA41...9D80xab3...a40
プレイヤーは、たった0.1 ETHの残高からスタートし、このチャレンジをクリアしなければなりません。目標は、取引所に残る全てのETHを救出し、指定されたリカバリーアカウントに預け入れることです。
攻略の鍵:TrustfulOracleの盲点
このチャレンジの核心は、TrustfulOracle.solとExchange.solのコードに隠されています。
TrustfulOracleは、複数のソースからの価格情報を集約し、中央値をもって最終的な価格を決定する仕組みを持っています。しかし、postPrice関数はonlyRole(TRUSTED_SOURCE_ROLE)で保護されているものの、信頼されたソースになりすまして、意図的に不正な価格を投稿することが可能です。
Exchange.solは、このTrustfulOracleからDVNFTの価格を取得し、取引を行います。buyOne関数では、msg.valueがオラクル価格以上であればNFTをミントし、差額を返却します。sellOne関数では、NFTをバーンし、ETHを売却者に支払います。
攻略法:価格操作と搾取
このチャレンジの攻略法は、以下のステップで構成されます。
- 初期価格操作: 3つの信頼されたソースのうち、2つになりすまして、
DVNFTの価格を極端に低い値(例:1 wei)に設定します。 - 低価格での購入: プレイヤーは、わずかなETH(1 wei)で
buyOne関数を呼び出し、DVNFTをミントします。この際、msg.valueは1 wei、残りのETHはプレイヤーに返却されます。 - 大量ETHの準備:
Exchangeコントラクトには、初期状態で999 ETHが用意されています。 - 価格の再操作: 再び信頼されたソースになりすまし、DVNFTの価格を
Exchangeコントラクトの残高(999 ETH)に設定します。 - NFTの売却: プレイヤーは、ミントしたDVNFTを
approveし、sellOne関数を呼び出します。これにより、Exchangeコントラクトから999 ETHがプレイヤーに支払われます。 - ETHのリカバリー: プレイヤーは、受け取ったETHをリカバリーアカウントに送金します。
- 価格の復旧: 最後に、価格を元の
INITIAL_NFT_PRICEに戻し、チャレンジの成功条件を満たします。
結論:DeFiのセキュリティ意識の重要性
「Compromised」チャレンジは、DeFiにおける価格オラクルの脆弱性と、それらを悪用した攻撃手法を具体的に学ぶための貴重な機会となります。分散型金融の利便性の陰に潜むリスクを理解し、より安全で堅牢なDeFiエコシステムを構築するためには、このような脆弱性に対する深い理解と、継続的なセキュリティ対策が不可欠です。
このチャレンジを通じて、あなたもDeFiの深淵に足を踏み入れ、その脆弱性を暴き、資産を救出するスリルを体験してみてはいかがでしょうか。