ソフトウェア開発現場の目線で見た「The DAO攻撃事件の教訓」

2016年6月17日に起きたThe DAOへの攻撃は、仮想通貨やブロックチェーン技術に関心を持つ人々に大きな衝撃を与えました。今回はこの事件に関する「開発現場の目線からの教訓」を考えてみます。

Ethereumコミュニティは迅速に対応

「The DAOって何だ?」という疑問があるかもしれません。ひと言で説明すると「仮想通貨テクノロジーによる投資ファンド」です。仮想通貨により広い対象から投資を集め、2016年5月28日までに1.3億ドル相当(調達時のレートで約138億円相当)とクラウドファンディング史上最大の資金を集めました。集めた資金の活用方法は、投資者による提案と投票で決めます。このような資金集め、投票などの仕組みは、すべてブロックチェーン上で動くプログラム(詳細は後述します)により、ほぼ自動化しました。The DAOのコンセプトをざっくり表現すると「コードで定義された投資ファンド」ということになるでしょう。

そして事件は2016年6月17日に起きました。The DAOのプログラムに潜んでいた脆弱性を突いて、総額52億円相当の仮想通貨を自分のアドレスに送金した攻撃者が現れたのです。

The DAOは、ブロックチェーン技術「Ethereum(イーサリアム)」の上のスマートコントラクトとして構築されていました。Ethereumは注目が高まっているパブリックブロックチェーン技術です。その最大の特徴は、チューリング完全なプログラミング環境を持つことです。ブロックチェーンにより真正性が保障された自動執行するプログラムコード(これをスマートコントラクトと言います)により、例えばデリバティブ取引のような複雑な契約をプログラムで実行可能とします。

スマートコントラクトという言葉には独特の響きがありますが、要するにプログラムです。人間が書くプログラムである以上、プログラマーのミスによるバグや脆弱性を作り込んでしまう可能性があります。当たり前すぎるほど当たり前の話なのですが、The DAOへの攻撃という事件により、この問題が衝撃的な形で浮上したことになります。

Ethereumコミュニティでは、稼働中のスマートコントラクトのバグについて次のような注意喚起をしています。今回の事件を反省して、取り組みを進めているのです。

Thinking About Smart Contract Security

EtherumコミュニティではThe DAOへの攻撃に対抗する取り組みを進めていて、記事執筆時点では不正に移動させられた仮想通貨を無効化し、さらに取り戻す取り組みが進行中です。ただし、「資金を取り戻す」ところまで介入するべきではないとする反対意見も出ています。状況は数日から数週間の間に変わる可能性がありますので、The DAOの事件に関する本稿の記述は、あくまでも原稿執筆時点の状況に基づくものとなります。

The DAOのコンセプト図

The DAOのコンセプト図。資金の保持、提案の採択、提案への資金提供などを、プログラムコードにより自律的に執行する仕組み。今回の攻撃では、Ethereumの仮想通貨ETHを保持するThe DAOのコードの脆弱性が突かれた。
(資料:The DAO公式サイト

開発の現場は何をするべきか

The DAOへの攻撃から得られる教訓について、コンセンサス・ベイス代表の志茂博氏に話を聞きました。志茂氏は金融機関大手を含むスマートコントラクトの実証実験の取り組みに参加しており、Ethereumに関する実務的な取り組みの第一人者です。

このThe DAOの教訓について、志茂氏は

「正しく動くか十分に検証されていないプログラムに、お金を預ける危険性」が改めて認識できた。

と語ります。

The DAOの何がまずかったのでしょうか? たくさんの意見がありますが、今回の記事では実務的な側面に限って考えてみます。表面的な問題は脆弱性を残してリリースしてしまったことですが、開発運用体制にも問題がありました。

実はThe DAOが立ち上がった直後に、「セキュリティに問題があるので、いったん運営を停止するべきだ」との提案がありました。ところが、具体的な提案を投票で決めるプロセスを進めている間に攻撃されてしまったという経緯があります。脆弱性の指摘に素早く対応できる開発運用体制とは言えない状態でした。

脆弱性が残っていたことについては、志茂氏は「コードレビューが足りなかった」「運用を段階的に実施して、バグや脆弱性を修正しながらサービスを成長させるべきだった」と指摘します。これも開発運用体制に対する指摘です。

以下、志茂氏に聞いた「Ethereumでスマートコントラクトを作る場合の注意点」です。

  1. 再帰呼び出しに気をつけること
  2. できるだけコードをシンプルに保つこと
  3. 人様のお金を扱うプログラムを書く場合には十分に注意すること
  4. プログラムのレビューや監査を十分に行うこと
  5. 不具合の事例を集め、共有すること
  6. 不具合の対処のベストプラクティスを集め、貯めること
  7. 不具合を起こさないためのプログラム解析ツールをコミュニティで開発し、将来利用すること
  8. 不具合が起きた後の対応を考えたプログラムや運営方法を考えること

結局の所、バグや脆弱性へ立ち向かうには、開発と運用の基本動作を正しく繰り返すしかないことがわかります。長期的には形式検証や自動証明のような手段がプログラマーを助けてくれるかもしれませんが、人間がプログラムを書いている限り、バグの可能性は当面つきまとうはずです。

ブロックチェーン技術や仮想通貨は、もともと「お金(価値)を送る」技術として作られました。お金を扱う技術である以上、その基盤技術はよく検証されている必要があります。実際、Ethereumの基盤技術には多くの努力が投入されてきました。ただし、ブロックチェーン上のアプリケーションに相当するスマートコントラクトがすべてよく検証されているとは限らないことが、今回の事件で明らかになりました。例え話をするなら、OSを堅牢に作ったのにも関わらず、急いで作ったアプリケーションの脆弱性によるインシデントを防げなかった事例と見ることもできます。

The DAOへの攻撃は衝撃的な事件でした。The DAOは「非集権の自律的な組織」に関する実験であり、巨額の資金を集めて注目されたこともあって、そのコンセプトに関する議論が盛んです。一方、その根底にはソフトウェア開発にとって普遍的な問題がありました。人間が書くプログラムにはバグや脆弱性がどこかに潜んでいるので、堅牢なシステムを作るには人間のミスを前提とした取り組みが必要だったということです。

開発現場の目線で見るなら「人間のプログラマーがソフトウェアを開発するときの基本動作」が最も大事であるというのが、専門家の意見です。