nvd

NVDのXML Feedから脆弱性情報を正しく取れない件

Qiitaのみなさん、お久しぶりです。
去年は忙しくてサボってましたが、2018年はちゃんと技術に関するアウトプットをするぞ

NVDのXML Feedsが壊れている

NVDは脆弱性情報が集まっている場所として非常に有名です。ここはヒューマンリーダブルなWebページだけではなく、XMLなどで脆弱性情報をフィードしてくれる機能があります。
このXML Feeds(僕はVersion 2.0を主に使っています)は11月の後半くらいから正常な応答を返さなくなっており、完全な脆弱性関連情報を入手することができなくなっています。

この件について、僕の方では12月頭に検出しNVDに問い合わせていますが、問題を確認してもらった後から返事がなくなってしまい、一ヶ月ほど、催促しても応答してもらえなくなっています。
XML Feedsに依存して動作しているシステムは多いと考えられ、影響がありますので、情報共有のためにブログにします。

壊れ方の詳細

XML Feeds(2.0)は、CVE番号ごとに脆弱性が影響する条件に関するデータを含んでいます。具体的には、脆弱性が影響する対象ソフトウエアの一覧や、そのソフトウエア同士の組み合わせがあります。一般的に、脆弱性情報のピックアップを行う場合、この情報が注目されています。しかし、現状のNVD XML Feedsでは、この情報が不十分なのです。

例えば、影響を受ける"CVE-2017-3771"の場合は、

   <vuln:vulnerable-configuration id="http://nvd.nist.gov/">
      <cpe-lang:logical-test operator="AND" negate="false">
        <cpe-lang:logical-test operator="OR" negate="false"/>
        <cpe-lang:logical-test operator="OR" negate="false">
          <cpe-lang:fact-ref name="cpe:/h:lenovo:thinkcentre_m710s:-"/>
        </cpe-lang:logical-test>
      </cpe-lang:logical-test>
    </vuln:vulnerable-configuration>
    <vuln:vulnerable-configuration id="http://nvd.nist.gov/">
      <cpe-lang:logical-test operator="AND" negate="false">
        <cpe-lang:logical-test operator="OR" negate="false"/>
        <cpe-lang:logical-test operator="OR" negate="false">
          <cpe-lang:fact-ref name="cpe:/h:lenovo:thinkcentre_m710t:-"/>
        </cpe-lang:logical-test>
      </cpe-lang:logical-test>
    </vuln:vulnerable-configuration>
    <vuln:vulnerable-configuration id="http://nvd.nist.gov/">
      <cpe-lang:logical-test operator="AND" negate="false">
        <cpe-lang:logical-test operator="OR" negate="false"/>
        <cpe-lang:logical-test operator="OR" negate="false">
          <cpe-lang:fact-ref name="cpe:/h:lenovo:aio_e95:-"/>
        </cpe-lang:logical-test>
      </cpe-lang:logical-test>

のような応答が返ります。

この表示がどうやら間違えているらしいことは、CVE-2017-3771のページの「Vulnerable software and versions」章を見に行けば明らかです。そもそも、logical-test要素が空になっている時点で何かがおかしい。また、影響を受けているCVEではvulnerable-software-list要素がなぜか消えてしまいます。

この問題はCVE-2017-3771にかぎらず、いくつかの情報で発生しています。僕が単純な検索で調べたトコロ、2017年発砲の情報だけで195個のCVEで同種の問題がありそうです。(発生条件については特定していて、NVDとは共有していますが、ここに書くのは控えます)

これは推測なのですが、おそらく、サイト上で"and previous versions"と表示していたところから"versions up to hoge"へ変更された際にDBの構造が代わり、XMLを正しく返せなくなったのでしょう。

影響概要

もしシステムがXMLのvulnebable-configulation要素や、software-list要素を参照して動作している場合、正しく処理することができていないでしょう。 SCAP的な対応を自動で行う場合、NVDのXML Feedsを参照するのは最もスタンダードな方法と考えられ、そのようなシステムを運用されている場合は確認が必要であると思われます。

おそらく、Vulsは影響を受けているものと思われます。僕はVulsの実装に詳しくないのですが・・・

対策方法

現状では完全な対策方法はありませんが、JSON Feedsには同種の問題が存在していないことを確認しています。ただし、JSON Feedsはβ版提供であり、他の問題の存在や今後の提供については保証されていません。
場当たり的にはJSON Feedを採用してやり過ごしてもよいと思いますが、XML Feedがきちんと修正されるようにおねがいを続けることが必要そうです。

JSON Feedsは、現状XML以上の情報量があり、リッチな造りです。また、XMLのversion 3.0が議論されていないことから、今後はJSONがメインストリームになっていく匂いを感じています。(これは個人の感想です。)

まとめ

NVDのXML Feedsを活用して、SCAP的な作業を自動化しているユーザは、一部の処理で問題が発生している可能性があります。この問題は11月末から発生していますが、いまだに改修されていません。
足元では、運用者の努力によって改善することは難しいので、暫定的に対処していく必要がありそうです。