
OpenZeppelinセキュリティレポート 2023年4〜6月 #1
OpenZeppelinの2023年4月から6月までのセキュリティレポートについて、Silo Finaneのインシデントをまとめました。
OppenZeppelinセキュリティレポート
OpenZeppelinセキュリティレポートは、さまざまな脆弱性やリスクに焦点を当てることで、ブロックチェーンセキュリティ研究者にとって重要なインシデントや教訓を分析することを目的としています。
これは、エコシステムのセキュリティ態勢を向上させるために、新しい脆弱性や最近発見された脆弱性を追跡、文書化、共有する継続的な取り組みの一部です。
【Silo Finance】 Logic Error Vulnerability
Summary
Soli Financeは、重大なロジックエラーの脆弱性に直面
攻撃者がプロトコル内の利率を操作し、担保の価値を超えて借りることができる可能性があった
ホワイトハッカーとSoliチームの迅速な対応により、ユーザー資金は失われなかった
ホワイトハッカーには100,000 USDCの報奨金が授与された
Silo Finance
非預託型の貸付プロトコルで、ある暗号資産を担保に別の暗号資産を借りることができます。
Siloは、分離されたプールを使用し、各トークン資産が独自のLending marketを持ち、ブリッジ資産であるETHとXAIとペアリングされる、許可なしでリスクが分離されたLending merketを作成します。すべてのプロトコルにおける貸し手は、いつでもETHとXAIのリスクにのみさらされるのが特徴です。
さらに、すべてのトークンがETHまたはXAIとペアリングされているため、各トークン資産ごとに単一の市場しか存在していません。これにより、流動性の分断を防ぎ、プロトコルの効率を高めることができます。
Incidents
Soli Finance内でバグの開示が行われ、重大なロジックエラーの脆弱性に直面しました。
このロジックエラーが悪用されると、悪意のある攻撃者がプロトコル内の金利を操作できる可能性があります。この悪用により、攻撃者は担保価値をはるかに超える金額を借入できるようになり、システムの安全性が脅かされる可能性があります。
この脆弱性は、プロトコルのコアロジックである「Base Silo Contract」に起因します。
このコントラクトは、ローン・プロトコルとして機能する「Silo Contract」を継承しています。具体的には、ユーザーが何かを借りる代わりに、何か他のものを(担保)預ける仕組みを提供しています。
これは、Silo Contractのdeposit関数を呼び出すことで実現します。預けた金額とシェアの総供給に基づいて、コントラクトは預金者に対してトークンのシェアを発行します。そして、預けられた金額に応じて、_assetStorage[_asset]というストレージ状態を更新します。

コントラクトに担保を預けるユーザーは、borrow関数を使用することで、プロトコルから他の資産を借りることができます。この関数は、まず借りる資産の利息の貯蓄率を更新し、次に現在のコントラクトにユーザーが借りるために十分なトークンがあるかどうかを確認します。その後、関数はトークンをユーザーに転送し、提供された担保に基づいて貸付価値比率(LTV)をチェックします。
この仕組みにより、ユーザーは自分の担保に応じて、安全かつ効率的に他の資産を借りることができるようになります。借りるプロセス全体が、この単一の関数によって管理されているため、操作が容易で透明性が高まります。

この脆弱性は攻撃者が、コントラクトに対して全体の預金がゼロであるトークンの利用率を操作することを可能にします。攻撃者は、ERC20トークンをコントラクトに寄付することで利用率を操作でき、特定のトークンに対して市場で株式の大部分を持っている場合、寄付されたトークンを借りると、その特定のトークンの利用率が膨らみます。
本質的に、攻撃者はコントラクトへの合計デポジットがゼロのERC-20トークン(またはトークンの1つだけがデポジットがゼロのプール)の使用率を操作できました。
一般的に、この攻撃を再現する手順は以下の通りです:
市場内の資産のうち、全体の預金が0である市場を特定します。例:WETHの全体の預金が0である場合。
特定の資産の大部分の株主になるために、その市場にWETHを預けます。これにより、その資産のtotalDeposits(全体の預金)がゼロでなくなります。
その市場に追加のWETHを寄付します。これにより、他のユーザーがステップ2で預けられたWETHの合計よりも多くのWETHを借りることができるようになります。
市場に別の資産を預けるために、別のユーザー/アドレスを使用し、寄付されたWETHを借ります。
次のブロックで、accrueInterest()が呼び出されると、攻撃者が最初に預けた金額の利用率が100%を超え、利率が極端に高い値になります。
この膨らんだ利率のため、攻撃者の最初の預金は本来よりも高く評価され、市場の資金の大部分を借りることができるようになります。

本件は、警戒心の強いホワイトハッカー (@kankodu) と Silo チームの迅速な対応のおかげで、ユーザーの資金は失われませんでした。初期の修正には、1 つ以上の資産の合計入金額が 0 で資産を市場に預け入れるという内容が含まれていましたが、プロトコルはその後、利用率が 100% を超えず、最大複利率が 10% を超えないようにする恒久的な修正を実装しました。その後、修正は正式な検証を通じてテストされました。
変数やパラメータの統計的に異常な値は、潜在的な悪用や市場操作の兆候であることが多いため、常に監視する必要があります。この問題に対してパッチを適用することで、簡単に予防することができました。しかし、最終的な解決策としては、特定の値の周囲に制限を設けることが求められました。このため、トランザクションにおける異常値に対して注意を払うことが、非常に重要な側面となります。
Sources
On April 28th, I discovered a bug in Silo Finance's codebase. It was swiftly rectified, with the project awarding me $100k. Here's a detailed thread on the thought process that led to the bug's discovery.
— kankodu (@kankodu) June 16, 2023
A long thread 🧵: