エンジニアHubPowered by エン転職

若手Webエンジニアのための情報メディア

ガンジス川で瞑想し、サウナでひらめきVulsができた - 各OSに対応する脆弱性スキャンを実現した手法

サーバー運用者の抱える「脆弱性対応の負担が大きい」という課題を解決するべく、神戸康多さんが開発したOSS「Vuls」。同ソフトウェアはなぜ複数OSの脆弱性を検知できるのか、その基本構造を聞きました。そして、神戸さんが語るVulsの開発の根本にあった、貢献意識とは。

Vuls神戸康多さんアイキャッチ

マカフィー株式会社が戦略国際問題研究所と協力して2018年3月8日に発表したレポート「Economic Impact of Cybercrime - No Slowing Down(衰えを知らないサイバー犯罪の経済的影響)」は、サイバー犯罪が世界経済にもたらした損害額は約6,000億米ドル(約63兆円)であると発表しています。「脆弱性をいかにして早期に検出し、対策するか」は重要なテーマと言えるでしょう。

Vuls(VULnerability Scanner)は、サーバーが抱える脆弱性の一覧を自動取得できるOSSの脆弱性検知ツールです。サーバー運用者の抱える「脆弱性対応の負担が大きい」という課題を解決するため、フューチャー株式会社の神戸康多(かんべ・こうた/ @kotakanbeさんが開発しました。いかなる設計方針でVulsを作ったのか、システム運用者は脆弱性とどう向き合うべきかを、神戸さんに伺いました。

脆弱性スキャンのツールを作るため、会社に直談判。家に3か月こもった

——神戸さんは、社業としてVulsのメンテナンスや商用版であるFutureVulsのプロダクトマネージャーを担当されていると伺いました。何をきっかけにVulsを作ることになったのですか?

神戸 あるとき、月次の定例ミーティングで「脆弱性スキャンのソフトウェアを開発させてほしい」と直談判したんです。当時の私はサーバー運用の仕事をしており100台以上を管理していましたが、各サーバーがどのような脆弱性を抱えているか調査するのが非常に負担でした。

そこで「世の中には、同じように脆弱性対応に苦労している人たちが数多くいる。解決する方法は見当がついており、3か月間ほどもらえればツールを開発できるので、私に時間をください」と発表しました。

神戸康多さん紹介カット
神戸康多さんフューチャー株式会社 シニアアーキテクト。2004年、フューチャーシステムコンサルティング株式会社(現、フューチャー株式会社)に新卒入社。R&D部門に所属し、様々なプロジェクトを技術的にサポートする傍ら産学連携の一環で東工大にてスケーラブルDBの研究にも参画。2016年にOSSの脆弱性スキャナ「Vuls」を発表以降、HITCON, Open Source Summit North Americaなど国内外で多数登壇活動を行う。一万人以上のエンジニアが参加する情報収集用公開Slack「モヒカンSlack」の酋長を務める。週3回のサウナが趣味。

——どうして、突然そんな大胆な発表を?

神戸 その理由はわりと長い話になるので、後で詳しく話しますね。意外なことに、私の直談判に上司が「いいよ」と言ってくれました。そこからは、ひたすら家にこもって朝から晩まで開発をする生活が始まりました。

——当時でも、脆弱性を検出するツールは数多くあったかと思います。そうしたツールを使うのでは不十分だったのでしょうか?

神戸 既存のツールの多くは、ルールベースであるため脆弱性を防ぎきれないケースが存在します。ルールベースとは、人間が決めたルールを元にしてソフトウェアの行動パターンを判定し、攻撃を検知するものです。人力ルールを作成するということは、脆弱性が公開されても即時ルールを追加できないという課題もあるということです。

近年、脆弱性が公開されてから攻撃コードのサンプルが登場するまでの期間が短くなっている傾向にあります。脆弱性の情報が世に出てから、翌日や翌々日には攻撃手段が知れ渡っていることも多い。一旦攻撃コードが公開されてしまえば、誰でも攻撃者になれてしまいます。

一例を挙げますと、2017年に東京都税クレジットカード支払いサイトに不正アクセスがあり、利用者のクレジットカード情報が流出した事件がありました。

このケースでは攻撃に使用されたのはApache Struts 2の脆弱性ですが、脆弱性の情報が公開されてからわずか数日のうちに攻撃が行われたそうです。

——恐ろしい……。もはやそのスピード感では、ルールベースのパッチを当てるまでの間に攻撃されてしまいますから、間に合いませんね。

神戸 他にはネットワーク経由でシステムをスキャンして脆弱性を見つけるサービスもありますが、実施には手間もお金もかかり、頻繁にスキャンを回せません。これらの課題を解決するには、なるべく毎日、それも安価にシステムをスキャンし、脆弱性が公開されていないかを確認できるツールが必要です。

——その課題を解決するために、Vulsを作ったのでしょうか。

神戸 そうです。VulsはOSの種類やその上で動くミドルウェア・ライブラリのバージョンを自動的に判定してくれ、脆弱性の有無を教えてくれます。サーバー運用者が特別な設定を行うことなく、ブラックボックス的に各サーバーをスキャンしてくれるんです。

ディストリビューションごとの設定差分を、いかに吸収するか

——Vulsの開発を開始し、最初は何から着手しましたか?

神戸 まずはGoの勉強からです(笑)。もともと私はGo未経験者でしたが、Vulsの開発にはGoを用いると決めたからです。

——Goの利点は何でしたか?

神戸 用途として複数サーバーに対して並列処理を行うことを想定していたので、goroutineが活きるユースケースです。さらにGoを使えば、ツールを配布するときのクロスコンパイルも簡単になります。

また、当時の私はエディタとしてVimを使っていましたが、その頃はfatih/vim-goというVimプラグインが、Goを書くにはもっとも便利という状況でした。VimユーザーはGoを書くという点においてアドバンテージがあったわけです。

また、規模の大きなソフトウェアになることが目に見えていたので、静的型付け言語の方がメンテナンスしやすい。こうしたさまざまな利点からGoを選定しました。

神戸康多さん紹介写真2

——まずはGoを覚えて、次は何をしましたか?

神戸 Vulsのふるまいとして、各サーバにSSHで接続してOSのディストリビューションやインストールされているミドルウェア・ライブラリなどを調べるコマンドを発行し、戻ってきた標準出力を解析してさらにコマンドを発行していく、という処理イメージはついていました。

処理を実装するうえで、サーバの状態をテストするOSSのServerspecのコードを参考にしました。各サーバにSSHで接続してコマンドを発行する、という処理がVulsと共通しているので、コードを参考にできると考えたわけです。

——ツールを作る際に、他のOSSの実装を参考にするのは重要なことなのですね。実装にあたり苦労したことはありますか?

神戸 OSのディストリビューションごとに、コマンドの発行方法を使い分けなければならないことです。RedHat Enterprise Linux系は比較的簡単なんです。yum-plugin-securityというプラグインを入れて、コマンドオプションを指定して実行すればいい。パッチが当たっていない部分に含まれる脆弱性のリストが一覧表示されるので、その情報を元にすれば判定できます。

一方で、CentOSではyum-plugin-securityが動きません。そのためCentOSでは、yumパッケージのchangelogの差分情報を取得して、CVEに関するテキスト情報をパースするような形をとっていました。現在は設計が変わっていますけどね。

——地道にディストリビューションの差分を吸収しているのですね。

神戸 それぞれの方法を思いつくまでは大変でした。開発当初にボツになった案もあります。もともとは、NVDの情報をもとにサーバーにインストールされているソフトウェアのバージョンを比較し、脆弱性を検出しようと試みていたんです。NVDはアメリカ政府の支援を受けた非営利団体MITRE社が管理する脆弱性管理データベースのリポジトリで、脆弱性は指摘されるソフトウェアのバージョンが書かれています。

ですが、NVDに記載されているのは、あくまでソフトウェアの本家のリポジトリのバージョン情報なんですね。Linuxディストリビューションは、本家のリポジトリで修正されたバグフィックスをバックポートして脆弱性に対応しているので、NVDに書かれているバージョン情報を使えないんです。

そのためNVDのバージョンをもとに処理してしまうと、未検知、誤検知がたくさん出てしまいます。それでボツになりました。

解決策が見つからず「困ったなあ。どうしようか」とサウナに入って考えていたんです。あ、私、サウナが趣味なので。そしてあるとき、「changelogの差分を見ればいい」と閃いたんです。すぐに帰って実装しようと興奮しましたが、一旦水風呂に入りました。余談ですが、Vulsの設計案はサウナで考えついたものがいくつもあります(笑)。アイデアが浮かびやすいんです。

パフォーマンスを10倍にした、衝撃のPull Request

——Vulsは公開後に多くのユーザーの支持を集めました。また、OSSとしてリポジトリを公開した時点から、神戸さんはSlackのコミュニティも開設されています。コントリビューターの方々に手によって、Vulsが改善した例はありますか?

神戸 CentOS系でchangelogの差分を見て脆弱性判定を行った、という話をしましたが、この処理は多くの方の手によって性能が改善されてきました。例えば、処理の実装方法を変えて、性能が一気に10倍から100倍ほど速くなる修正をしてくれた方がいました。

——10倍から100倍とはすごいインパクトですね。なぜ、それほどの性能改善ができたのですか?

神戸 かつての実装では、アップデート対象となるパッケージが100種類あるとすれば、パッケージごとにアップデート情報を取りに行っていました。100回リクエストを投げていたわけですね。goroutineを使ってパラレル実行で頑張っていましたが、それでも遅かったんです。

でもchangelogには、スペース区切りで100個のパッケージ名を連結して入力することで、100種類分のchangelogが一気に取れるというオプションがあります。そのオプションを用いることでリクエストを一回で済ませて、返ってきた結果をパースさせるという修正をしてもらったんです。その修正によって劇的に性能が改善しました。

Vulsに送られたプルリクエスト

こちらがそのPull Request。「この修正を見たときは相当な衝撃があった」と神戸さんは語る。

それから印象深いのが、2〜3回ほどVulsにPull Requestを送ってくれた方がいたんですが、コードの書き方が明らかに只者ではなかったんですね。すごいと思ってどんな人か調べたところ、日本人でした。なんとかして開発の仲間に引き込みたいと思って、一緒に飲みに行って勧誘して、当社で一時期Vulsのメンテナンスをしてもらったことがありました。

コンテナの脆弱性スキャナのTrivyって知っていますか? 最近、Aqua Securityという海外企業から買収の申し出を受けた。あのツールの作者である福田鉄平(@knqyf263)さんが、その方です。彼のコードは常に完璧でした。

彼と一緒に、Vulsの実装をさらに良くしていきました。またもchangelogの実装の話になりますが、現在は先ほど話に出てきたような実装方法を使っていないんですね。

——では、現在はどのような実装に?

神戸 セキュリティ検査言語であるOVALを使う方針に変えています。

どんなに処理性能が改善したといっても、changelogを並列で取得する処理はサーバーへの処理負荷もかかりますし、誤検知が起きる可能性をゼロにはできません。しかし、OVALを使うことで正確にバックポートの情報も吸収できて、処理も速くできることを、Vulsのコミュニティの方々から教えてもらえたんです。

これは良いと思って、福田さんと一緒にもくもく会に行き、OVALのスキャン処理をふたりで一晩で実装しました。思い出深いです。

「攻撃は簡単にできてしまう」ことを知るべし

——脆弱性についての知識を、どのように身につけるのがいいでしょうか?

神戸 脆弱性対策の概要については、IPA(IPA 独立行政法人 情報処理推進機構)が各種資料を公開しているので、その情報を読むといいです。NVDやJVNなどで毎日公開される脆弱性情報には、脆弱性の深刻度やどのような経路で攻撃されるのかなどが記載されているため、読み方がわかれば脆弱性の内容が読み取れるようになります。

それから、「攻撃は誰でもできてしまう」という意識を持つことが大事です。私もそうでしたが、「脆弱性を利用して攻撃してくるのは一部の凄腕ハッカーだけで、まさか自分が攻撃されるわけはない」という意識がどこかにある。ですが、脆弱性を利用した攻撃コードはサンプルが公開されているので、実は誰でも攻撃者になれてしまうんです。

神戸康多さん紹介写真

——そういった情報を得るには、どこを調べればいいのでしょうか?

神戸 例えばExploit Databaseです。 これはさまざまな脆弱性ごとに攻撃コードサンプルの一覧が掲載されているサイトで、全部で4万件以上ものデータがあります。この情報を使えば、実際にコードを書いて、検証環境に対して攻撃を試してみることが可能になります。

1回でもやってみると、専門的な知識などなくても攻撃できることがわかるはずです。こういう経験をすると、脆弱性対策をしないことの危険さが実感できます。

——他に、脆弱性対策において知っておくべきことはありますか?

神戸 脆弱性のトリアージ(対応の緊急度に従って優先順位をつけること)が必要だということですね。特定のサーバーに内在している脆弱性の種類は山ほどあり、その全てに対応するのは現実的ではない。どれを対応するかの優先順位づけが必要になります。

——何を基準に、優先順位を決めるべきでしょうか?

神戸 いくつかコツがあります。まずは、攻撃コードが公開されているかどうか。攻撃コードが公開されるとそれほどITスキルが高くない方でも容易に攻撃者になれてしまうので、セキュリティリスクがかなり高くなります。

近年は多層防御が基本になっていますから、「どの層でブロックできているか」を知ることも重要です。もしLinuxに脆弱性があったとしても前段にあるWAFなどでブロックしているならば、リスクは下がるわけです。

それから、「仮に攻撃が成功した場合に、何が発生してしまうか」も知っておく方がいいです。例えば内部犯行の防止を考慮した運用をする場合、一般ユーザーがroot権限を得られるような権限昇格系の脆弱性には「確実に対応しなければ」と方針決定できるでしょう。脆弱性をよく知ることで、どういうリスクが許容できて、どういうリスクは許容できないのかを知っておかなければいけません。

ただし、判定には専門的な知識が必要なので、脆弱性の対応要否や優先順位付けを楽に行えるようにと作ったクラウドサービスが、冒頭でも話したFutureVulsなんです。このサービスの売り上げで利益が出たならば、Vulsの開発にもっと多くの人をアサインして、持続可能な形でOSS開発を続けていけたらと思っています。

ガンジス川で瞑想したら「OSSで世界貢献」という答えが出た

——冒頭で、「大胆な発表をしたのには理由がある」という話をされていましたが、その理由とは何だったのですか?

神戸 わりとエモい話になりますが、いいですか?

——ぜひどうぞ。

神戸 自分は入社してから10年ほど、努力する理由は「自分のエンジニアとしての腕を上げる」とか「もっと稼げるようになる」などでした。でも、30歳前半になったとき「自分のしてきた努力は、本当に世の中のためになっていたんだろうか」という疑問がふつふつと湧き上がってきたんです。

ちょうどそのタイミングで、会社からボーナス有給を10日間もらいました。せっかくなので、インドに行ってみようと考えました。

——インド、ですか。どうして?

神戸 学生時代にインドにバックパック旅行に行ったとき、現地でおじさんに話しかけられたんですよ。「インドに来る日本人には2種類いる。インドにはもう絶対に来ないという人と、もう1回インドに来たいという人だ。そして、君はもう一回インドに来るね!!!」と。こっちを「ドーン!!!」と指差しながら言われたんですよ。

神戸康多さん笑顔

——強烈すぎる(笑)。

神戸 それが強い暗示になっていたようで、ボーナス有給をもらったタイミングで発動したんです。「インド、行こう」と。有給だけでは足りず、1か月ほどの長期休暇申請を出して旅行したんですね。まずはネパールから入ってインドに向かったんですが、ネパールの途中にはブッダが産まれたというルンビニという土地があるんです。

ここには各国の寺が建っていて、観光客が寺に何日か入って修行できます。せっかくなので修行をしようと思って、寺に滞在しました。修行中に出会ったのが、80歳くらいの修行僧でした。

その方は、17歳の頃から80歳まで数十年間も修行を続けていました。「何のためにやっているんですか?」と聞いたら「世界平和のためだ」と答えてくれたんです。数十年もやっている人だから、その発言にめちゃくちゃ説得力があったんですよ。私は反省したんです。彼は世界のために自分の信じたことをやっている。でも自分は、技術力を自分のためにしか使ってこなかった、と。

神戸さんが出会ったインドの修行僧

インドでの一コマ。右に写っているのがその修行僧だ。

自分も社会貢献がしたいと思ってガンジス川で瞑想していたら、たどり着いた答えが「OSSで世界に貢献したい」だったんですよ。自分はソフトウェアエンジニアですから、世界中の人たちに使われるツールを作れば多くの人たちが幸せになります。それは世界のために技術を使うことと同義だと、インドで悟ってしまったんですよ。

——壮大なエピソードになってきましたね。

神戸 悟ったのでやるしかないとなって、その後に日本へ戻って直談判します。冒頭の「3か月こもらせてください。やることができました」という話につながるわけです(笑)。

——すごい話ですね(笑)。でも、それで実際に世界中で使われるツールを作るのですから驚きです。読者である若いエンジニアにもOSSを作って世の中に貢献したいと考えている読者はきっといます。そういった方々にアドバイスはありますか?

神戸 「まずはやっちゃえ!」って感じです。それから、ひとりではなかなか長続きしないので、コミュニティを作った方が絶対に良いですよね。Vulsも初期の頃からコミュニティを作れたことによって無理なく発展できましたし、色々なアイデアが生まれやすくなりました。

それから、恥ずかしがらずに勉強会などで発表していった方がいいです。そうすると人と人との繋がりができて、また新しい可能性が生まれるので。私の場合は、最初はJuly Tech Festaインフラ系のイベントで発表したら、Webメディアの編集長がたまたま来てくれていて取材を受けて、それをきっかけにいろいろな人からお声がけいただき、さらに勉強会で発表する機会をいただけるようになりました。

外に出ていくことで人がきっかけをくれて、可能性がどんどん広がっていきます。たくさんの人が応援してくれるようになるから、チャンスも生まれていきます。だから遠慮せず、飛び込んでいったらいいんじゃないですかね。

関連記事

取材・執筆:中薗昴