【bash】JVNDB識別子 -> CVE識別子 変換

XPathでぶっこ抜きました。

xmlstarlet インストール

$ brew install xmlstarlet

MyJVN API のレスポンスからCVE識別子をぶっこ抜く

$ jvn_id="JVNDB-2016-002463"

# http://jvndb.jvn.jp/myjvn?method=getVulnDetailInfo&vulnId=JVNDB-2016-002463
$ curl http://jvndb.jvn.jp/myjvn -d method=getVulnDetailInfo -d vulnId=`echo $jvn_id` > vul.xml

$ cat vul.vml
> <VULDEF-Document 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" version="3.1" 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-2016-002463</VulinfoID>
> <VulinfoData>
> <Title>GD Graphics Library における整数符号エラーの脆弱性</Title>
> <VulinfoDescription>
> <Overview>
> ...
> <RelatedItem type="advisory">
> <Name>Common Vulnerabilities and Exposures (CVE)</Name>
> <VulinfoID>CVE-2016-3074</VulinfoID>
> <URL>
> http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-3074
> </URL>
> </RelatedItem>
> <RelatedItem type="advisory">
> <Name>National Vulnerability Database (NVD)</Name>
> <VulinfoID>CVE-2016-3074</VulinfoID>
> <URL>
> http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-3074
> </URL>
> </RelatedItem>
> ...

$ xmlstarlet sel -t -n -m "//_:RelatedItem[@type='advisory' and (.//_:Name[contains(text(),'CVE')] or .//_:Name[contains(text(),'NVD')])][1]/_:VulinfoID/text()" -c . vul.xml
> CVE-2016-3074

xmlstarletの場合、デフォルト名前空間(上記のXMLではxmlns="http://jvn.jp/vuldef/") が_にバインドされているので、 要素名の前に_:を付与してあげればよいのです(むしろ付与しないとまともに動作しない)。

参考

Chapter 5. Common problems