ブロックチェーン

ERC20トークンのバグがヤバい?プログラムを学ぶ占い師

どうも、クリプト占い師です。

なにやら4/25辺りから、ERC20準拠のトークンコントラクトに脆弱性が見つかったとの事でSNSで話題になっていましたね。どのような問題があったのか、今回はプログラムに着目してまとめてみたいと思います。

掲示板では悲報とも言われてますね… 

http://coinmatomesokuho.blog.jp/archives/8835071.html

 

結論から言いますと、別にERC20トークン全部に問題があるわけではありませんでした。一部のトークンコントラクトのプログラムに含まれる『batchTransfer』と言うメソッド(プログラムの手続き方法とか関数的な事を意味します)に脆弱性があると言う事です。

一部なので、イーサリアムとかERC20全体に問題があるわけではありません。

図で表すと下図のイメージです。

 

Twitterでもこちらの意見がわかりやすく的を得ている印象です。

 

今回の騒動を占い業界で例えると?

占いのジャンルでは、西洋占星術や東洋占星術があり、西洋占星術でタロットや星座占いがあり、占い師もたくさんいます。

例えばある特定の占い師数人が星座占いを使ってお客様に高額なツボを売りつけまくる事件があった時に、占いはヤバいって言っているのと大して変わりません。

もちろんそれは問題ですが、業界に関わる全ての人がヤバいわけではありません。

ツボを売らない占い師の方が圧倒的に多いのですから。

 

例えが良いか悪いかは別にして、具体的にどのような問題だったのか見ていきましょう。

 

こちらのMediumを見てみましょう。

複数のERC20スマート契約の新しいバッチオーバーフローバグ(CVE-2018-10299)

と言うタイトルで投稿されています。これが今回の話題の情報元です。

この『バッチオーバーフロー』バグはBeutyChainというプロジェクトのERC20準拠のトークンコントラクトで見つかりました。

コードはこちらのサイトでも確認できます。

https://etherscan.io/address/0xc5d105e63711398af9bbff092d4b6769c82f793d#code

 

BeutyChainのBECトークンホルダーのリストを見ると特定のアドレスがとんでもない量のトークンを保有している事がわかります。

※下記画像クリックで別画面で実際のページを開けます。

Mediumではこれに対して、このプログラムはオーバーフローと言う古典的なバグが発生すると言う事で説明を行っています。

 

オーバーフローとは?

詳しくは桁あふれ(オーバーフロー)とは何か?許容範囲の考え方を知る!を参考にして下さい。ここでは簡単なイメージだけお伝えします。

プログラムは数字を処理する際に、桁数が決まっています。

 

例えばわかりやすく10進数で、4桁で処理すると決まっている場合。

0~9999まではそのままで処理ができます。

 

しかし、足し算や掛け算の結果、

5桁の10000となったとします。

処理する数字の桁は4桁と決まっているので、

これは0として認識されてしまいます。

10001や100100となる場合はそれぞれ1や100と認識されます。

これがオーバーフローです。

 

batchTransferは何の処理?

オーバーフローがこのbatchTransferの処理で起こるのが問題となります。

batchTransferは何の処理かと言うと、複数人に同額を送金する処理です。

例えば返金処理等に利用する事が想定されます。前払いでコンサートのチケット代を払ってもらったけど、コンサートが急遽中止になったから返金しますみたいな時。

まとめて返金処理したい場合、チケット代×人数の金額の計算が必要になりますよね。

 

プログラムの問題点

プログラムでは257行目で、送金総額の計算。(送金総額=送金額×人数)

259行目で、送金総額が送金者が保有するトークン総額を超えないかチェックをします。

通常では当たり前の処理ですが、ここでオーバーフローが発生した場合に、送金者が保有するトークン総額以上を送金できてしまうバグとなります。

 

先ほどの4桁の例で考えてみましょう。※かなりシンプルにしています。

・チケット代:1000円

・送金者の保有金額:5000円

とします。

返金対象が1人~5人の場合は1000円~5000円なので、処理可能です。

6人~9人の場合は6000円~9000円となり保有する金額を超えるのでNGとなります。

これが10人や100人の場合はどうでしょう?10000円、100000円となります。4桁までしか処理できないので、どの場合も送金総額が0000円となり、保有金額より少ないと認識されて処理ができてしまいます。お金がないのにお金が送れてしまいます。

これが『バッチオーバーフローバグ』です。

 

これによる問題は?

攻撃者が特定のアカウントの所有するトークン量を簡単に増やせる

→供給バランスが崩れてトークンの価値がなくなる。他の保有者が被害を被る。

 

取引所に上場している場合…

他のトークンと交換→取引所から資金が流出する。

※このため、対象のERC20トークンを取り扱う取引所は急遽対象となるトークンの取引を一時停止にしました。

 

実装しているトークンは?

現在下記9種類のトークンがバグメソッドを実装しているようです。

・BeautyChain (BEC)
・ugChain (UGC)SMART
・MTC
・FirstCoin (FRST)
・GG Token
・CNY Token
・MESH
・SMT tokens

 

対策は?

この問題の解決作はオーバーフローが起きる演算処理が行われた場合に、処理を中断し例外エラーを発生させることです。演算処理よるオーバーフローは既に知られている問題で解決策も明確にされています。演算処理はコントラクト開発ライブラリ群zeppelin-soliditySafeMath.solを利用する事が一般的なようです。

 

BatchOverflowバグに関するBittrexの声明

“Once public, Bittrex immediately started analyzing the smart contract “batchOverflow” bug. If an ERC20 token is vulnerable, attackers can exploit the bug to generate countless tokens, allowing for price manipulation. We concluded our investigation and did not find any ERC20 tokens listed on Bittrex that are vulnerable to the batchOverflow bug. Customers may continue their normal activities on Bittrex since ERC20 token trading is not expected to be disrupted by this issue.”

“情報が公開されてから、Bittrexはすぐにスマート契約” batchOverflow “のバグを分析し始めました。ERC20トークンが脆弱な場合、攻撃者はこのバグを悪用して無数のトークンを生成し、価格操作を可能にします。我々は調査を終了し、BitTrexに記載されているERC20トークンがbatchOverflowバグの影響を受けていないことを確認しました。この問題によりERC20トークン取引が中断されることはないため、顧客はBittrexで通常の活動を続けることができます。

https://support.bittrex.com/hc/en-us/articles/360003053291

 

今回、WEB上の声を聞くと大問題の様に感じましたが、プログラムを読み解くとかなりシンプルな脆弱性でした。ERC20トークンに標準装備されているものでもないので、ERC20トークン全てが危険と言う事もありませんでした。セキュリティ対策について学んでいれば理解できるし防げる内容ですね。