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

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

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

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

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

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

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

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

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

2
神戸康多さんフューチャー株式会社 シニアアーキテクト。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を選定しました。

3

——まずは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

エンジニアHubに会員登録すると
続きをお読みいただけます(無料)。
登録のメリット
  • すべての過去記事を読める
  • 過去のウェビナー動画を
    視聴できる
  • 企業やエージェントから
    スカウトが届く