JVNDBのキーワード検索結果をテキスト出力

ozakira2012-07-20

JVN(Japan Vulnerability Notes)はソフトウェアなどの脆弱性情報を提供するサイトです。JPCERTと(情報処理技術者試験の)IPAが運営しています。

http://jvndb.jvn.jp/

とても参考になり、開発の分野ではとくに有用です。
データベースを、テキストや表計算ソフトの形式で取得したい場合は、MyJVN APIhttp://jvndb.jvn.jp/apis/)を用いることで簡単にできます。
(レベルの低いスクリプトなのは自覚していますが、)参考になればと思い、RubyAPIを用いるサンプルを貼っておきます。

キーワード -> 脆弱性対策情報ID

#!/usr/bin/env ruby
require "net/http"
require "rexml/document"
include REXML

keyword = ARGV[0] # 検索したいキーワード

myjvn_api_url = "http://jvndb.jvn.jp/myjvn?method=getVulnOverviewList&rangeDateFirstPublished=n&rangeDatePublic=n&rangeDatePublished=n&lang=ja&keyword=" + keyword

jvndb = []
i = 0
begin
 request_url = myjvn_api_url + "&startItem=" + (50*i+1).to_s
 uri = URI.parse(request_url)
 res = Net::HTTP.start(uri.host, uri.port) {|http| http.get(request_url) }
 doc = REXML::Document.new(res.body)
 totalRef = doc.elements['/rdf:RDF/status:Status'].attributes['totalRes'].to_i
 doc.elements.each('/rdf:RDF/item/sec:identifier') {|e| jvndb.push e.text }
 i += 1
end while totalRef > 50*i

puts jvndb


ポイントは、APIの仕様で最大50個までしか一度に取得できないので、反復させることです。

脆弱性対策情報IDs -> 詳細情報

#!/usr/bin/env ruby -Ku

require "cgi"
require "net/http"
require "rexml/document"
include REXML

jvndb = []
while gets
 jvndb.push $_.chomp
end

jvndb.each do |id|
 request_url = "http://jvndb.jvn.jp/myjvn?lang=ja&method=getVulnDetailInfo&vulnId=" + CGI.escape(id)
 uri = URI.parse(request_url)
 res = Net::HTTP.start(uri.host, uri.port) {|http| http.get(request_url) }
 doc = REXML::Document.new(res.body)
 
 print id
 print "\t"
 print doc.elements["/VULDEF-Document/Vulinfo/VulinfoData/Title"].text
 print "\t"
 print doc.elements["/VULDEF-Document/Vulinfo/VulinfoData/VulinfoDescription/Overview"].text
 print "\t"
 
 # 本当はXPathでRelatedItem[@type = 'cwe']のように取得したいけどうまくいかない
 XPath.each(doc, "/VULDEF-Document/Vulinfo/VulinfoData/Related/RelatedItem"){ |e|
  print e.elements["VulinfoID"].text if e.attributes["type"] == "cwe"
 }
 print "\n"
end


サンプルでは最低限の情報しか標準出力していませんが、適宜で取得したいカラムを追加してください。

つかいかた

を説明するのはめんどくさいので、ファイルをダウンロードしてください。