只读、无代理的 Linux 内核安全配置审计工具(本地与 SSH)。初始重点:针对 CVE-2026-98432 的 TCP 迁移 / MPTCP 检查。
一个用 Python 编写的轻量级开源 Linux 安全审计工具。
通过 SSH 审计本地和远程 Linux 服务器,无需安装代理,也无需修改系统配置。
这是一个配置与补丁状态审计工具,而非漏洞利用扫描器。 它会报告与漏洞相关的内核设置和使用情况,并将正在运行的内核软件包与厂商修复版本进行比较。它绝不会尝试触发漏洞。
| 功能 | v0.2.0 |
|---|---|
| Python 3.8+,无第三方依赖 | ✅ |
| 本地 Linux 审计 | ✅ |
| 通过 SSH 远程审计(无代理) | ✅ |
| 并行扫描多台服务器 | ✅ |
| Ubuntu / Debian / Rocky / AlmaLinux / RHEL / Fedora | ✅ |
| TCP 请求套接字迁移检查 | ✅ |
| MPTCP 配置及使用情况检查 | ✅ |
| 内核、发行版及待重启检测 | ✅ |
| JSON / CSV 报告 | ✅ |
| 内核 CVE 补丁验证(Ubuntu、Debian、RHEL、Rocky、AlmaLinux、CentOS) | ✅ |
| 自动安全更新 | ❌ 从不 |
| 更改服务器配置 | ❌ 从不 |
控制器(你的 Mac 或 Linux 工作站)根据所选检查项构建一个小型 POSIX sh 脚本,并通过 SSH 将其管道传输到每个目标上的 sh -s。不会向目标复制或安装任何内容。脚本会打印 key=value 形式的事实数据;所有评估都在控制器上进行,控制器将目标的输出视为不可信数据(剥离控制字符、截断数值、中和 CSV 公式注入)。
在运行之前,请仔细查看将在你的服务器上执行的确切内容:
python3 netviser_cve_audit.py --print-script
目标主机只需要 sh 和标准工具(来自 iproute2 的 ss、awk、grep、sed)。目标主机上不需要 Python。
控制端需要 Python 3.8+ 和 OpenSSH(macOS 或 Linux)。
git clone https://github.com/maxigentr/netviser-linux-security-auditor.git
cd netviser-linux-security-auditor
# Audit this Linux machine
python3 netviser_cve_audit.py --local
# Audit a remote server
python3 netviser_cve_audit.py --host [email protected]
# Custom SSH port and key
python3 netviser_cve_audit.py --host [email protected] --port 2290 --identity ~/.ssh/audit_ed25519
# Multiple servers, 10 in parallel
python3 netviser_cve_audit.py --hosts servers.txt --workers 10
# Non-root SSH user with passwordless sudo, for full process and BPF visibility
python3 netviser_cve_audit.py --host admin@web01 --sudo
# Watch MPTCP counters for 60 seconds to see if MPTCP is used right now
python3 netviser_cve_audit.py --hosts servers.txt --sample-interval 60
# Also check whether other kernel CVEs are patched
python3 netviser_cve_audit.py --hosts servers.txt --cve CVE-2024-1086,CVE-2024-26925
该工具也可以安装(pip install .)并作为 netviser-audit 或 python3 -m netviser_audit 运行。
有关主机文件格式,请参见 examples/servers.example.txt。每台主机的端口使用 ssh://user@host:port 或 ~/.ssh/config 别名。
| 选项 | 描述 |
|---|---|
--local / --host H / --hosts FILE | 要审计的对象 |
--checks IDS | 逗号分隔的子集(参见 --list-checks);依赖项会自动添加 |
--cve IDS | 同时报告这些 CVE 的内核补丁状态(可重复或逗号分隔) |
--offline | 不下载厂商公告数据 |
--advisories FILE | 使用之前保存的公告数据;除非指定 --offline,否则仍会下载缺失的记录 |
--save-advisories FILE | 保存所使用的公告数据,以便离线或可重复运行 |
--sudo | 使用 sudo -n 运行收集器(从不提示输入密码) |
--sample-interval N | 间隔 N 秒读取两次 MPTCP 计数器 |
--output PREFIX | 报告前缀(默认 netviser_audit → .json、.csv) |
--no-report | 仅在终端打印 |
--fail-on-review | 当存在任何 REVIEW 发现时以退出码 3 退出(用于 CI / cron) |
-v、--verbose | 显示所有发现,而不仅是 REVIEW / UNKNOWN |
SSH 运行时使用 BatchMode=yes(仅基于密钥的身份验证)和 StrictHostKeyChecking=accept-new。
退出状态:0 成功,1 无法扫描某个目标,2 用法错误,3 存在审查发现(仅在指定 --fail-on-review 时)。
| Id | 检查内容 |
|---|---|
kernel | 发行版、内核版本、正在运行的内核包、已安装的较新内核 / 是否需要重启 |
patch | 根据厂商公告数据,正在运行的内核包中每个 CVE 的补丁状态 |
tcp_migration | net.ipv4.tcp_migrate_req;已加载的 sk_reuseport BPF 程序(需要 root + bpftool) |
mptcp | net.mptcp.enabled、路径管理器、CONFIG_MPTCP、MPTCP 套接字和进程、握手计数器、mptcpize 使用情况 |
cve_2026_98432 | CVE-2026-98432 的相关配置;其补丁状态为 patch.CVE-2026-98432 |
每个发现都有一个状态——OK、INFO、REVIEW 或 UNKNOWN——以及一个机器可读的判定结果(例如 mptcp.usage = IN_USE)。
patch 检查针对每个 CVE 回答一个问题:根据发行版厂商,当前正在运行的内核是否已修复?
dpkg-query / rpm -qf):其名称、确切版本和源包。它还会列出该软件包的变更日志以及已加载的 livepatch(canonical-livepatch、kpatch-patch)中提到的 CVE id。~ 版本都能被正确处理。| 发行版 | 公告来源 |
|---|---|
| Ubuntu | Ubuntu Security API — 按发行版和内核变体(linux、linux-hwe-*、linux-aws 等) |
| Debian | 通过 OSV 获取 Debian Security Tracker 数据 |
| RHEL、Rocky Linux、AlmaLinux、CentOS | Red Hat Security Data API — 主 RHEL 流 |
只有 CVE 标识符会发送到这些服务;关于您主机的任何信息都不会离开控制端。对于气隙环境,请先使用 --save-advisories adv.json 运行一次,之后使用 --offline --advisories adv.json 运行。
| 判定 | 状态 | 含义 |
|---|---|---|
PATCHED | OK | 运行中的内核版本 ≥ 厂商修复版本 |
NOT_AFFECTED | OK | 厂商表示此发行版 / 内核不受影响 |
LIVEPATCHED | OK | 已加载的 livepatch 将该 CVE 列为已修复 |
VULNERABLE | REVIEW | 修复已发布;运行中的内核较旧。请安装并重启 |
FIX_PENDING | REVIEW | 厂商已准备好修复但尚未发布(Ubuntu) |
FIX_NOT_AVAILABLE | REVIEW | 受影响,尚未发布修复 |
WONT_FIX | REVIEW | 厂商不会修复此发行版(例如已结束支持) |
MENTIONED_IN_CHANGELOG | INFO | 无厂商判定,但运行中内核的变更日志提及该 CVE |
NO_DATA | UNKNOWN | 厂商没有该 CVE、发行版或内核变体的记录 |
UNSUPPORTED | UNKNOWN | 该发行版没有公告来源(例如 Fedora、SUSE) |
NOT_CHECKED | UNKNOWN | 公告数据不可用(--offline、网络错误)或内核包未知 |
限制:
VULNERABLE,检测结果会说明这一点。NOT_CHECKED)。net.mptcp.enabled = 1 仅表示可以创建 MPTCP 套接字。在
任何人禁用 MPTCP 之前,mptcp 检查会收集实际使用的证据:
| 证据 | 来源 |
|---|---|
| 监听 / 已建立的 MPTCP 套接字及其进程 | ss -M -a -n -p |
握手计数器(MPCapableSYNRX、MPJoinSynRx 等) | /proc/net/netstat(MPTcpExt) |
| 采样窗口内计数器增长 | --sample-interval N |
| 通过 mptcpize 包装的服务 | 引用 mptcpize 或 libmptcpwrap 的 systemd 单元 / drop-in |
已加载 libmptcpwrap 的运行中进程 | /proc/<pid>/maps |
结果汇总在 mptcp.usage 中:
| 判定 | 含义 | 建议操作 |
|---|---|---|
IN_USE | 已建立的 MPTCP 连接、mptcpize 包装的服务,或已接受 MPTCP 连接的 MPTCP 监听器 | 在任何更改之前先确定依赖的服务 |
ACTIVE_TRAFFIC | 采样期间握手计数器增长 | 查找流量来源 |
LISTENING_ONLY | 存在 MPTCP 监听器,但自启动以来没有 MPTCP 握手——通常是机会性启用 MPTCP 的程序(Go 1.24+ 默认对监听器这样做) | 通常没有依赖;打开的监听器在重启前会保持 MPTCP |
PAST_ACTIVITY | 自启动以来计数器非零,当前无套接字 | 使用 --sample-interval 60 重新运行 |
NONE_OBSERVED | 无套接字、无计数器活动、无 mptcpize | 可以进行有计划、可回退的禁用测试 |
DISABLED / NOT_APPLICABLE | MPTCP 已关闭或未编译进内核 | — |
NONE_OBSERVED 是某一时间点的观察结果,并非证明。直接打开
IPPROTO_MPTCP 套接字的应用程序仅在其持有套接字时才会出现,
且在没有 root 权限时只能看到你自己的进程。
如果你决定测试禁用 MPTCP,请在维护窗口内进行,先在
运行时执行(sysctl -w net.mptcp.enabled=0),然后观察服务
连接和日志,再将其持久化。本工具绝不会替你做出该
更改。
初始版本聚焦于与 CVE-2026-98432 相关的配置, 这是一个 Linux 内核 IPv4 TCP 释放后使用漏洞。该工具检查:
net.ipv4.tcp_migrate_req 和 sk_reuseport BPF 程序net.mptcp.enabled 及实际 MPTCP 使用情况其补丁状态报告为 patch.CVE-2026-98432。
kernel.pending_reboot 发现项会标记仍在运行旧内核的主机。该工具不会:
在目标上运行的命令仅读取:/proc、/sys、/etc/os-release、
/boot、uname、ss、dpkg-query/rpm(包括 rpm -q --changelog)、
内核软件包的 changelog.Debian.gz、canonical-livepatch status、
bpftool prog show,以及对 systemd 单元目录执行 grep。需要注意两个副作用:
使用 ss -M 查询 MPTCP 套接字可能导致内核自动加载 mptcp_diag 诊断模块,
并且 SSH 登录会出现在目标的认证日志中。
控制器仅向上述公告来源发起出站 HTTPS 请求,且仅在 patch 检查
未使用 --offline 运行时才会发起。
python3 -m unittest discover -s tests -t . -v
CI 在 Python 3.8–3.13 上运行单元测试,并在 Ubuntu 22.04/24.04、Debian 12、Rocky Linux 9、AlmaLinux 9 和 Fedora 容器中运行本地审计。
netviser_audit/checks/<name>.py,其中包含一个 Check 子类:一个 POSIX sh collector,通过 nv_kv key value 输出事实,以及一个返回 Finding 的 evaluate(facts) 方法。netviser_audit/checks/__init__.py 中的 ALL_CHECKS 里注册它。tests/test_checks.py 中添加评估测试。收集器必须保持只读并兼容 POSIX sh(测试中会使用 sh、dash 和 bash 进行语法检查)。
mkdir -p build/pyz dist && cp -R netviser_audit build/pyz/
python3 -m zipapp build/pyz -m netviser_audit.cli:main -p "/usr/bin/env python3" -o dist/netviser-audit.pyz
由 Netviser Bilişim Teknolojileri 开发和维护。