2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

サーバに入れるだけで「今まさに悪用されているCVE(CISA KEV)が自分に該当するか」を1枚のHTMLで出すOSSを作った

2
Posted at

kevward という防御系CLIツールを作ってOSS公開しました(AGPL-3.0)。
Ubuntu/Debianサーバに入れて実行すると、パッチ状況・CISA KEV(実際に悪用中のCVE)との突合・攻撃元IPを、依存ほぼゼロで1枚の自己完結HTMLにまとめます。

pipx install kevward で入ります。
GitHub: https://github.com/ForexRobotics/kevward
PyPI: https://pypi.org/project/kevward/

pipx install kevward
sudo kevward report --trends -o report.html

kevwardのレポート画面

##なぜ作ったか
生成AIの登場で、攻撃コードやフィッシングが以前より少ない手間で量産されるようになり、サーバへの攻撃は体感でも明らかに増えています。そんな中、サーバ運用で毎朝気になるのは、だいたい次の3つです。
このサーバ、何が脆弱/古いのか?
誰に攻撃されているのか?
世の中で今まさに悪用されている脆弱性のうち、自分に効くものはあるか?
これに答えるツールは単機能では色々あります(スキャナ、fail2ban、SIEM…)。でも「スキャンだけ」「IPブロックだけ」「全部入りで重い(Wazuh等)」のどれかに寄りがちで、小さなサーバで"まず現状把握したい"フェーズにちょうどいいものが意外と無い。
そこで、1ホストに1本入れるだけで上の3つに答える軽量ツールを作りました。SIEMを立てるほどじゃない中小サーバや、"とりあえず自分のサーバの健康診断がしたい"人向けです。

私は以前、トレンドマイクロでウイルスバスターの開発責任者をしていました。kevwardはそれとは比べ物にならないくらい小さな、自分のサーバの痒いところに手が届く週末プロジェクトです。

##何ができるか?
① パッチ状況(posture)
apt管理のパッケージ(base system / nginx / Apache / PHP / MySQL / MariaDB / PostgreSQL / Redis / OpenSSH / ufw)の保留中のセキュリティ更新・マイナー更新を検出。加えて Composer/Laravel・Node.js/npm・WordPress は**依存アドバイザリの監査(レポート専用)**を行います。

kevward check          # 何も変更せず現状だけ表示

② CISA KEV 突合 ← ここが肝
CISA KEV カタログは「実際に悪用が観測されているCVE」の公式リストです。理論上のCVEの洪水ではなく「今まさに攻撃に使われているやつ」。
kevwardはこれをホストに実際に入っているソフトだけと突き合わせます。

kevward trends
CISA KEV catalog: 1760 CVEs (fresh)
matched to detected software (laravel, linux, nginx, openssh, php, ubuntu): 44
note: name-level match — confirm version applicability per CVE.
  CVE-2026-109618    php group/php   (added 2026-10-26)
  CVE-2024-4577      php group/php   (added 2024-06-12) [ransomware]
  ...

正直な限界: 突合は「製品名レベル」で、バージョン単位の該当までは見ていません。「該当の可能性」として出すので、最終的には各CVEをバージョンで確認する前提です。ここは将来 Ubuntu USN / OVAL と連携してバージョン単位に絞りたいところ。
(余談:この"製品名レベル"の突合、最初は脆弱性の説明文まで検索対象にしていて、Zimbraの「...PHP Remote File Inclusion」みたいな説明文中の"PHP"に誤反応していました。vendor/productだけに絞って解決。実データで回すとこういうのがすぐ見つかって面白い)
③ 攻撃元IPの可視化
fail2banのban履歴と、sshdの認証失敗ログを集計して、攻撃元IPを棒グラフでレポートに出します。実サーバで回すと「185.x.x.x がダントツ(sshd失敗305回)」みたいなのが一目で分かります。
プラグイン構造:1ファイルでサービス追加
対応サービスを増やすのは1ファイル置くだけ(自動discovery、中央のリストを編集しない設計)。

# kevward/plugins/redis.py
from ._apt import AptServicePlugin
from ..plugin import register

@register
class RedisPlugin(AptServicePlugin):
    name = "redis"
    packages = ["redis-server", "redis-tools"]
    kev_terms = ["redis"]

これだけで、セキュリティ更新検出・マイナー更新検出・安全なapply・KEV突合が全部つきます。
領域 対応サービス
基盤 apt(ホスト全体の更新・再起動検出)
Webサーバ nginx, Apache
DB MySQL, MariaDB, PostgreSQL, Redis
ランタイム PHP, Node.js
アプリ Composer/Laravel, WordPress(レポート専用)
アクセス OpenSSH(sshd), ufw
安全設計
セキュリティツール自身が事故を起こしたら本末転倒なので、デフォルトを徹底的に安全側に倒しています。
デフォルト読み取り専用:check / report / trends は一切変更しない
applyは明示:--yes なしはドライラン。セキュリティ更新のみ、マイナー更新は--minor
再起動は二重ゲート:allow_reboot=true かつ --reboot の両方が揃って初めて実行
リスクの高いものはレポート専用:Composer/Laravel・Node・WordPressは監査のみで自動更新しない(依存のbumpはアプリ所有者の判断)
防御専用:リモートホストには一切触れない。hack-back機能は無いし、PRでも受け付けない
定期実行
systemdのタイマーを同梱。毎朝レポートを自動生成できます。

sudo systemctl enable --now kevward-report.timer

##技術的なところ
Python 3.10+(Ubuntu 22.04以降)。依存は3.10のときのtomliだけ、3.11+なら標準ライブラリtomllibで依存ゼロ。
レポートは外部アセットなしの単一HTML(light/dark対応)。scpで持ち出してもそのまま開ける。
エージェント不要・管理サーバ不要。1台のサーバだけで完結。
CI(ruff + スモークテスト)、Trusted Publishing(OIDC)でタグpush→PyPI自動公開。

##位置づけ
CrowdSecやWazuhの競合ではなく補完です。あれらを入れるほどじゃない規模や、"まず現状を知りたい"段階に刺さります。将来はCrowdSec CTIとの突合や、収集イベントの時系列集約(SQLite/ClickHouse)も考えています。

##おわりに
フィードバック歓迎です。特に KEV突合の精度(name-levelをどうバージョン単位に寄せるか) と、次に対応すべきサービスについて意見をもらえると嬉しいです。
GitHub: https://github.com/ForexRobotics/kevward
PyPI: https://pypi.org/project/kevward/
License: AGPL-3.0

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?