JVNDBのキーワード検索結果をテキスト出力
JVN(Japan Vulnerability Notes)はソフトウェアなどの脆弱性情報を提供するサイトです。JPCERTと(情報処理技術者試験の)IPAが運営しています。
とても参考になり、開発の分野ではとくに有用です。
データベースを、テキストや表計算ソフトの形式で取得したい場合は、MyJVN API(http://jvndb.jvn.jp/apis/)を用いることで簡単にできます。
(レベルの低いスクリプトなのは自覚していますが、)参考になればと思い、RubyでAPIを用いるサンプルを貼っておきます。
キーワード -> 脆弱性対策情報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
サンプルでは最低限の情報しか標準出力していませんが、適宜で取得したいカラムを追加してください。
つかいかた
を説明するのはめんどくさいので、ファイルをダウンロードしてください。