スマートコントラクトの脆弱性の調査:(究極のガイド)

今日は、イーサリアムベースのオークションゲームのために目立つようになった興味深い弱点に焦点を当てて、スマートコントラクトの脆弱性の世界に深く入り込みます。この攻撃は、ガスの誤配分が原因で発生しました。攻撃の詳細に入る前に、ゲーム自体とガスの概念を見てみましょう。.

スマートコントラクトの脆弱性の調査:Etherの王

つまり、「King of the Ether Throne」(KotET)は、参加者が「King oftheEther」の称号を競うゲームです。だから、それはどのように機能しますか?

簡単な入札で。入札プロセスは次のように機能します。 彼らのウェブサイト

  • 玉座の現在の請求価格が10エーテルであると仮定します.
  • あなたはキング/クイーンになりたいので、契約に10エーテルを送ります.
  • 契約は、「報酬の支払い」として、あなたの10エーテル(1%未満のコミッション)を前のキング/クイーンに送ります.
  • 契約はあなたをエーテル王位の新しい王/女王にします.
  • 王位の新しい請求価格は50%上昇し、この場合は15エーテルになります.
  • 15エーテルを支払う意思のある皇位簒がやって来た場合、彼らはあなたを追放して王/女王になり、あなたはあなたの「補償支払い」として15エーテルの支払いを受け取ります。.

簡単に言えば、それは ポンジースキーム.

さて、これがスマートコントラクトの脆弱性とどのように関係しているかに進む前に、ガスがどのように機能するかを理解しましょう.

イーサリアムガスとは何ですか? (スマートコントラクトの脆弱性)

「ガス」はイーサリアムエコシステムの生命線であり、それを表現する他の方法はありません。ガスは、特定の操作を実行するために必要な計算量を測定する単位です。.

イーサリアムに参加するすべての操作は、単純なトランザクションであれ、スマートコントラクトであれ、ICOでさえもある程度のガスを消費します。ガスは、操作を実行するためにネットワークに支払う必要のある料金の数を計算するために使用されるものです.

EVMで実行されるすべてのスマートコントラクトは、ソリディティを使用してコード化されます(Ethereumは、将来、ソリディティからVyperに移行する予定です)。ソリディティのコードのすべての行は、計算されるために一定量のガスを必要とします。.

イーサリアムでガスがどのように機能するかをよりよく理解するために、アナロジーを使用しましょう。あなたがロードトリップに行くとしましょう。その前に、次の手順を実行します。

  • あなたはガソリンスタンドに行き、あなたがあなたの車に満たしたいガスの量を指定します.
  • あなたはあなたの車にそのガスを満たします.
  • あなたはガソリンスタンドにあなたが彼らにガスのために借りている金額を支払います.

それでは、イーサリアムとの類似点を描きましょう.

  • 車は、ガスやスマートコントラクトのように、実行したい操作です.
  • ガスはよく…。ガス.
  • ガソリンスタンドはあなたの鉱夫です.
  • あなたが彼らに支払ったお金は鉱夫料金です.

ユーザーがそこで実行したいすべての操作は、次のガスを提供する必要があります。

  • そのデータ、別名内因性ガスをカバーするため.
  • その計算全体をカバーするため.

ガス制限とは?

イーサリアムで操作を行うために、操作ジェネレーター(つまり、トランザクションを開始する人またはスマートコントラクトの作成者)は、鉱山労働者にガス制限を提出する前に、ガス制限を指定する必要があります。ガス制限が指定されている場合にのみ、鉱山労働者は操作の実行を開始します.

ガス制限を提出する際には、以下の点を考慮する必要があります。

  • 操作が異なれば、ガスコストも異なります(前に示したように).
  • ガスがなくなると、鉱山労働者は実行を停止します.
  • ガスが残っている場合は、すぐに運転発電機に返金されます.

架空のシナリオでこれが動作していることを見てみましょう。

2つの数値を追加し、そのために、契約は次のアクションを実行する必要があるとします。

  • 変数に10を格納します。この操作に45weiガスがかかるとしましょう.
  • 2つの変数を追加すると、これには10weiガスがかかるとしましょう。.
  • 再び45weiガスがかかる結果を保存する.

ガス制限が 120 wei.

鉱山労働者が使用する総ガスは (45 + 10 + 45)100 wei.

仮定して彼らに支払うべき料金 1 wei コスト0.02マイクロETHは(100 * 0.02マイクロETH)= 0.000002 ETH.

さて、どれだけのガスが残っていますか?

120 – 100 = 20 wei.

20weiはオペレーションジェネレータに返金されます.

では、KotETの何が問題だったのか?

KotETコントラクトは、1つのシナリオを除いて、ほぼ正常に動作しました。 KotET契約が「契約口座」に支払いを送ったとき、それはどういうわけか少量のガスだけを割り当てました…正確には2300。それは明らかに費用をカバーするのに十分なガスではありません.

KotETが言うように,

「ウォレット契約がKotET契約によって送信された支払いを処理できなかった場合、支払われたエーテルはKotET契約に戻されました。 KotETは支払いが失敗したことに気づかず、処理を続行し、前の君主に補償金が送られなかったにもかかわらず、発信者をキングにしました。」

ここで問題が発生したすべての問題を分析してみましょう。

  • 2300のガス制限.
  • ウォレット契約で支払いを受け入れるには不十分だったミストウォレット契約.
  • KotET契約開発者は、支払いの送信時に含まれていた2300ガス制限に気づいていませんでした.

  • KotET契約開発者は、トランザクションのどの部分も失敗し、チェーン全体が失敗して戻ることなく元に戻る可能性があることに気づいていませんでした。.
  • KotET契約開発者による実世界での最小限のベータテスト.
  • イーサリアムミストウォレットで使用されるウォレットコントラクトのフォールバック関数は、.send()呼び出し中に利用可能な2300より多くのガスを必要とします.

コードを見る(スマートコントラクトの脆弱性)

この契約は、ゲームを簡略化して表したものです。

スマートコントラクトの脆弱性の調査:Etherの王

コントラクトによると、参加者がエーテルをコントラクト(msg.value)に送信すると、デフォルトでKotETのフォールバックもトリガーされます。 KotETフォールバックは、送信されたエーテルがタイトルを取得するのに十分であるかどうかを最初にチェックします.

そうでない場合は、エーテル転送を元に戻します。はいの場合、参加者が新しい王として選ばれます。それが起こるとき、補償は前の王に送られ、参加者は戴冠します。新しい王から送られたお金と古い王への補償の差額は、契約によって保持されます。 KotETの所有者は、sweepCommissionを通じて契約に蓄積されたこれらすべてのエーテルを引き出すことができます.

脆弱性は送信機能にあります機能に不十分なガスが装備されている場合、キングのアドレスが高価なフォールバックを伴う契約のアドレスである場合、king.send(補償)は失敗します。この場合、補償は前の王の代わりに契約によって単に保持されます.

スマートコントラクトの脆弱性結論

KotETの過ちから学んだことを願っています。時間内に修正しないと多くの大混乱を引き起こす可能性があるのは、このような小さな間違いです。スマートコントラクトのコーディングに関しては、スマートコントラクトの脆弱性を回避するために細部に注意を払うことが最も重要です.

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me