🍆

MyJVN APIを利用した脆弱性対策情報通知ツール

に公開

概要

昔プログラミングの勉強で作成した脆弱性対策情報取得ツールを発掘したので、AIを使いつつパパっと修正してみました。

元々は以下の記事で紹介されていたPython2系のコードを手動でPython3系に修正し、LINE Notifyで通知を飛ばせるようにしていました。
https://dev.classmethod.jp/articles/myjvn-api/
ところが、いつの間にかLINE Notifyがサービス終了しており、半年ほどまともに動いていない状態で放置されていたのをメールとSNSで通知を飛ばせるように修正しました。

コード

以下でコードを公開しています。
詳細や使い方はREADMEを見ていただければ良いですが、テキストファイル、CSV(Excel)出力の他に、SMTPとAWS SNSに対応しています。
やろうと思えばSlackでもTeamsでもDiscordでも対応可能なので、興味がある方は改修してみてください。
https://github.com/pesipesi/GetMyJVN

実行時のターミナル出力は以下の通りです。

$ python jvn.py 
2025-10-24 05:48:32,962 - INFO - --- 処理開始 ---
2025-10-24 05:48:32,962 - INFO - Requesting URL: https://jvndb.jvn.jp/myjvn?feed=hnd&method=getVulnOverviewList&severity=c&datePublishedStartY=2025&datePublishedStartM=10&datePublishedStartD=23&datePublishedEndY=2025&datePublishedEndM=10&datePublishedEndD=23&rangeDatePublished=n&rangeDatePublic=n&rangeDateFirstPublished=n&startItem=1
2025-10-24 05:48:33,989 - INFO - --- 取得結果 ---
■重要度:緊急(CVS score : 9.0-10.0)の脆弱性情報
-----No.1-----
Dolusoft Software Technologies の Omaspot における重要な情報の平文での送信に関する脆弱性 (v3.0: 9.6)
https://jvndb.jvn.jp/ja/contents/2025/JVNDB-2025-017132.html
-----No.2-----
Mozilla Foundation の Mozilla Firefox および Mozilla Thunderbird における解放済みメモリの使用に関する脆弱性 (v3.0: 9.8)
https://jvndb.jvn.jp/ja/contents/2025/JVNDB-2025-017131.html

2025-10-24 05:48:33,989 - INFO - --- 取得結果 ---
2025-10-24 05:48:33,989 - INFO - ログファイルへの書き込みが完了しました: jvn_20251024054833.log
2025-10-24 05:48:33,991 - INFO - CSVファイルへの書き込みが完了しました: jvn_20251024054833.csv
2025-10-24 05:48:33,991 - INFO - --- 処理終了 ---

情報が多いと見づらいので、メール通知の場合はタイトルとリンクとCVSSスコアのみを表示するようにしています。

メール文面例:

-----No.1-----
Zabbix における SQL インジェクションの脆弱性 (v3.0: 9.9)
https://jvndb.jvn.jp/ja/contents/2024/JVNDB-2024-028991.html
-----No.2-----
Zabbix における書式文字列に関する脆弱性 (v3.0: 9.1)
https://jvndb.jvn.jp/ja/contents/2024/JVNDB-2024-028988.html

CSVで出力したときには説明やCVE番号など、少し細かい情報まで出力するようにしています。

MyJVN API

詳細は以下に記載ありますが、JVNで公開されている脆弱性対策情報はAPI経由で取得することが可能です。
https://jvndb.jvn.jp/apis/index.html
毎月第二水曜日に公開されるWindows Updateの情報が月末付近に登録されたりもするので更新は遅いような気もしますが、日本語で脆弱性の情報を得られるのは良い点だと思います。

例えば以下のURLを叩くと、2025/10/01に登録された深刻度がCriticalの脆弱性対策情報がXML形式で取得できます。
https://jvndb.jvn.jp/myjvn?feed=hnd&method=getVulnOverviewList&severity=c&datePublishedStartY=2025&datePublishedStartM=10&datePublishedStartD=1&datePublishedEndY=2025&datePublishedEndM=10&datePublishedEndD=1&rangeDatePublished=n&rangeDatePublic=n&rangeDateFirstPublished=n&startItem=1

細かいパラメータとしては次のようになっています。

パラメータ 意味 必須 補足
feed フィードフォーマット名 hnd APIバージョンを指定する。HND以外使ったことはない
method メソッド名 getVulnOverviewList 脆弱性対策情報の取得であればgetVulnOverviewListで問題ない
severity CVSS 深刻度 c - l=Low, m=Middle, h=High, c=Critical
datePublishedStartY 「公開日」の開始年 2025 - datePublishedStartM/D と組み合わせて使用
datePublishedStartM 「公開日」の開始月 10 - ゼロ埋め不要
datePublishedStartD 「公開日」の開始日 1 - 有効な日付である必要あり
datePublishedEndY 「公開日」の終了年 2025 - datePublishedEndM/D と組み合わせて使用
datePublishedEndM 「公開日」の終了月 10 - ゼロ埋め不要
datePublishedEndD 「公開日」の終了日 1 - 開始日以降である必要あり
rangeDatePublished 「公開日」の範囲指定方法 n - n=範囲指定なし、w=過去1週間、m=過去1か月。開始/終了日が指定されている場合はそちらが優先
rangeDatePublic 「発見日」の範囲指定方法 n - 同上。発見日ベースでのフィルタリング
rangeDateFirstPublished 「初公開日」の範囲指定方法 n - 同上。初公開日ベースでのフィルタリング
startItem ページング開始位置 1 - 何件目のアイテムから取得するか。同時に50件までしか取得できないので、50件以上ある場合にはここを51などにして取得する。

ハマりどころとしては、以下のようにrangeDate~を記載しなかった場合、情報がほとんど取得できなくなります。
https://jvndb.jvn.jp/myjvn?feed=hnd&method=getVulnOverviewList&severity=c&datePublishedStartY=2025&datePublishedStartM=10&datePublishedStartD=1&datePublishedEndY=2025&datePublishedEndM=10&datePublishedEndD=1&startItem=1

これは、rangeDate~の三項目はいずれも未記載の場合にデフォルトのw(過去一週間)が適用され、「公開日(JVNで公開された日)」「発見日(脆弱性の発見日)」「初公開日(JVNに限らず脆弱性が最初に公開された日)」がすべて過去一週間以内に収まっている脆弱性対策情報を表示しようとするためです。
開始日と終了日を指定する場合、rangeDate~の三項目はnで設定しておきましょう。

その他

当時は生成AIがそこまで普及しておらずPython2系から3系への修正もなかなか大変でしたが、今なら知識がなくともAIで簡単に修正できてしまうと思うとありがたいような悲しいような気がします。
(ここ2, 3年でのAIの進歩と普及がすごい、、、)

AWS Lambda用のハンドラを追加すれば、Lambda上で定期的に実行して脆弱性情報をメール通知するといったこともできるので、興味がある方はぜひAIにでも直させてみてください。

製品での検索などもできるので、脆弱性監視ツールなどを導入していない運用現場などで簡易的に導入いただくのもよいかもしれません。

Discussion