VAddyとOWASP ZAPの比較

## はじめに

VAddyミートアップなどでVAddyを使ってくださっている人、あるいは興味を持って頂いた人にたまに質問されるのが、「OWASP ZAPとVAddyはどう違うの？」ということです。確かに「ウェブアプリケーションの脆弱性を検出するソフトウェアである」という点では共通していますが、実際のプロジェクトへの適用を想定すると、かなり異なる存在だと考えています。このエントリでは簡単にVAddyとOWASP ZAP(以下ZAP)の違いについて書いてみたいと思います。


## OSSかどうか

ZAPはOSSです。無料で使用でき、ソースコードにもアクセスできますし、自由に改変することができます。一方VAddyはフリープランが用意されており無料での使用は可能ですが、基本的に商用サービスであり、フリープランでは機能は限定されています。VAddyはソースコードは公開されておらず、アクセスできませんし、そのため改変することもできません。


## アプリケーションの提供形態

ZAPは基本的にはGUIのアプリケーションです。スタンドアローンで提供されており、自分のPCにインストールして使うタイプです。REST APIの機能も用意されていますが、基本的に「デスクトップ生まれのデスクトップ育ち」という印象を受けます。

- アプリケーションをどこにインストールしてどのように使うか
- 診断した際に生成されるデータをどこに保存するか、どう管理するか
- 中長期的にアプリケーションのバージョン等をどのように管理していくか

などはユーザ自身が面倒を見る必要があります。


一方、VAddyは最初からクラウド型(SaaS型）のサービスとして開発されており、デスクトップアプリケーションではありません。インストールやアップデート、診断実行後のデータの管理などはすべてサービスの一部として行われるため、ユーザは自身の開発するアプリケーションの脆弱性の問題に意識と時間を集中させることができます。


## 使いやすさ

ZAPはプロ向け、VAddyはごく普通の開発者向けです。ZAPは脆弱性診断のプロでないと使いこなすことが難しい面があり、一般的な開発者が片手間に「ちょっと脆弱性診断してみようか」という感じで使うのは厳しいと思います。一方でVAddyは「シンプルに」「一般的な開発者であれば誰でも簡単に導入できるように」というのを基本的な考え方として掲げており、脆弱性に関する専門的な知識がなくても使い続けていくことができるサービスになっています。


## 検査項目の種類

ZAPはかなり細かい項目（あまり深刻な脆弱性でないもの）などについても細かく指摘してくれる面があります。これはメリットでもありデメリットでもあると思います。

「…いや、それは結構どうでもいいんじゃないか？」という脆弱性の指摘がなされた場合に、それを「これはスルーして大丈夫」あるいは「これは対応する必要がある」と人が判断する必要がありますが、その際には専門的な知識が必要となります。

一方でVAddyは検出する脆弱性を絞っており、基本的には「見つかったら必ず対応が必要」というスタンスです。わかりやすい一方で、「ZAPは検査してくれるけどVAddyはしてくれない」検査項目も存在します。VAddyが検査するのはSQLインジェクション、コマンドインジェクション、リモートファイルインクルージョン、ディレクトリトラバーサル、クロスサイトスクリプティングとなっていて、非常にシンプルです。


## CIへの組み込み

脆弱性診断をCIに組み込んでビルド毎に検査していくという流れは少しずつ当たり前のものとなっており、ZAPもCIへの組み込みを意識しているようです。しかしCIへの組み込みの際に必要となるAPIについて見てみましょう。[ZAPのAPI一覧](https://github.com/zaproxy/zaproxy/wiki/ApiGen_Full)などを見てみるとわかるように、デスクトップ版の持つ複雑さ（機能の豊富さの裏返しではありますが）がそのままAPIに持ち込まれてしまっています。これは開発者が本業の合間に「よし、ちょっと脆弱性診断をCIに組み込んでみるか」というノリで立ち向かえるものではありません。

一方VAddyはまさに「CIに脆弱性検査を組み込むため」に生まれたソフトウェアであり、「開発者にいかに負荷をかけずにCIに脆弱性検査を組み込んでもらえるか」を重視しています。[VAddyのAPI](https://github.com/vaddy/WebAPI-document/blob/master/VAddy-WebApi-ja.md)は必要最低限なものだけが用意されているので、「私はどのAPIを呼ぶべきなのか…」と開発者がAPIリストとにらめっこする必要はありません。

開発者にとって脆弱性診断は目的ではないので、いかに低コストにスムーズにCIに組み込んでしまえるかが大事だと考えています。「ZAP職人」はいるかもしれないが、「VAddy職人」は必要ない、という考え方です。

ZAPをCIに組み込む場合、落ちたりしていないかどうか、サーバとして死活監視し管理していく必要があります。一方VAddyはクラウド上のサービスであるため、開発者が監視や管理を行う必要はありません。


## 設定項目の複雑さ

ZAPは多くのメニューや設定項目を持っており、使いこなすには開発者が「ZAP職人」となる必要があります。例えばウェブアプリケーションにおいて一般的である「ログイン」という概念について、ZAPでは設定メニューを開き、「ログイン中の画面では、HTML内にこのような文字列が存在している」と開発者自身が正規表現でわざわざ設定を行う必要があります。初期に設定の手間が発生するだけでなく、ウェブアプリケーションの更新によってこの文字列が変更されてしまったら、それに合わせてZAP側も変える必要があります。

一方VAddyはとことん「シンプルさ」を追求しており、「最小の設定でまともに動作すること」を実現しています。ログインする必要があるアプリケーションの診断においても、開発者はクロール以外に設定作業を行う必要はありません。ある画面の診断において「ログインが必要かどうか」「ログアウトしてしまったかどうか」などをVAddyはAI的に自律的に判断します。必要に応じて再びログインプロセスをやり直し、診断を継続します。CSRFトークンやCookieも、必要に応じて更新していきます（ZAPがCSRFトークンやCookieをどの程度適切に扱ってくれるのかについてはまだ調査できていません、すみません…）。


## まとめ

以上のように、ZAPは脆弱性診断のプロセスに手間暇(稼働コスト)をかけることができる脆弱性診断のプロ向けのツールであり、一方でVAddyは「CIに組み込んで継続的に脆弱性診断したい」と考える開発者をターゲットとしたサービスである、というのが私からの答えとなります。

VAddyは表向きのインターフェースはシンプルにしながら、裏ではかなりインテリジェントな診断を実現するために面白い技術を使っているので、いつかさらに踏み込んでZAPとの比較をしてみたいなと思います。

また、第三者的な立場からの比較として、[エクスジェン･ネットワークス株式会社の野村さんの比較（スライドの24枚め）](http://sssslide.com/speakerdeck.com/vaddy/idguan-li-falsekuraudosabisuextic-niokerusekiyuriteifalsequ-rizu-mi)なども参考になるかと思います。