Web Application Security Memo

ウェブセキュリティに関するメモ書き

OWASP ZAP に追加された "Vulnerable JS libraries detection" アドオンのメモ

※当サイトにはプロモーションが含まれています。

公開日: 更新日:

(注意) アドオンのソースコードを見付けたので書き直しました。(2014-11-28)

昨日、OWASP ZAP の Passive scanner rules (alpha) に “Vulnerable JS libraries detection” というアドオンが追加されました。

既にZAP内の Marketplace からインストールできるようになっています。今回はこのアドオンに関して簡単にメモしておきます。

Vulnerable JS libraries detection アドオンとは?

  • Retire.js を使ったアドオンです。詳しくは以下の続きます。

Retire.js とは?

Retire.js

以下は、公式サイトでの説明です。

There is a plethora of JavaScript libraries for use on the web and in node.js apps out there. This greatly simplifies, but we need to stay update on security fixes. “Using Components with Known Vulnerabilities” is now a part of the OWASP Top 10 and insecure can libraries can pose a huge risk for your webapp. The goal of Retire.js is to help you detect use of version with known vulnerabilities.

Retire.js

つまり、脆弱性のあるバージョンのJavaScriptライブラリを検知することができます。

以下にあるように、いろいろな形で提供されているようです。

Retire.js has three parts:

1. A command line scanner
2. A grunt plugin
3. A Chrome plugin
4. A Firefox plugin

Retire.js

実際どんな処理をするものなのか?

  • まず Retire.js は 以下の2つの脆弱性データベース(JSONデータ)を持っており、これらはWeb経由で取得することができます。
    1. https://raw.githubusercontent.com/bekk/retire.js/master/repository/jsrepository.json
    2. https://raw.githubusercontent.com/bekk/retire.js/master/repository/npmrepository.json
  • 上記 jsrepository.json を使った判定処理では、この中に格納されたいろいろな正規表現を使って、検査対象 JavaScriptファイルのURI・ファイル名・中身からバージョン番号を特定しようとします。また、ファイル自体のHash値からもバージョン番号を特定しようとします。そして、それが脆弱性を持つバージョンであるかどうか判定します(脆弱性のあるバージョン番号の情報もjsrepository.jsonに入っています)。
  • npmrepository.json については ZAP用アドオンで使用されていないので、説明を省略します。

公式サイト

Retire.js の主な処理へのリンク

改めて Vulnerable JS libraries detection アドオンとは?

ということで、このアドオン(というか Passive Scan のテスト項目)では、ZAPをプロキシにしたブラウザでアクセスしたページのJavaScriptや、スパイダリングで対象になった JavaScript が脆弱性のあるバージョンである場合にそれを検知することができます。

このアドオンでは、2つある脆弱性データベースJSONのうち jsrepository.jsonのみ使用しており、アドオン自体がこのファイルを格納しているので、オフラインの環境でも診断することができます。

関連リンク

  • Retire.js の GitHub Issues のページで、このアドオンについてやり取りされていました。
  • 上記のページにも書いてありますが、とりあえずまだ zap-extensions のレポジトリにソースコードを移行していないようで、現時点では 以下にソースコードがあります。
  • Prezi というプレゼンサイトで、ZAP の Retire.jsサポートについて作者が説明しています。

ZAPのアドオンとしての検知処理

診断対象となるURIに対して、以下の処理を行います。

※ 以下、jsrepository.json のことを データベースJSONと書きます。

※ 以下に出てくる msg オブジェクトとは、診断対象となる URI に対してZAPが事前にアクセスした時の関連情報を保持しているオブジェクトです。

処理内容

  1. 診断対象外となるURIであるかチェックする。
    • 対象外であれば処理を終了する(データベースJSONには診断対象外にする JavaScriptのURIも定義されている)。
  2. データベースJSON 内の “uri” キー に対応する各正規表現文字列と、msgオブジェクト内のURI をマッチングさせバージョン番号文字列を取得しようと試みる。
    • 正規表現のマッチング処理により、バージョン番号を取り出せたら、データベースJSON内にある脆弱性バージョン番号と比較する。
      • 脆弱性のあるバージョンであれば、脆弱性有りとしてアラートテーブルに関連情報を追加して処理を終了する。
  3. データベースJSON 内の “filename” キー に対応する各正規表現文字列と、msg オブジェクト内のURIから抽出したファイル名をマッチングさせバージョン番号文字列を取得しようと試みる。(つまりファイル名の中からバージョン番号を取得しようとする)
    • 正規表現のマッチング処理により、バージョン番号を取り出せたら、データベースJSON内にある脆弱性バージョン番号と比較する。
      • 脆弱性のあるバージョンであれば、脆弱性有りとしてアラートテーブルに関連情報を追加して処理を終了する。
  4. データベースJSON 内の “filecontent” キー に対応する各正規表現文字列と、msg オブジェクト内のレスポンスボディをマッチングさせバージョン番号文字列を取得しようと試みる。
    • 正規表現のマッチング処理により、バージョン番号を取り出せたら、データベースJSON内にある脆弱性バージョン番号と比較する。
      • 脆弱性のあるバージョンであれば、脆弱性有りとしてアラートテーブルに関連情報を追加して処理を終了する。
  5. データベースJSON 内の “hashes” キー に対応する各JSONオブジェクト(A)のキー文字列と、msg オブジェクト内のレスポンスボディのハッシュ値をマッチングさせる。
    • 一致したら、(A)のJSONオブジェクトの値がバージョン番号になっているので、このバージョン番号と データベースJSON内にある脆弱性バージョン番号と比較する。
      • 脆弱性のあるバージョンであれば、脆弱性有りとしてアラートテーブルに関連情報を追加して処理を終了する。

その他

  • ZAPでは、新しいアドオンはまずアルファリリースとして追加されることになっています。もちろんこれはアドオンに問題がないか様子を見るためですが、今回のような外部のソフトウェアを利用したアドオンの場合は、最初から信頼性が高かったりするので、アルファリリースだからといって敬遠せずに導入してしばらく使ってみるのもありだと思います。
  • このアドオンは役に立ちそうです。

最終更新日: 2014-11-29

広告