MyJVN APIを利用した脆弱性情報収集

はじめに
藤本です。
のんのんびよりは二周目でも癒やされます。
概要
みなさん、ソフトウェアの脆弱性対応をどのように取り組んでいますか?
ソフトウェアの多くには潜在的なバグが内在していて、そのバグ、脆弱性を利用されることでシステムが停止したり、情報を漏洩したり、最悪、システムが乗っ取られると言った様々なリスクを抱えています。これらのバグ、脆弱性の情報は様々な組織が運営する脆弱性情報データベースにより公開されることで私達は情報を知ることができます。ただ、脆弱性情報は多くのソフトウェアで小さいものから大きいものまであり、過去3ヶ月で1,790件(NVD検索結果)が報告されています。このように日々報告される情報から必要な情報を探すのは大変な労力を要します。
脆弱性データベース
有名な脆弱性データベースは以下のようなものがあります。
- CVE(Common Vulnerabilities and Exposures)
MITRE社が管理する脆弱性情報データベースです。脆弱性情報の詳細を調べる時にCVE-西暦年-XXXX形式の番号を見たことがある方も多いのではないでしょうか。この番号はCVEによって発行されています。 -
NVD(National Vulnerability Database)
NISTが管理する脆弱性情報データベースです。Common Vulnerability Scoring System(通称CVSS)という危険度を定量的な値で公開しています。 -
JVN(Japan Vulnerability Notes)
JPCERT/CCとIPAが共同で管理する脆弱性情報データベースです。日本語で公開されているのでまずはJVNを確認される方も多いと思います。 -
JVN iPedia
JVNと同じ団体により管理する脆弱性情報データベースです。JVNの管理団体に加えて、CERT/CC、CPNI、NVDといったところからも情報を収集しており、JVNより多い情報が収集されています。
MyJVN API
JVN iPediaは脆弱性情報を収集、検索可能なWEB APIを用意しています。WEB APIを利用することで製品ID、公開日、更新日といった検索情報を与えることで脆弱性情報の一覧や詳細をXML形式で受け取ることができます。APIの種類は多くなく、非常に簡単に扱えます。
以下に代表的なAPIをご紹介します。
getVendorList
ベンダ名の一覧を取得します。ベンダ名によりフィルタリングが可能です。
例
# curl -s http://jvndb.jvn.jp/myjvn\?method\=getVendorList
<?xml version="1.0" encoding="UTF-8" ?>
<Result
version="3.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://jvndb.jvn.jp/myjvn/Results"
xmlns:mjres="http://jvndb.jvn.jp/myjvn/Results"
xmlns:status="http://jvndb.jvn.jp/myjvn/Status"
xsi:schemaLocation="http://jvndb.jvn.jp/myjvn/Results http://jvndb.jvn.jp/schema/results_3.2.xsd">
<VendorInfo xml:lang="ja">
<Vendor vname="#1 deals and maps app" cpe="cpe:/:pointinside" vid="10133"/>
<Vendor vname="$0.99 kindle books project" cpe="cpe:/:%240.99_kindle_books_project" vid="11248"/>
<Vendor vname=".VDMi/" cpe="cpe:/:fibonacciorange" vid="11644"/>
〜〜〜 省略 〜〜〜
<Vendor vname="Tom Braider" cpe="cpe:/:tom_braider" vid="1090"/>
<Vendor vname="Tom M8te project" cpe="cpe:/:tom_m8te_plugin_project" vid="9931"/>
<Vendor vname="Tom Wilkason" cpe="cpe:/:tom_wilkason" vid="6633"/>
</VendorInfo>
<status:Status version="3.2" method="getVendorList" lang="ja" retCd="0" retMax="10000" errCd="" errMsg="" totalRes="11628" totalResRet="10000" firstRes="1"/>
</Result>
今現在、11628件のベンダが登録されています。
getProductList
製品名の一覧を取得します。ベンダIDや製品名によってフィルタリングが可能です。
例
curl -s http://jvndb.jvn.jp/myjvn\?method\=getProductList |head -20
<?xml version="1.0" encoding="UTF-8" ?>
<Result
version="3.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://jvndb.jvn.jp/myjvn/Results"
xmlns:mjres="http://jvndb.jvn.jp/myjvn/Results"
xmlns:status="http://jvndb.jvn.jp/myjvn/Status"
xsi:schemaLocation="http://jvndb.jvn.jp/myjvn/Results http://jvndb.jvn.jp/schema/results_3.2.xsd">
<VendorInfo xml:lang="ja">
<Vendor vname="#1 deals and maps app" cpe="cpe:/:pointinside" vid="10133">
<Product pname="Point Inside Shopping & Travel" cpe="cpe:/a:pointinside:point_inside_shopping_%26_travel" pid="21248"/>
</Vendor>
<Vendor vname="$0.99 kindle books project" cpe="cpe:/:%240.99_kindle_books_project" vid="11248">
<Product pname="$0.99 kindle books" cpe="cpe:/a:%240.99_kindle_books_project:%240.99_kindle_books" pid="22920"/>
</Vendor>
〜〜〜 省略 〜〜〜
<Vendor vname="magnoware" cpe="cpe:/:magnoware" vid="5430">
<Product pname="datatrack system" cpe="cpe:/a:magnoware:datatrack_system" pid="11129"/>
</Vendor>
<Vendor vname="Magnus Auvinen" cpe="cpe:/:teeworlds" vid="10370">
<Product pname="Teeworlds" cpe="cpe:/a:teeworlds:teeworlds" pid="21810"/>
</Vendor>
</VendorInfo>
<status:Status version="3.2" method="getProductList" lang="ja" retCd="0" retMax="10000" errCd="" errMsg="" totalRes="24670" totalResRet="10000" firstRes="1"/>
</Result>
現在、24670件の製品が登録されています。
getVulnOverviewList
脆弱性情報の一覧を取得します。デフォルトでは脆弱性情報の発見日、更新日、発行日が過去1週間以内の情報のみを表示します。ベンダID、製品ID、CVSS深刻度、発見日/更新日/発行日からフィルタリングが可能です。
例
# curl -s http://jvndb.jvn.jp/myjvn\?method\=getVulnOverviewList
<?xml version="1.0" encoding="UTF-8" ?>
<rdf:RDF
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://purl.org/rss/1.0/"
xmlns:rss="http://purl.org/rss/1.0/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:dcterms="http://purl.org/dc/terms/"
xmlns:sec="http://jvn.jp/rss/mod_sec/"
xmlns:status="http://jvndb.jvn.jp/myjvn/Status"
xsi:schemaLocation="http://purl.org/rss/1.0/ http://jvndb.jvn.jp/schema/jvnrss_3.1.xsd http://jvndb.jvn.jp/myjvn/Status http://jvndb.jvn.jp/schema/status_3.2.xsd"
xml:lang="ja">
<channel rdf:about="http://jvndb.jvn.jp/apis/myjvn">
<title>JVNDB 脆弱性対策情報</title>
<link>http://jvndb.jvn.jp/apis/myjvn</link>
<description>JVNDB 脆弱性対策情報</description>
<dc:date>2015-10-03T20:12:29+09:00</dc:date>
<dcterms:issued/>
<dcterms:modified>2015-10-03T20:12:29+09:00</dcterms:modified>
<items>
<rdf:Seq>
<rdf:li rdf:resource="http://jvndb.jvn.jp/ja/contents/2015/JVNDB-2015-000149.html"/>
<rdf:li rdf:resource="http://jvndb.jvn.jp/ja/contents/2015/JVNDB-2015-000148.html"/>
<rdf:li rdf:resource="http://jvndb.jvn.jp/ja/contents/2015/JVNDB-2015-005015.html"/>
<rdf:li rdf:resource="http://jvndb.jvn.jp/ja/contents/2015/JVNDB-2015-005012.html"/>
<rdf:li rdf:resource="http://jvndb.jvn.jp/ja/contents/2015/JVNDB-2015-005011.html"/>
<rdf:li rdf:resource="http://jvndb.jvn.jp/ja/contents/2015/JVNDB-2015-005007.html"/>
<rdf:li rdf:resource="http://jvndb.jvn.jp/ja/contents/2015/JVNDB-2015-000141.html"/>
<rdf:li rdf:resource="http://jvndb.jvn.jp/ja/contents/2015/JVNDB-2015-000140.html"/>
<rdf:li rdf:resource="http://jvndb.jvn.jp/ja/contents/2015/JVNDB-2015-000147.html"/>
<rdf:li rdf:resource="http://jvndb.jvn.jp/ja/contents/2015/JVNDB-2015-000139.html"/>
<rdf:li rdf:resource="http://jvndb.jvn.jp/ja/contents/2015/JVNDB-2015-000138.html"/>
<rdf:li rdf:resource="http://jvndb.jvn.jp/ja/contents/2015/JVNDB-2015-000146.html"/>
<rdf:li rdf:resource="http://jvndb.jvn.jp/ja/contents/2015/JVNDB-2015-000145.html"/>
<rdf:li rdf:resource="http://jvndb.jvn.jp/ja/contents/2015/JVNDB-2015-000144.html"/>
<rdf:li rdf:resource="http://jvndb.jvn.jp/ja/contents/2015/JVNDB-2015-000143.html"/>
<rdf:li rdf:resource="http://jvndb.jvn.jp/ja/contents/2015/JVNDB-2015-000137.html"/>
<rdf:li rdf:resource="http://jvndb.jvn.jp/ja/contents/2015/JVNDB-2015-000142.html"/>
</rdf:Seq>
</items>
</channel>
<item rdf:about="http://jvndb.jvn.jp/ja/contents/2015/JVNDB-2015-000149.html">
<title>gollum における任意のファイルを閲覧される脆弱性</title>
<link>http://jvndb.jvn.jp/ja/contents/2015/JVNDB-2015-000149.html</link>
<description>gollum は、git リポジトリを使った wiki システムです。gollum には、サーバ上の任意のファイルを閲覧される脆弱性が存在します。 この脆弱性情報は、情報セキュリティ早期警戒パートナーシップに基づき下記の方が IPA に報告し、JPCERT/CC が開発者との調整を行いました。 報告者: 馬場 将次 氏</description>
<dc:publisher>Information-technology Promotion Agency, Japan</dc:publisher>
<dc:creator>Information-technology Promotion Agency, Japan</dc:creator>
<sec:identifier>JVNDB-2015-000149</sec:identifier>
<sec:references source="CVE" id="CVE-2015-7314">https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-7314</sec:references>
<sec:references source="CWE IPA JA" id="不適切な入力確認(CWE-20)">http://jvndb.jvn.jp/ja/cwe/CWE-20.html</sec:references>
<sec:references source="JVN" id="JVN#27548431">https://jvn.jp/jp/JVN27548431/index.html</sec:references>
<sec:cpe-item name="cpe:/a:misc:gollum_gollum">
<sec:vname>gollum</sec:vname>
<sec:title>gollum</sec:title>
</sec:cpe-item>
<sec:cvss score="4.3" severity="Medium" vector="(AV:N/AC:M/Au:N/C:P/I:N/A:N)" version="2.0"/>
<dc:date>2015-10-02T12:02:52+09:00</dc:date>
<dcterms:issued>2015-10-02T12:02:52+09:00</dcterms:issued>
<dcterms:modified>2015-10-02T12:02:52+09:00</dcterms:modified>
</item>
〜〜〜 省略 〜〜〜
<item rdf:about="http://jvndb.jvn.jp/ja/contents/2015/JVNDB-2015-000142.html">
<title>Apache Cordova プラグイン cordova-plugin-file-transfer における HTTP ヘッダインジェクションの脆弱性</title>
<link>http://jvndb.jvn.jp/ja/contents/2015/JVNDB-2015-000142.html</link>
<description>Apache Software Foundation が提供する cordova-plugin-file-transfer は、Apache Cordova を使って開発されるアプリケーションにファイルのアップロードおよびダウンロードを可能にする機能を提供するプラグインです。また、HTTP ヘッダを追加する機能も提供しています。 cordova-plugin-file-transfer を使用した Android アプリケーションには、ファイル名の処理に起因する HTTP ヘッダインジェクションの脆弱性が存在します。 この脆弱性情報は、情報セキュリティ早期警戒パートナーシップに基づき下記の方が IPA に報告し、JPCERT/CC が開発者との調整を行いました。 報告者: ソニーデジタルネットワークアプリケーションズ株式会社 西村 宗晃 氏</description>
<dc:publisher>Information-technology Promotion Agency, Japan</dc:publisher>
<dc:creator>Information-technology Promotion Agency, Japan</dc:creator>
<sec:identifier>JVNDB-2015-000142</sec:identifier>
<sec:references source="CVE" id="CVE-2015-5204">https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-5204</sec:references>
<sec:references source="CWE IPA JA" id="不適切な入力確認(CWE-20)">http://jvndb.jvn.jp/ja/cwe/CWE-20.html</sec:references>
<sec:references source="JVN" id="JVN#21612597">https://jvn.jp/jp/JVN21612597/index.html</sec:references>
<sec:cpe-item name="cpe:/a:apache:cordova-plugin-file-transfer">
<sec:vname>Apache Software Foundation</sec:vname>
<sec:title>cordova-plugin-file-transfer</sec:title>
</sec:cpe-item>
<sec:cvss score="4.3" severity="Medium" vector="(AV:N/AC:M/Au:N/C:N/I:P/A:N)" version="2.0"/>
<dc:date>2015-09-29T12:03:12+09:00</dc:date>
<dcterms:issued>2015-09-29T12:03:12+09:00</dcterms:issued>
<dcterms:modified>2015-09-29T12:03:12+09:00</dcterms:modified>
</item>
<status:Status version="3.2" method="getVulnOverviewList" lang="ja" retCd="0" retMax="50" errCd="" errMsg="" totalRes="17" totalResRet="17" firstRes="1"/>
</rdf:RDF>
今週一週間で新たに発見された脆弱性情報は17件となります。
getVulnDetailInfo
脆弱性情報の詳細を取得します。getVulnOverviewListで取得した脆弱性対策情報ID(JVNDB-西暦年-XXXXXX)を指定する必要があります。
例
# curl http://jvndb.jvn.jp/myjvn\?method\=getVulnDetailInfo\&vulnId\=JVNDB-2015-000149
<?xml version="1.0" encoding="UTF-8" ?>
<VULDEF-Document
version="3.1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://jvn.jp/vuldef/"
xmlns:vuldef="http://jvn.jp/vuldef/"
xmlns:status="http://jvndb.jvn.jp/myjvn/Status"
xsi:schemaLocation="http://jvn.jp/vuldef/ http://jvndb.jvn.jp/schema/vuldef_3.1.xsd http://jvndb.jvn.jp/myjvn/Status http://jvndb.jvn.jp/schema/status_3.2.xsd"
xml:lang="ja">
<Vulinfo>
<VulinfoID>JVNDB-2015-000149</VulinfoID>
<VulinfoData>
<Title>gollum における任意のファイルを閲覧される脆弱性</Title>
<VulinfoDescription>
<Overview>gollum は、git リポジトリを使った wiki システムです。gollum には、サーバ上の任意のファイルを閲覧される脆弱性が存在します。 この脆弱性情報は、情報セキュリティ早期警戒パートナーシップに基づき下記の方が IPA に報告し、JPCERT/CC が開発者との調整を行いました。 報告者: 馬場 将次 氏</Overview>
</VulinfoDescription>
<Affected>
<AffectedItem>
<Name>gollum</Name>
<ProductName>gollum</ProductName>
<VersionNumber>v4.0.0 およびそれ以前</VersionNumber>
</AffectedItem>
</Affected>
<Impact>
<Cvss version="2.0">
<Severity>Medium</Severity>
<Score>4.3</Score>
<Vector>(AV:N/AC:M/Au:N/C:P/I:N/A:N)</Vector>
</Cvss>
<ImpactItem>
<Description>遠隔の第三者によって、サーバ上の任意のファイルを閲覧される可能性があります。</Description>
</ImpactItem>
</Impact>
<Solution>
<SolutionItem>
<Description>[アップデートする] 開発者が提供する情報をもとに、最新版へアップデートしてください。</Description>
</SolutionItem>
</Solution>
<Related>
<RelatedItem type="vendor">
<Name>GitHub</Name>
<VulinfoID>Issue#1070: [SECURITY] [FIXED] Information disclosure vulnerability, please update!</VulinfoID>
<URL>https://github.com/gollum/gollum/issues/1070</URL>
</RelatedItem>
<RelatedItem type="advisory">
<Name>Common Vulnerabilities and Exposures (CVE)</Name>
<VulinfoID>CVE-2015-7314</VulinfoID>
<URL>https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-7314</URL>
</RelatedItem>
<RelatedItem type="advisory">
<Name>JVN</Name>
<VulinfoID>JVN#27548431</VulinfoID>
<URL>https://jvn.jp/jp/JVN27548431/index.html</URL>
</RelatedItem>
<RelatedItem type="advisory">
<Name>共通脆弱性タイプ一覧 (CWE)</Name>
<VulinfoID>不適切な入力確認(CWE-20)</VulinfoID>
<URL>http://jvndb.jvn.jp/ja/cwe/CWE-20.html</URL>
</RelatedItem>
<RelatedItem type="cwe">
<Name>不適切な入力確認</Name>
<VulinfoID>CWE-20</VulinfoID>
<URL>http://jvndb.jvn.jp/ja/cwe/CWE-20.html</URL>
</RelatedItem>
</Related>
<History>
<HistoryItem>
<Description/>
</HistoryItem>
</History>
<DateFirstPublished>2015-10-02T12:02:52+09:00</DateFirstPublished>
<DateLastUpdated>2015-10-02T12:02:52+09:00</DateLastUpdated>
<DatePublic>2015-10-02T00:00:00+09:00</DatePublic>
</VulinfoData>
</Vulinfo>
<status:Status version="3.2" method="getVulnDetailInfo" lang="ja" retCd="0" retMax="10" errCd="" errMsg="" totalRes="1" totalResRet="1" firstRes="1" vulnId="JVNDB-2015-000149"/>
</VULDEF-Document>
AWS Lambdaで実装するMyJVN APIを利用した脆弱性情報収集
これら紹介したAPIを利用して、定期的にシステムに導入したアプリケーションの脆弱性情報を収集して、メール通知するシステムを作ります。仕組みは簡単です。Lambda Function(Python)を作成します。Eventはスケジュール実行です。MyJVN APIの仕様上、最小検索の単位が日となりますので、日次や週次、月次のいずれかで指定します。通知はSNSでメール通知します。
スクリプトはGistに公開しました(やっつけ)
現在は5つのパラメータを設定可能です。コメントアウトで括られた変数に設定してください。
- SEVERITY
- 収集する脆弱性の危険度
- low / middle / high から選択可能
- lowを選択した場合は全て、middleを選択した場合はmiddle、high、highを選択した場合はhighのみ収集
- INTERVAL
- 収集する期間(Lambda Functionのスケジュールに合わせないと重複したり、漏れたり)
- 現状は発行日でフィルタ
- daily / weekly / monthly から選択可能
- dailyの場合は前日の脆弱性、weeklyの場合は7日前〜前日、monthlyの場合は1ヶ月前同日〜前日の脆弱性情報を収集
- TOPIC_ARN
- 通知するSNS TopicのARN
- 試験はしていないが、メール通知以外にも使えます
- NOTIFY_SUBJECT
- 通知のSubject
- SNS TopicのPublishの引数で渡すSubject
- Pythonのスクリプトなので日付入れたりもできます
- PRODUCTS
- 脆弱性を収集する製品(リスト定義)
- JVN iPediaで管理されている製品名で入力する必要あり
- 製品名はgetProductList APIで要確認
AWS Lambdaを実行すると、以下のようなメールが飛んできました。
うん、見栄えいくない。
【追加実装したい機能】
- 表示の工夫
- エラー処理
- 通知に含むパラメータ選択可
- 通知方法をSNSだけでなく、SESによる通知も選択可(文字数が多くなりそうな時はSES)
- 収集期間を発行日だけでなく、更新日でも通知可(選択式)
- 収集期間を日数などもう少し細かな指定可
まとめ
1システムに1Lambda Functionいかがでしょうか。
今までマンパワーで定期的に脆弱性情報を収集していた方は取り込みたくなったのではないでしょうか。MyJVN APIはシンプルな分、一つ一つのAPIの使い方も分かりやすくラーニングコストはかなり低いです。その逆で細かいクエリを発行できないため、複雑な作りをしたい場合、プログラムで工夫する必要があります。レスポンスもスキーマ定義されたXMLでプログラムに取り込みやすいです。
今回のサンプルではAWS Lambdaのスケジュール実行がリリースされたことで仕組みに取り込みましたが、lambda_handlerメソッドをmainメソッドに置き換え、notifyメソッドをsnsの利用からSMTPを実行するようにすれば、AWSに限らずどこでもcronなどで実行が可能です。
楽できるところは楽して、やるべきことに時間を使っていきましょう。