WidnowsでOVAL情報を使おう

某所のブログ用に記事を書きましたが、無言でrejectされていたので、一部改変版をこちらで公開します。
; 採用しないならその旨を言って欲しい。

# そもそもOVALとは

OVALとは「セキュリティ検査言語」と呼ばれる、コンピュータのセキュリティ設定状況を検査するための言語です。ベンダごとに異なりますが、自動で脆弱性を検査するための情報が記載されています。

- Open Vulnerability Assessment Language
- セキュリティ設定共通化手順(SCAP: Security Content Automation Protocol)で定義された、XMLベースで機械的に処理が可能な、脆弱性検査用の言語
- OVALを用いてコンピュータをスキャンすることで、脆弱性の 対応済み/未対応 を検査することが可能
- 以前はMITRE社が管理していたが、今はCenter for Internet Security(CIS)社に移管されている

OVALのデータは、CIS社で公開されています。

- OVALのダウンロード
    - https://oval.cisecurity.org/repository/download
- OVALのスキーマは、3種類
    - v5.11.2, v5.11.1 の v5.11系
    - v5.10 系
    - すべて [条件付き](https://github.com/CISecurity/OVALRepo/blob/master/TERMS_OF_USE.md)ながら、商用でも利用可能
- Platformごとに、OVALデータが存在します
    - Linuxのディストリビューション、Windows OSのバージョン、Cisco asa/ios/ios-xe/pix, Vmware esx各バージョン、など
    - 自分が必要なPlatformのOVALのみをダウンロードして利用可能

OVALは、SCAPと呼ばれる「セキュリティ設定共通化手順(Security Content Automation Protocol)」の中の標準仕様の一つです。SCAPは、情報セキュリティ対策の自動化/標準化を目指したもので、機械的に処理ができることを目指したものです。同様に定義されている仕様で有名なものは、以下のものがあります。

- CVE：共通脆弱性識別子
- CPE：共通プラットフォーム一覧
- CVSS：共通脆弱性評価システム
    - OVALついては、今後のテックブログで情報を共有できたらと思います。

このOVAL情報、Windowsも（一応）検査することができるので、そちらをご紹介したいと思います。

# Windowsで使えるOVALインタープリタ

OVALで脆弱性を検査するためには、インタープリタと呼ばれる、OVALを解釈して検査するプログラムが必要になります。
現状で利用できるものは以下の3種類のようです。

- [OVALdi](https://www.decalage.info/en/ovaldi)
    - オープンな、OVALインタプリターのリファレンス実装です。
    - zipを回答するだけで実行ファイルが出てくるため、一番簡単に利用できます。
    - 最終更新が2014年と古く、少し問題がある
        - 英語版以外のWindowsだと、スキャン結果に問題がある可能性があるようだ。
        - 古めのOVALスキーマしか使えない(後述)
- [jOVAL](https://github.com/joval/jOVAL)
    - GPL v2.1で配布されています
    - javaが必要になるようです。スキャンのためにjavaを入れるのは、ちょっとハードルが高いかもしれません。
- [OpenSCAP](https://www.open-scap.org/)
    - SCAPのオープンな実装です
    - Linux関連では、パッケージとして配布されているので、簡単に利用可能です
        - `yum install openscap-scanner`や`apt-get install libopenscap8`などで導入可能
    - mingw32を使ったクロスコンパイルをすることでOVALスキャンができる、らしいです。
        - 私は1週間ほど試していますが…クロスコンパイルができません。
    - Windowsで使うには、難易度が高いようです。

今回は OVALdi を使ってみます。

# 試してみる
OVALでスキャンするまでの流れは、以下のとおりです。

- OVALdiをインストールする
    -  (OVALdiに必要な)Microsoft Visulal C++ 2010 再配布版をインストールする
- Windows用OVALをダウンロードする
- OVALdiでスキャンする
- OVALでのスキャン結果を確認する

## OVALdiをインストールする

OVALdiの[サイト](https://sourceforge.net/projects/ovaldi/files/ovaldi/)から、一番新しそうなインストーラをダウンロードしインストールします。

- ovaldi-5.10.1.7-x64-setup.exe か ovaldi-5.10.1.7-setup.exe
- このファイルを実行するとWiZipの解凍画面となるので、デフォルトのまま Unzip をする
    - `C:/Program Files/OVAL/ovaldi-5.10.1.7-x64`に解凍される
    - このまま実行すると、MSVCR100.dllがない、としてエラーになる

![ovaldi-unzip.png](https://qiita-image-store.s3.amazonaws.com/0/124868/267f6624-adf0-f90c-07a4-82d185f42929.png)


OVALdiが必要とする「Microsoft C++ 2010 再配布版」をインストールします。

- Microsoftのサイト([x86](https://www.microsoft.com/ja-jp/download/details.aspx?id=5555)と[x64](https://www.microsoft.com/ja-jp/download/details.aspx?id=14632)がある)でダウンロードする
- ダウンロードしたファイルを実行し、インストールする

これで実行環境の準備は完了しました。

## Windows用OVALをダウンロードする

CISのサイトから、利用するWindows OSに対応したOVALファイルをダウンロードします。

- [ダウンロードサイト](https://oval.cisecurity.org/repository/download)を開く
- "Click an OVAL version and class.."部分のVersions下で、 **v5.10** を選択する
    - OVALdiはv5.10までしか解釈できません。デフォルトではv5.11.2のOVALが選択されているので、注意が必要です。
        - WindowsServer2012R2の場合、"microsoft_windows_server_2012_r2.xml"というファイル名になります。
- ダウンロードしたファイルを、OVALdiと同じディレクトリに配置する
    - `C:/Program Files/OVAL/ovaldi-5.10.1.7-x64`等に移動させます。

![oval-download.png](https://qiita-image-store.s3.amazonaws.com/0/124868/8d940917-8ac7-1cd3-c9d0-3524bd789211.png)


## OVALdiでスキャンする
コマンドプロンプトを起動し、スキャンを行います。

- コマンドプロンプトを開く
    - 管理者権限は不要です
- OVALdiのディレクトリに移動する
- OVALdiでスキャンを行う
    - `ovaldi -m -o <OVALのXMLフィアル名>`を実行します
    - MSVCR100.dllがない旨のエラーが出ている場合、MS VC++ 再配布版のインストールが行われてないので、インストールをしてください
    - スキャンは5-10分ほどかかります

![ovaldi-scan.png](https://qiita-image-store.s3.amazonaws.com/0/124868/b3d51b8b-19dc-35de-baae-2c388f19e691.png)

無事にスキャンが終わると、カレントディレクトリに以下のファイルが生成されます。

- results.html
- results.xml

自動処理するなら、xmlを使ってください。

## OVALでのスキャン結果を確認する
今回は、結果のHTMLファイルを見てみましょう。
WindwosServer2012R2で、全くアップデートをしていないものをスキャンしました。

![result-html-berfore.png](https://qiita-image-store.s3.amazonaws.com/0/124868/62660f69-72bc-b566-e89a-9e6e52797d7e.png)


おおよそ以下のような内容になっています。

- ID
    - OVALで定義している、脆弱性エントリ（見る必要はない）
- Result
    - 脆弱性があったかのフラグ
    - trueは脆弱性が **残っている** 状態
- Class
    - 対象の分類、のようだ
    - 脆弱性検査はvulnerability、アプリケーションやOSの同定はinventory、となっている
- Reference ID
    - 該当するIDを表示
    - vulnerabilityの場合は CVE、inventoryの場合は CPEの表示、となっている
- Title
    - 概要の表示
    - WindowsのOVALの場合は、脆弱性の内容が記載されている
        - `Internet Explorer Memory Corruption Vulnerability - CVE-2014-1765 (MS14-037)`など

OVAL内容にはOracle JavaやMicrosoft Officeも含まれているため、対象のアプリケーションがインストールされていると、それを検知することができます。

この記事書いている時点でのOVAL情報だと、OVAL上には6615件のテストが書いてあるようです。

色々使ってみましたが、HTML表示を見る限り、サマリは正しいが 詳細行が正しくない、という状況が発生するようです。

- OVAL Results Generator Information の総数は正しい
- OVAL Sytem Characteristics Generator Information のテーブルが、数が足りない/Result:trueが消える？事があるようだ

# 結論
OVAL情報でのスキャンは、WSUSやWindowsUpdateと異なり、CVEベースでの残存脆弱性を確認することができます。
しかしながらOVALインタープリタの選択肢が少なく、少なくともOVALdiは日本語環境のWindowsでは正常でない「場合」もあるようです。

OVALを使うことで、既存のWSUSでの「適用管理」以外のセカンドオピニオンとして、Windowsでの「残存脆弱性管理」ができそうです。但し、OVALインタープリタを選ぶ必要がありそうなのすが、一応は OVALdiも利用できそうかと思います。

また、WindwosもCVEベースの脆弱性管理ができると、他のLinux等の脆弱性管理ツールとまとめて管理ができるようになる可能性があるので、今後もう少し調べていこうかと思います。