btdt1983/vulnscan-ai
GitHub: btdt1983/vulnscan-ai
一款 FIPS 感知的 RHEL 系漏洞扫描工具,结合多源数据与 AI 辅助进行审批式事务化修复。
Stars: 1 | Forks: 0
# vulnscan-ai
[](https://github.com/btdt1983/vulnscan-ai/actions/workflows/ci.yml)
[](LICENSE)
[](https://github.com/btdt1983/vulnscan-ai/releases)
**[官方网站](https://vulnscan-ai.techhack.nl)** · **[通过 dnf 安装](https://repo.techhack.nl)** · **[命令参考](COMMANDS.md)** · **[贡献指南](CONTRIBUTING.md)**
一个感知 FIPS 的命令行工具,适用于 **基于 RHEL 的发行版** (RHEL,
AlmaLinux, Rocky, CentOS Stream, Fedora),它可以:
1. 使用原生和公开的来源对主机**扫描**已知漏洞,
2. 从在线漏洞数据库中**丰富**发现的信息,
3. 使用 **LLM**(默认为 Claude;可选 OpenAI / Gemini / Kimi / DeepSeek /
Mistral / 本地模型)来**提出修复建议**,
4. **仅在明确批准后应用修复**(或在 `--dry-run` 模式下),根据安全拒绝列表筛选
每一个命令,
5. 导出 **PDF 报告**(如果未安装 `reportlab`,则导出 HTML)。
它在底层使用 CLI 工具(`dnf`/`yum`、`rpm`,可选 `oscap`)并
查询漏洞网站(Red Hat Security Data API、NIST NVD)。
## 为什么这样选择
| 决策 | 选择 |
|---|---|
| 语言 | Python 3(RHEL 自带;无强制第三方依赖) |
| 扫描器 | CVE: `dnf`/RHSA, OpenSCAP/OVAL, NVD/Red Hat feeds. 加固/暴露: `ssh`, `systemd`, `ports`, `webroot`, `container` |
| 优先级排序 | **CISA KEV**(已被积极利用)+ 每个发现结果的 **EPSS** 利用概率 |
| 安全公告 | `news` 命令 + dashboard 标签页: CISA KEV, NVD, 发行版勘误(带缓存,支持离线) |
| 修复模式 | 默认为 **建议 + 批准**(对生产环境/FIPS 最安全) |
| AI 后端 | 默认为 **Claude**;为其他提供可插拔的适配器 |
## FIPS 状态
- 不捆绑密码学。所有 TLS/哈希操作均使用 **系统 OpenSSL**,这是 RHEL 上经过 FIPS 140 验证的模块。
- 从 `/proc/sys/crypto/fips_enabled` 自动检测 FIPS 模式
(`vulnscan-ai info` 会显示状态)。
- 出站 HTTPS 强制锁定 **TLS 1.2+** 并遵循系统加密策略。
- 哈希仅使用 **SHA-256**;从不使用旧版摘要算法(如 md5),因此当 FIPS 策略禁用它们时,工具仍能正常工作。
- 对于数据敏感或与物理隔离(air-gapped)的站点,请使用 `--provider local`,这样任何发现的数据都不会离开主机。
## 安装说明
```
# 核心工具(无需第三方依赖)— PDF 开箱即用
pip install .
# 可选:通过 reportlab 获得更丰富的 PDF 布局(否则自动使用内置的)
# 无依赖 PDF 写入器
pip install '.[pdf]' # pulls in reportlab
# 或在 RHEL 上: dnf install python3-reportlab
```
也可以直接从检出的代码中运行:`python -m vulnscanai ...`
## 配置 AI 提供商
AI 步骤会提出修复建议(由您批准)。默认为 Claude。有两种
设置方法。
### 最简单的方法:设置向导
运行 **`vulnscan-ai setup`**(它也会在首次交互使用时运行)并选择:
- **云提供商** — `claude` / `openai` / `gemini` / `kimi` / `deepseek` /
`mistral`。粘贴 API 密钥(隐藏输入),从该提供商已知 ID 的菜单中选择
模型(仍允许使用自定义 ID),对于 Claude,还可以选择推理
努力程度。密钥存储在每用户配置(模式 0600)中并自动
使用 — 无需管理环境变量。
- **本地离线模型** — 下载适合主机规格的 Ollama 模型;无需
密钥,数据不会离开机器。
### 手动配置:环境变量
或者您自己设置密钥 — 真实的 env 变量始终优先于向导存储的变量:
```
export ANTHROPIC_API_KEY=sk-ant-... # claude (default)
export OPENAI_API_KEY=... # openai
export GEMINI_API_KEY=... # gemini
export MOONSHOT_API_KEY=... # kimi
export DEEPSEEK_API_KEY=... # deepseek (DeepSeek-Coder)
export MISTRAL_API_KEY=... # mistral (Mixtral 8x7B)
export OLLAMA_HOST=http://127.0.0.1:11434 # local (no key)
export OLLAMA_MODEL=llama3.2:1b # local model to use
export NVD_API_KEY=... # optional, higher NVD rate limit
```
DeepSeek 和 Mistral 都使用 OpenAI Chat Completions API;使用
`DEEPSEEK_BASE_URL` / `MISTRAL_BASE_URL` 覆盖端点,使用
`--model` 覆盖模型(例如 `deepseek-chat`, `mistral-large-latest`)。**StarCoder 2** 没有
托管 API — 可通过 `local` 提供商离线运行:
`vulnscan-ai --provider local --model starcoder2 fix`(在执行 `ollama pull starcoder2` 之后)。
**模型与推理努力程度。** 使用 `--model`(或 `model`
配置)选择模型,例如使用 `--model claude-opus-4-8` 选择功能最强大的 Claude。对于 Claude,
您还可以使用 `--effort low|medium|high|xhigh|max` 调节**推理努力程度**
(配置项 `claude_effort`,环境变量 `VULNSCANAI_CLAUDE_EFFORT`)— 它会开启自适应
思考机制,使模型在处理复杂的修复时更加深入。当正确性比成本更重要时,请使用 `max`;其他提供商会忽略此标志。
### 完全离线 / 物理隔离 (Ollama)
无需 API 密钥,不进行外部调用 — AI 步骤针对本地模型运行。
**最简单的方法:设置向导。** 在首次交互式运行时,该工具会提供一个
离线模型菜单(根据主机 RAM 调整大小),可以安装 Ollama,下载
您选择的模型,并将其保存为默认值。随时可以通过以下命令运行:
```
vulnscan-ai setup
```
```
vulnscan-ai setup — offline AI model
Detected RAM: 7.3 GB total, 2.0 GB available.
# model download needs RAM notes
1 qwen2.5:0.5b 0.4 GB fits tiny & fastest (recommended)
2 llama3.2:1b 1.3 GB tight/swap good balance, CPU-friendly
3 llama3.2:3b 2.0 GB tight/swap better quality
...
0 skip for now
```
自动提示仅在交互式终端上出现(systemd 定时器永远不会触发);使用 `VULNSCANAI_NO_SETUP=1` 抑制它。
**GPU 支持。** 当存在带驱动程序的 NVIDIA/AMD GPU 时,Ollama 会自动运行所选模型的 GPU 加速版本 — 无需不同的模型或配置。
向导会检测 GPU,根据 **VRAM** 调整菜单大小(提供更大、
更高质量的模型),并且 `vulnscan-ai info` 会报告 GPU。在仅支持 CPU 的
主机上,它会根据 RAM 调整大小,并引导您使用更小的模型。
**手动等效操作:**
```
curl -fsSL https://ollama.com/install.sh | sh
sudo systemctl enable --now ollama
ollama pull llama3.2:1b
vulnscan-ai providers # 'local' shows 'ready' when the server answers
vulnscan-ai --provider local --model llama3.2:1b fix --min-severity important
```
该工具要求 Ollama 输出受 JSON 约束的结果,因此即使是小型模型也能返回
可解析的修复计划。禁用丰富功能 (`--no-enrich`) 也可以使扫描
完全离线;OVAL/RHSA 数据可以通过 `update-oval` 和
镜像仓库进行预置。
## 用法
```
# 不想记住参数?运行时不带命令即可进入交互式菜单
# (方向键 / 数字)涵盖所有命令:
vulnscan-ai # or: vulnscan-ai menu
# 显示主机 / FIPS / 扫描器 / provider 状态
vulnscan-ai info
# 扫描,保存发现结果,并生成 PDF
vulnscan-ai scan --pdf report.pdf
# 仅显示重要及以上级别的问题
vulnscan-ai scan --min-severity important
# 使用 Claude 提议修复方案并以交互方式批准
vulnscan-ai fix
# 一次性完成扫描 + 修复,dry-run(仅规划,不执行任何操作),输出 PDF
vulnscan-ai fix --scan --dry-run --pdf plan.pdf
# 使用不同的 provider/model
vulnscan-ai --provider openai --model gpt-4o fix
vulnscan-ai --provider claude --model claude-opus-4-8 fix
# 非交互模式(CI):自动批准每个已审查的修复
vulnscan-ai fix --yes
# 从上次扫描重新渲染报告
vulnscan-ai report -o latest.pdf
# 使用 OpenSCAP/OVAL 扫描 — 当数据过期(>7 天)时 feed 会自动刷新;
# update-oval 仅用于预载(适用于 air-gapped 主机)
vulnscan-ai update-oval
vulnscan-ai scan --scanner dnf --scanner oscap --pdf report.pdf
# 审计 sshd 加固(root 登录、弱加密算法/MACs/KEX 等)
vulnscan-ai scan --scanner ssh
# 审计 systemd 服务沙箱化(systemd-analyze security)
vulnscan-ai scan --scanner systemd
# 审计网络暴露情况(通过 ss 查看存在风险的监听端口)
vulnscan-ai scan --scanner ports
# 审计 web 文档根目录中暴露的文件(.sql 导出文件、.env、.git/、备份文件)
vulnscan-ai scan --scanner webroot
# 审计运行中的 Podman/Docker 容器是否存在不安全的运行时设置
vulnscan-ai scan --scanner container
# 一次性运行所有可用的扫描器
vulnscan-ai scan --all
```
`systemd` 扫描器默认是保守的(仅针对 `UNSAFE`、已启用的
服务、暴露分数 ≥ 9.0,跳过无法加固的单元);使用
`VULNSCANAI_SYSTEMD_MIN_EXPOSURE` 放宽或收窄范围。它的修复是通过
同一个事务引擎应用的 systemd drop-in 文件(`daemon-reload` → `systemd-analyze verify` →
重启 → 回滚)。
### 降低误报率
扫描器的构建旨在避免噪声:
- **OVAL (`oscap`)** 仅报告真正的 *补丁* 建议 — `inventory`/合规
定义(例如“OS 已安装”)会被丢弃 — 并从 feed 元数据中提取正确的 CVE ID 和严重性。
- **`ports`** 会抑制主机防火墙阻止的端口(如果防火墙丢弃了 `0.0.0.0` 上的套接字,则它就不是一个暴露点)。它在
运行时会读取 **firewalld**,并在没有
firewalld 的主机上回退到原始的 **nftables** (`nft --json list ruleset`) — 遵循默认拒绝的 `input` 策略、接受规则
(单个端口、命名集合、范围)和显式的丢弃/拒绝规则。它只会抑制那些它能确信被阻止的端口,因此解析遗漏永远不会
隐藏真正的暴露。
- **`dnf` 和 `oscap` 同时报告**的发现结果(相同的建议/CVE)被合并
为一个。
- **已修补** (`dnf check-update`):如果某个软件包发现结果的修复已在
仓库元数据中,但*没有可安装的更新*,则会被丢弃 — 因为该主机已经
拥有该补丁。这可以清除常见的 **陈旧旧内核** 噪声:旧内核保持
安装状态,因此扫描器会不断列出历史内核建议,但 `dnf`
报告为“无需操作”,因为最新的内核已在系统上。
Won't-fix(不予修复)类型的建议永远不会通过这种方式丢弃。使用
`"patched_filter": false` 禁用。
- **供应商修复状态**(在丰富信息期间):Red Hat 会针对每个 CVE 和每个
产品发布每个软件包是否确实受到影响。对于此 RHEL 发行版,被 Red Hat 标记为 **“不受影响”** 的发现结果会被作为已确认的误报丢弃;**“不予修复” / “超出支持范围” / “推迟修复”** 的结果会被
保留并添加注释(这是一个真实的问题,但不会发布 dnf 更新 — 需手动
缓解),这样 AI 就不会提出无意义的 `dnf update` 建议。在配置中使用
`"vendor_state_filter": false` 禁用。
- **运行时暴露**(本地,`rpm` + `systemctl`):如果存在漏洞的守护进程软件包
的服务单元**全部停止 *并且* 被禁用/屏蔽**,那么在有人启动它之前都不会构成暴露,因此该发现结果会被 **降级为 `low`** 并
添加注释(它仍然会显示在完整报告中,并且如果您启用该单元,它会以完整的严重性重新出现)。设计上保持保守:**不**包含
服务单元的软件包(如 `openssl`/`glibc` 等库、CLI 工具)永远不会被触及,
处于启用状态、`static` 或拥有监听套接字的单元被视为存在暴露,而未确定的状态将保持完全的严重性。在配置中使用
`"service_state_filter": false` 禁用。
- **`container`** 仅检查**正在运行**的容器,并标记那些明确具有
危险性设置的容器(`--privileged`、运行时控制套接字或绑定了敏感的
宿主机路径、host 网络/PID/IPC 命名空间、添加了危险的
capabilities、禁用的 seccomp/SELinux)。良性的绑定挂载将被忽略,
只读挂载会降低一个严重等级,并且 `--privileged` 将仅被报告一次,
而不是像洪水一样产生每个 capability 的单独发现。
- **基线 (baseline)** 会静默处理已接受的发现结果:配置中的 `"ignore": [...]`,
`~/.config/vulnscan-ai/ignore` 中的一行一条,`VULNSCANAI_IGNORE=a,b`,或者
`--ignore PATTERN`。模式匹配发现结果的 ID、CVE、建议、软件包或
标题(允许通配符);扫描器会报告它抑制了多少结果。在 `fix`
期间,您还可以按 **`i`** 键接受已审查的发现结果,并将其
立即添加到基线中 — 这对于您已接受的加固项非常有用(例如在仅限局域网的主机上进行 SSH 密码认证;使用 `--ignore "SSH*"` 可接受整个类别的项目)。
### 感知漏洞利用的优先级排序
减少噪声只是工作的一半;另一半是呈现攻击者*实际上正在使用*的内容。在丰富信息期间,每个 CVE 都会与两个公开数据源进行比对:
- **CISA KEV** — 已知被利用漏洞目录。如果匹配,则意味着
该缺陷正在野外被利用:发现结果会被标记为 `[KEV]`,排序到最前,并提升至至少 `important` 级别,这样它就不会出现在您的严重性底线之下而被忽视。
- **EPSS** — FIRST.org 的漏洞利用概率评分;高数值会显示为
`[EPSS xx%]`。
相同的数据源还为 **`news`** 命令和 dashboard 的 **Advisories** 标签页
(CISA KEV、NVD 以及您发行版的勘误)提供支持,这些数据会在本地缓存,因此可以离线
工作。使用 `"exploit_enrich": false` 禁用丰富功能;使用
`"news_enabled": false` 关闭新闻标签页。
```
# 最新安全公告,优先显示被积极利用的;[on-host] = 匹配您上次的扫描
vulnscan-ai news --refresh
```
PDF 输出始终会生成真正的 PDF:如果安装了 `reportlab`,它会使用它,
否则使用内置的无依赖 PDF 编写器。使用 `.html` 扩展名可以
生成 HTML 报告。
### 安全修复支持自动回滚的事务性应用
当修复涉及到 **配置文件或服务**(例如 sshd 加固发现结果)时,
`fix` 会以事务性的方式应用它,而不是盲目地运行命令:
1. **备份** `/backups//` 下受影响的文件。
2. **应用**更改。
3. **在重启前验证** — 例如 `sshd -t` — 这样损坏的配置永远不会进入到重启阶段。
4. **重新加载**服务(优先使用 `reload` 而非 `restart`)并确认其保持活动状态。
5. **自动回滚** — 如果*任何*步骤失败,都会恢复备份并重新启动服务,因此糟糕的 sshd 编辑不会将您拒之门外。
每一步在运行时都会**实时流式传输** — 备份、每个命令、验证
步骤、重新加载/健康检查(以及任何回滚)— 以及命令自身的
输出,让您可以准确看到修复在执行时正在做什么。
```
# AI 提议并应用,并带有上述安全网
vulnscan-ai fix --scanner ssh --scan
# 稍后根据其存储的备份撤销修复
vulnscan-ai rollback --list
vulnscan-ai rollback
```
不想立即应用?可以生成可审查的产物来代替 — 一个
独立的 bash 脚本(具有相同的备份/验证/回滚逻辑)或
Ansible playbook:
```
vulnscan-ai fix --export-script fix.sh --export-ansible fix.yml
```
### 机读格式导出(用于工单系统 / 代码扫描)
输出格式由文件扩展名决定 — `.pdf`、`.html`、`.json` 或
`.sarif` (SARIF 2.1.0):
```
vulnscan-ai scan --sarif findings.sarif --json findings.json
vulnscan-ai report -o findings.sarif # from the last saved scan
```
- **SARIF 2.1.0** 可导入 GitHub code scanning、DefectDojo 和大多数
漏洞管理流水线中。严重性映射到 SARIF 级别
(critical/important→`error`,moderate→`warning`,low→`note`),并且每个结果
都带有一个数字 `security-severity`(已知时使用 CVSS)以及 CVE/建议/
软件包/修复元数据和一个稳定的 `partialFingerprints` ID。
- **JSON** 是一个扁平文档:包含工具元数据、严重性摘要和完整的
发现结果(包括任何 AI 修复建议)。
典型的操作员循环:`scan` → 审查表 → `fix`(逐项批准) →
将 PDF 附加到您的更改工单中。
## 计划内的自动扫描 (systemd 定时器)
`scheduled` 子命令以非交互方式运行:它会进行扫描,将带有日期的
报告写入报告目录,轮换旧报告,并且**从不应用修复**。
```
# timer 运行的内容
vulnscan-ai scheduled --keep 30
# 其中嵌入了 AI 修复建议(需要 provider 密钥;不执行任何操作)
vulnscan-ai scheduled --plan
# CI/监控:当发现严重问题时以非零状态码退出
vulnscan-ai scheduled --fail-on important # exit 3 if any >= important
```
RPM 安装了一个 `vulnscan-ai.timer`(每日运行,1 小时抖动,支持追赶执行)。通过以下命令启用它:
```
sudo systemctl enable --now vulnscan-ai.timer
systemctl list-timers vulnscan-ai.timer
journalctl -u vulnscan-ai.service # last run's output
ls /var/lib/vulnscan-ai/reports/ # generated PDFs
```
仅扫描的运行不需要 API 密钥,也不会向主机外部发送任何内容。若要启用
`--plan`,请在 `/etc/vulnscan-ai/vulnscan-ai.env`(模式 0640)中放入密钥,并将
`--plan` 添加到 `ExecStart`(通过 `systemctl edit vulnscan-ai.service` 覆盖)。
### 扫描之间的漂移
每次 `scan` 都会与之前保存的发现结果进行比较,并打印出自上次运行以来**新增**的内容以及已**解决**的内容,这样您就可以观察主机安全态势随时间的变化。`scheduled` 会报告相同的漂移计数。
### 邮件通知
当计划内扫描发现达到或超过特定严重级别的内容,或自上次扫描以来有任何新发现时,它可以通过电子邮件发送纯文本摘要。请在向导(`vulnscan-ai setup` → *Email notifications*)或配置中进行设置:
```
{
"notify_email": "ops@example.com",
"notify_min_severity": "important",
"smtp_host": "smtp.example.com",
"smtp_port": 587,
"smtp_from": "vulnscan-ai@example.com",
"smtp_user": "vulnscan-ai",
"smtp_starttls": true
}
```
SMTP 密码从 `VULNSCANAI_SMTP_PASSWORD`(首选)读取,或者从配置中的 `smtp_password` 读取。发送邮件绝不会中断扫描 — 失败的邮件会被记录下来,运行会继续。如果未设置 `notify_email`,则不会发送任何内容。
## Dashboard (HTTPS, 登录)
`vulnscan-ai dashboard` 通过一个小巧的 HTTPS Web UI 提供已保存的发现结果 — 包含其解释、CVE 和任何 AI 修复计划 — 并位于登录机制之后。它仅使用标准库(无需额外安装包),使用首次运行时生成的自签名证书,并采用单一管理员账户 — 默认用户名为 **`admin`**(通过 `--user` 更改),密码使用 PBKDF2-SHA256 哈希处理。启动时,它会打印登录用户名,并且如果端口在 firewalld 中看起来是关闭的,它还会打印防火墙提示。
```
# 1. 设置管理员密码(以哈希值存储;默认用户名为 'admin',除非指定了 --user)
sudo vulnscan-ai dashboard --set-password
# 2. 运行它(前台运行),或者启用该服务
sudo vulnscan-ai dashboard # https://:65101/
sudo systemctl enable --now vulnscan-ai-dashboard
```
默认情况下,它**仅绑定到 localhost** — 可通过 SSH 隧道访问
(`ssh -L 65101:localhost:65101 host`)。要让特定机器访问,请将它们添加到
允许列表(通过 CLI 或 dashboard 本身);随后服务器也会监听
网络,但**仅**为允许列表中的客户端(和 localhost)提供服务:
```
sudo vulnscan-ai dashboard --allow 10.0.0.0/24 --allow 192.168.1.5
sudo vulnscan-ai dashboard --list # show user/port/bind/allow-list
```
在设置密码之前它拒绝启动,因此发现结果永远不会在未经身份验证的情况下暴露。端口 (`--port`,默认 65101) 和绑定地址 (`--bind`) 是可覆盖的。
### 从 Dashboard 进行扫描和修复
- 顶部的**摘要磁贴**显示总数和每个严重级别的计数,此外,当有任何发现匹配时,还会显示一个 **actively-exploited (CISA KEV)** 磁贴和一个 **EPSS ≥50%** 磁贴 — 利用信号会直接显示在前面,而不是被埋没在列表中。
- **Scan now**(顶部按钮)在后台运行配置的扫描器,并在完成后刷新页面。
- **Preview fix**(针对每个发现)会向 AI 请求修复建议并显示该
计划 — 属于 dry-run(空运行),不会执行任何操作。需要配置 AI 提供商。
- **Apply fix** 实际上会在主机上运行修复(事务性,并带有
自动回滚)。它**默认关闭** — 除非您在配置中使用 `"dashboard_allow_fix": true` 选择开启,否则 dashboard 保持只读状态。只有
在那之后“Apply”按钮才会出现。(登录 + 允许列表仍然会控制访问权限。)
向网络开放它分为两层:应用程序允许列表**和**主机
防火墙。firewalld 默认阻止该端口 — 请仅为您的客户端允许该端口:
```
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" \
source address="192.168.0.0/24" port port="65101" protocol="tcp" accept'
sudo firewall-cmd --reload
```
## 安全模型
- 模型**仅提出**命令建议;它从不自行执行任何操作。
- 建议的命令在运行前必须经过拒绝列表检查 (`rm -rf /`、`mkfs`、`curl|sh`、
`setenforce 0`、`--nodeps`、软件包移除、加密策略降级等)。
- 除非您传递 `--yes`,否则如果没有针对每个发现的批准,则不会运行任何命令。
- `--dry-run` 会在报告中记录完整的计划,而不会对系统产生任何影响。
- 需要重启的修复会在输出和报告中标记出来。
- 配置/服务修复是**事务性**的:备份 → 应用 → 重启前验证 → 重新加载 → **失败时自动回滚**,因此糟糕的编辑不会导致服务停滞。稍后可以使用 `rollback` 进行还原。
## 布局
```
vulnscanai/
cli.py # argparse CLI: info/scan/fix/rollback/report/providers/...
config.py # config file + env + flag precedence
fips.py # FIPS detection, approved hashing, hardened TLS context
http.py # stdlib HTTP over the hardened TLS context
models.py # Finding / Remediation dataclasses
remediation.py # AI prompt, JSON parse, screening, transactional apply+rollback
export_fix.py # render fixes as a bash script or Ansible playbook
report.py # block model + reportlab / native-PDF / HTML renderers
pdfwriter.py # dependency-free PDF writer (built-in fonts)
scanners/ # dnf+RHSA, OpenSCAP/OVAL, sshd/systemd/ports hardening, CVE enrich
ai/ # claude (default), openai, gemini, kimi, deepseek, mistral, local
```
## 免责声明
自动化修复会更改实时系统。请审查建议,优先考虑
先执行 `--dry-run`,并在非生产主机上进行测试。AI 建议可能是
错误的 — 批准把关机制的存在是有原因的。
## 许可证
版权所有 (C) 2026 techhack。基于 **GNU Affero General Public
License v3.0 or later** ([AGPL-3.0-or-later](LICENSE)) 授权。这使得项目保持
开源:任何运行修改版本的人 — 包括通过网络作为服务 —
都必须在相同的条款下公开其源代码。
版权所有者保留根据单独的**商业条款**提供软件的权利。贡献将在
[贡献者许可协议](CLA.md) 下被接受(参见 [CONTRIBUTING.md](CONTRIBUTING.md)),该协议保留了该选项。如需商业许可证,请联系
btdt1983@protonmail.com。
标签:AI风险缓解, CSV导出, RHEL, Web报告查看器, 人工智能, 加密, 安全合规, 模块化设计, 漏洞扫描器, 用户模式Hook绕过, 系统运维, 网络代理, 自动化修复