Calendar2018の23日目の記事です。この記事は私と、同じくSecurity室の愛甲で書いています。2018(全セッション動画)などのイベントでも既にお伝えてしている通り、LINEではブロックチェーンを利用したサービス群の開発にも力を入れており、日米除くグローバルで取引が可能な仮想通貨交換所「BITBOX」も提供しています。仮想通貨は世の中にある金融サービスの中でも比較的新しいジャンルのサービスであり、セキュリティの領域でも非常に注目が集まりやすいものとなっています。そこで、この記事では仮想通貨交換所(取引所)を運営する上で必要となるセキュリティ技術について解説したいと思います。はじめにはじめに代表的な仮想通貨であるBitcoinについて簡単に触れさせてもらいます。オンラインの決済においては物理的なお金(硬貨やお札)を直接送ることはできませんから、代わりにそれと同価値のデジタルデータを送る必要があるわけですが、デジタルデータは当然複製(コピー)が容易です。簡単に複製できるものをお金として扱うことはできないため、一般的にはお金を管理する中央機関(銀行など)を利用してオンライン決済を実現します。信頼できる中央機関を用意すれば、”中央機関が不正をしないこと”を前提としてオンライン上における決済が可能になるわけです。Systemであり、Bitcoinそのものです。Bitcoinに関する解説はすでに多くあるためこの記事では詳細は触れませんが、分かりやすい技術資料としてBitcoinを技術的に理解するをご紹介させていただきます。Problem)に対するひとつの解であり、また興味深い発明ですが、いくつかの問題(リスク)も抱えています。暗号アルゴリズムの危殆化(きたいか)ソフト/ハードフォークこれらは(Bitcoinを含む)仮想通貨そのものが抱えるリスクであり交換所側で行える対策は少ないのですが、仮想通貨における問題はそのまま交換所にも影響を与えるため、セキュアに運営するためにはやはり無視できません。よって、まずは前半で仮想通貨に関連するリスクについて簡単に解説し、それから後半部分で仮想通貨交換所を運用する上で守るべきセキュリティにフォーカスしていきたいと思います。miningについて解説します。これらはどちらも交換所に対して被害を与えうる攻撃手法です。attack)が可能になります。attackが行われました。これにより交換所は数億円の被害を被っています(bitcoingold.org:double-spend-attacks-on-exchanges)。Distributionを見ると分かりますが、上位4,5つほどのマイニングプールを合わせると51%を超えます。attackは可能です。attackを成功させるために必要なコストをざっくり調べられるサイトCrypto51もありますから、それなりの計算リソースがあるならば(成功しそうな仮想通貨を選べば)それほど難しくないのかもしれません。miningがあります。miningは自身のマイニング結果をブロードキャストせずにチェーンを(秘密裏に)成長させ、パブリックチェーンより長くなったタイミングでブロードキャストします。attackと同様に)二重支払いを行えます。attackと同じくそれなりの計算量が必要ですが、Sapirshtein氏の論文によると25%でも可能とのこと。Attack、モナコインへのセルフィッシュマイニング)。これらは交換所としても被害を被る立場であるため注視しておきたい事柄です。このような攻撃には根本的な対策法がなく、決済確定と判断するチェーンの長さをある程度長く設定することくらいしか現実的な対応策がありません。仮想通貨におけるもっとも大きなリスクのひとつと言えるでしょう。次に実装上のバグ/脆弱性による攻撃についても紹介しましょう。Overflowにより、異常な量のコインを得ることができた脆弱性です。(CVE-2018-10299)に書かれてありますので、興味がある方は参照してください。Overflowであり、uint256である2つの値cntと_valueを乗算したものを、同じくuint256の値であるamountに代入するコードに問題がありました。_value=0x800000...00のような値にすると乗算の結果overflowし、amount=0となります。本来amountにはcntと_valueの乗算の結果が入るはずが、overflowにより0となり以降のエラーチェックをパスして_valueの値(送金額)が宛先に送信されました(攻撃のTransaction)。DAO事件」があります。一時期話題になったため知っている方も多いと思いますが、この事件は脆弱性自体にはそれほど特筆すべき点はないのですが、事件前後の議論やその対応はとても興味深いものです。Classicの分裂)、様々な議論が巻き起こりました。このように仮想通貨の実装上のバグ/脆弱性による攻撃は金銭的、社会的な側面においても極めて大きな問題となります。トランザクション展性はどちらかというと交換所システムの脆弱性であり、仮想通貨実装の問題ではないため交換所のセキュリティとして扱うべきなのですが、バグ/仕様を利用した攻撃だったということでついでにここで説明したいと思います。トランザクション展性は、トランザクション内のscript_signatureの意味を維持したままコードを変えることで、トランザクションIDは異なるが”同じ意味を持つ”トランザクションを生成できる問題です。script_signatureは秘密鍵による署名対象になってないが、トランザクションIDの生成には使われる点がポイントです。このとき交換所システムが、出金の管理をトランザクションIDのみで行っていた場合、ユーザーは交換所に対して出金の申請をし、そのトランザクションを交換所がブロックチェーンに追加する前に(もしくはそれを妨害して)IDが異なるトランザクションを先にブロックチェーンに追加することで、交換所にトランザクションが失敗したと認識させることができます。ブロックチェーン上では異なるトランザクションIDで取引が完了しているため交換所はそれを認識できず、再度出金申請を受け付けてしまいます。このように、システムに単純なバグがあっただけで結果的に交換所から多大な(数百億単位の)被害が出てしまったという実例はいくつかあります。ちなみにMt.Goxの件はこれが真実ですというように明確に原因を語られたわけではないため、本当のところは分かりません。交換所を運営する上での教訓は十分すぎるほど得られます。miningとは異なり実装におけるバグ(脆弱性)であるため、コードを修正すれば再発はしません。仮想通貨もソフトウェアである以上バグはつきものです。発見されるされないに関わらず、開発が進められていく上で多くのバグが生み出されては修正されていきます。これはソフトウェアエンジニアリングにおいては当たり前のことなのですが、こと仮想通貨に関してはそれが金銭問題に直結するため、交換所の運営においても常にセキュリティ情報をチェックしておかなければなりません。ここまでに挙げた例はほんの一部であり、実際に起こった事件は他にも多くありますので興味があれば調べてみてください。事件になったわけではありませんが、他にも暗号/ハッシュアルゴリズムの危殆化やハードフォークによる仕様変更などセキュリティ的に考えておくべきリスクは多々あります。このような仮想通貨のリスクに注意しつつ、交換所そのもののセキュリティについても考える必要があります。交換所のセキュリティ本稿は仮想通貨交換所のセキュリティ入門記事ですので、ここからは対策を中心に交換所を運営するにあたり必要となるセキュリティ対策について書いていきたいと思います。交換所は各ユーザーに紐付けられた財布(Wallet)を取り扱います。交換所にとってはこの”ユーザーのWallet”が最優先で守らなければならない”情報資産”になります。Walletは(運用方法にもよりますが)1つ以上の署名鍵の集合なので、Walletを保護することは署名鍵を守ることとほぼ同じです。署名鍵を紛失することは仮想通貨で管理しているお金を紛失することとイコールですし、署名鍵が盗難に遭うということはお金を盗まれることとイコールです。よって、仮想通貨交換所のサービスを構築する上で最初に考えるべきは”署名鍵を安全に管理する方法”です。仮想通貨に限りませんが、鍵管理において重要な要件は以下になります。鍵にはアクセス制限をかけ、かつ、アクセス頻度は最小にすべきというのは確かに至極当たり前のことなのですが、仮想通貨における署名鍵は(利便性のために)なるべくオンラインに置きたいのもまた事実です。絶対に保護しなければならない一方で、Transaction生成のために頻繁に利用したいものでもあるのです。よって、まずは交換所における鍵の保護技術について、主に以下の3つについて書いていきたいと思います。Module)マルチシグ(Multisig)これらは”鍵を保護/管理する”という点において共通の目的を持った技術です。ひとつずつ説明していきます。walletと呼びます。walletと呼称されることもあります。walletはNWに接続されたアプリケーションである性質上、取引したい際にすぐにTransactionを作成、ブロックチェーンに追加できますが、その分署名鍵やアプリケーションに対するハッキングの危険性があります。walletに必要以上の通貨が置かれており、それらがリモートから盗まれたことによる被害です。walletに比べて下がります。walletのバランスが適切になるように運用されています。walletの一例ですが、LINEのサービスにおいてもほぼ同様の仕様で管理されます。walletに保管される鍵(通貨)の量もそれなりの規模になります。よって鍵の管理についても考える必要があります。そこで決定性ウォレットという技術があります。決定性ウォレットとは、あるデータ列(マスターシード)から複数の署名用鍵ペアを生成する仕組みです。これを階層化し、マスターシードから親となる鍵ペアAを作成し、Aから子となる鍵ペアBを作成、さらにBから孫となる鍵ペアCを作成できます。いわゆる階層構造に連鎖した鍵ペアを作れるため、例えば鍵ペアCを特定のユーザーXに紐づけておけば、ユーザーXの取引はすべて鍵ペアCから生成できる”新しい鍵”で行えます。マスターシードが盗難されると、そこから作られたすべての鍵も盗まれたことになるため、マスターシードは厳重に保管しなければなりません。署名鍵の保存方法についても言及しましょう。サーバ・ストレージに格納された署名鍵は生成過程においてどうしても作業者あるいは作業環境であるマシンに鍵情報が露出、残存してしまいます。極論ですが、メモリ上のどこかには鍵の生成や署名に関するデータが(一時的にであれ)展開されるわけですから、100%安全に鍵を生成、管理することはまず無理です。そこで生成と署名に特化したHardwareを利用することで対応します。Module内で完結させ、実行結果だけを受け取ります。walletで利用される署名鍵をより安全に保護することができるわけです。ServiceのSolutionには様々なものがありますが、仮想通貨交換所の規模に応じて署名鍵の保護に最適なものを選択する必要があります。マルチシグ(Multisig)交換所の運営においては”いかに鍵を安全に保管するか”が重要ですが、それに加えて意図しない消失、盗難への対策も考えておくものです。通常Transactionの生成に必要な署名鍵はひとつですが、この鍵を複数用意し、それらを含めたグループを作成、そしてグループ内の鍵のうち、予め定義されたいくつかの鍵による署名がなければ有効なTransactionとみなさないという仕組み、これがMultisigです。3′′のように表記され、これは”3つの署名鍵で構成されたグループのうち、2つの署名鍵が集まらなければ有効にしない”ことを意味します。Multisigは多くの仮想通貨でサポートされており基本的なセキュリティ技術となっています。Multisigのセキュリティ的なメリットは主に2点あります。単独の責任者(企業)による不正を防止できる署名鍵を紛失しても(必要な署名鍵があれば)仮想通貨のやり取りを継続できるMultisigは有効なセキュリティ対策のひとつで、Bitcoin含め、多くの仮想通貨にはTransactionのためのScriptが実装されており、それによりMultisigを実現しています。ちなみにEtheriumのScriptはチューリング完全であり、Multisigに限らず、実に様々な用途でScriptを利用する目的で開発が進められています。興味があれば「スマートコントラクト」で検索してみてください。最後に認証と不正検知についても少しだけ触れることにします。これは交換所だけでなく一般的なWebサービスにおいても同様の問題ですが、お金を扱うサービスの場合はよりユーザー認証を強化する必要があります。ユーザー名とパスワードを用いた認証は一般的なWebサービスでも当たり前に使われていますが(特にお金を扱うサービスの場合)それだけでは十分とはいえません。LINEでは昨年よりアライアンス加盟して実装を進めているFIDOのようなテクノロジーがありますが、こうした認証のSolutionは仮想通貨交換所サービスへの導入にも適しています。認証の高度化に関しては様々なアイデアがありますが、パスワードに加えて生体や物理デバイスなどの別要素を用いる「追加認証/二段階認証」を重要な操作に導入してもよいでしょう。仮想通貨取引のような金融サービスでは不正検知の仕組みも必要です。addressが使われていないかこれまでの挙動と異なる不自然な取引が発生していないかこのような検知項目を定量的に監視し、異常な取引を発見した場合に速やかに調査、問題を解析できるような仕組みを整備していくことも仮想通貨交換所の運営では検討されなければなりません。不正検知はSecurityの一分野でもあり、これはこれで様々な技術が必要となるのですが、仮想通貨のセキュリティからは離れてしまうため本稿では触れる程度にとどめておきます。まとめ仮想通貨交換所の運用に関するセキュリティについて簡単に書かせていただきましたが、いかがだったでしょうか。入門記事ということで代表的な題材をまんべんなく取り上げましたが、基本的には”いかに利便性を担保しつつ鍵を保護するか”と、”いかに認証と不正検知によりユーザーの安全性を保つか”、この2点がポイントだと思います。それらに加えて(前半部分に記述したような)仮想通貨そのもののリスクについても日々調査、チェックし、可能な限りリスクを0に近づけることが重要です。仮想通貨はセキュリティという観点から見てもとても興味深い題材です。miningなど、はじめから仕様としての問題(リスク)をいくつか抱えており、それと引き換えに”中央機関を必要としない”というコンセプトを実現しています。関わらず、そのコンセプトとは裏腹に仮想通貨交換所という”信頼すべき中央機関”が存在します。個人で取引を行うこともできますが、多くの人が交換所を利用していることは事実です。その結果、交換所からの情報漏洩、プログラムの脆弱性、暗号アルゴリズムの危殆化といった様々な問題に目を向けなければなりません。様々な分野の知識が必要という感じですが、セキュリティエンジニアとしてはこれ以上ないやりがいのある仕事だとも言えます。LINEでは仮想通貨交換所を始めとした金融サービスの安全性確保について様々な取り組みを行っています。Financial】も募集していますので、もし興味があればぜひ応募していただきたいと思います。etc...)」です。Developers。