offseq/threat-finder

GitHub: offseq/threat-finder

一款运行时漏洞扫描器,检测主机上实际运行服务中的 CVE,并根据网络暴露程度进行优先级排序。

Stars: 1 | Forks: 1

# OffSeq Threat Finder [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/f4a84bd2bf032450.svg)](https://github.com/offseq/threat-finder/actions/workflows/ci.yml) [![crates.io](https://img.shields.io/crates/v/threat-finder.svg)](https://crates.io/crates/threat-finder) [![docs.rs](https://img.shields.io/docsrs/threat-finder)](https://docs.rs/threat-finder) [![license](https://img.shields.io/crates/l/threat-finder.svg)](#license) **threat-finder** 查找主机上_实际正在运行_的易受攻击软件,而非清单中所声明的内容,并告知您哪些发现是**可通过网络访问**的。 它将每个正在运行的服务(如果使用 `--scope all`,则包括每个已安装的 OS package)解析为精确的 [Package-URL](https://github.com/package-url/purl-spec),并使用生态系统原生的版本规则将其与 [OffSeq Radar](https://radar.offseq.com) 目录进行匹配,因此反向移植/已修复的版本不会被误报。 ![OffSeq Threat Finder](https://static.offseq.com/threat-finder-preview.svg) ``` Vulnerability summary (highest risk first): openssh-server@1:8.9p1-3ubuntu0.6 — 1 finding(s) [PUBLIC tcp 0.0.0.0:22] [ACT-NOW 92] HIGH CVE-2024-6387 [KEV] regreSSHion: remote code execution in OpenSSH → fix: 1:8.9p1-3ubuntu0.10 https://radar.offseq.com/threat/… nginx@1.18.0-6ubuntu14.4 — 1 finding(s) [SCHEDULE 41] MED CVE-2023-44487 HTTP/2 Rapid Reset 2 confirmed finding(s) across 2 asset(s); 1 exposed, 1 known-exploited. ``` ## 安装说明 ``` brew install offseq/tap/threat-finder # Homebrew (macOS/Linux), prebuilt cargo binstall threat-finder # prebuilt binary, no toolchain cargo install threat-finder # from source ``` 适用于 Linux/macOS(x86_64 + arm64)和 Windows(x86_64)的预编译存档可在[发布页面](https://github.com/offseq/threat-finder/releases/latest)获取。 从源码构建需要 Rust ≥ 1.87。支持 Linux、macOS、BSD 和 Windows。 ## 快速入门 ``` export OFFSEQ_API_KEY=... # from https://radar.offseq.com/console threat-finder ``` 扫描正在运行的服务,打印按风险排名的摘要,并将完整的 JSON 报告写入 `/tmp/threats.json`。添加 `--scope all` 可同时扫描每个已安装的 OS package。 ## 使用说明 ``` threat-finder [OPTIONS] ``` | 标志 | 描述 | |------|-------------| | `-o, --output ` | 将 JSON 报告写入 `PATH`(默认:提示,或 `/tmp/threats.json`) | | `--json` | 将 JSON 报告打印到 stdout 而不是文件 | | `--scope ` | `running`(默认)或 `all`(+ 每个已安装的 OS package) | | `--severity ` | 仅报告 `critical\|high\|medium\|low` 及以上级别的发现 | | `--strict` | 丢弃坐标未确认的发现(仅报告已确认的) | | `--fail-on ` | 如果存在匹配的发现则退出码为 `5`:`any\|critical\|high\|medium\|low\|kev\|exposed` | | `--sarif ` | 同时写入 SARIF 2.1.0 报告(用于代码扫描 UI) | | `--include ` / `--exclude ` | 按名称 glob 过滤资产(可重复使用) | | `-q, --quiet` | 抑制横幅、进度和摘要 | | `--no-color` | 禁用 ANSI 颜色 | | `-y, --yes` | 假定为默认值,从不提示(CI/cron) | | `--reset` | 重新输入 API key,忽略已保存的 | | `--register` | 在 Radar 中注册被扫描的主机以进行持续监控(无提示) | | `--no-register` | 不要注册或提示在此次运行中进行监控 | | `--host-name ` | 随注册发送的友好主机名 | | `--unregister` | 从 Radar 中移除该主机的清单并退出 | | `--windows-missing-updates` | (Windows)同时列出 Windows Update Agent 中待处理的安全更新(在线扫描;需以提升权限运行) | | `-h, --help` / `-V, --version` | 帮助 / 版本 | ``` # CI: 仅限 high+ findings,JSON 输出到 stdout,无提示 OFFSEQ_API_KEY=… threat-finder --yes --json --severity high > report.json # 仅在存在网络暴露服务且具有已知被利用的 CVE 时才使构建失败 OFFSEQ_API_KEY=… threat-finder --yes --quiet --fail-on exposed ``` **退出代码:** `0` 正常 · `1` 查找/IO 错误 · `2` 无 API key · `3` 不支持的 OS · `4` 速率限制/配额,或需要 API 访问权限(需要升级) · `5` 达到 `--fail-on` 阈值。 **API key**(从 [Radar Console](https://radar.offseq.com/console) 获取一个),按以下顺序解析: 1. `OFFSEQ_API_KEY` 环境变量(最适合 CI/cron)。 2. 保存在 `$XDG_CONFIG_HOME/offseq-rust/config.toml` 中的 key(`0600` 权限),除非指定了 `--reset`。 3. TTY 上的交互式隐藏提示 —— 然后为下次保存。 在没有可用 key 的情况下非交互式(`--yes` / 无 TTY)运行将退出并返回 `2`。 设置 `OFFSEQ_CONFIG_DIR` 可覆盖配置存放位置(默认:操作系统的用户配置目录) —— 这对于需要确定性路径的容器/CI 非常方便。 ## 工作原理 **精确坐标匹配。** 每个资产都成为一个携带其_完整_版本(epoch + 发行版修订号)和 `?distro=` 限定符的 purl,例如 `pkg:deb/ubuntu/openssh-server@1:8.9p1-3ubuntu0.6?distro=jammy`。清单通过分批的 `POST /match/batch` 调用(每个分块对应一个请求)**在服务端进行匹配,并使用生态系统原生的版本规则**(dpkg/rpm/apk/semver) —— 因此像 `1.18.0-6+deb11u3` 这样经过反向移植并修复的版本能被正确识别且不报警,并且不存在客户端的版本猜测。发现结果根据 API 的 `confirmed` 标志进行拆分:已确认的匹配项会被报告;版本无法确认的坐标匹配项将作为**未确认 / 分流处理** 单独显示(不计入统计、`byCve` 和 `--fail-on`;使用 `--strict` 可将其丢弃)。 **网络暴露关联。** 清单扫描器(Trivy、Grype、osv-scanner)读取包列表;外部扫描器(Nessus、OpenVAS)需要主机外的第二主机。此工具将每个正在运行服务的进程映射到其正在**侦听**的套接字(Linux 上为 `/proc/net`,其他 Unix 上为 `lsof`,Windows 上为 `Get-NetTCPConnection` / `netstat`)并分类可达性 —— `loopback` / `private` / `public`。运行在 `0.0.0.0` 上的易受攻击服务与运行在 `127.0.0.1` 上的风险截然不同:发现结果将优先按暴露程度排名,并且 `--fail-on exposed` 正是据此对 CI 进行拦截。不会发送任何网络数据包。发现结果还会包含 CISA **KEV** 和 **EPSS**。 **基于暴露感知的优先级排序。** 每个发现都会获得一个 `riskScore` (0–100) 和一个 SSVC 风格的 `decision` 频段 —— **`act-now` · `soon` · `schedule` · `track`** —— 这是通过融合严重程度、EPSS、KEV 以及所属资产的**网络暴露情况**得出的。摘要会在每行开头显示类似 `[ACT-NOW 92]` 的徽章并据此排序,以便在存在大量干扰的主机中将少数面向公众且已知被利用的问题置顶。该分数在本地和服务端使用相同的计算公式(Radar 监控视图在 KEV 发现超过其截止日期时会增加少量加分 —— 这是一个 CLI 无法获取的日期),并且会出现在 `--json` 和 SARIF (`properties`) 中。 ## 持续监控 一次性扫描只是一个时间快照。只需注册一次主机,Radar 就会持续监控:当**新发布的 CVE** 影响到其某个坐标时,您会收到警报(邮件 + Console),并根据暴露程度进行优先级排序 —— 无需重新扫描。 在交互式扫描之后,该工具会询问: ``` Add these 42 services to Radar for continuous monitoring & alerts? [Y/n/never] ``` `Y` 注册此主机;`n` 跳过此次运行;`never` 记住您的选择(它会被保存到配置中,您将不会再被询问)。在重新扫描时,它还会报告**偏移** (`+added / -removed / ~changed`) 以及任何**自上次扫描以来的新**发现。在 [Radar Console](https://radar.offseq.com/console) 的 **Inventory** 下管理您的主机 —— 切换监控、查看发现、取消注册。 对于自动化,请跳过提示:`--register` 以非交互方式注册(在 CI 中默认关闭),`--no-register` 选择退出,`--host-name ` 标记主机,`--unregister` 将其移除。稳定的主机 ID 和您的提示偏好保存在 `$XDG_CONFIG_HOME/offseq-rust/config.toml` 中。注册永远不会更改退出代码 —— 监控故障不会导致您的扫描失败。需要 Basic/Pro/Enterprise 套餐(或 Pro Console)。 ## 范围与覆盖 `--scope running`(默认)扫描实时服务 —— 这是一个规模小但信号价值高的集合,可以对其暴露情况进行关联。`--scope all` 额外枚举**每个已安装的 OS package**(`dpkg`/`rpm`/`pacman`/`apk`/`brew`/`pkg`/`pkg_info`),将匹配范围扩大 10–50 倍。如果某个 package 也支持正在运行的、暴露的进程,则保留该暴露情况(资产会进行去重并按坐标合并)。kernel 在 `--scope all` 下作为其对应的 package(`linux-image…`)被覆盖。 ## 各 OS 支持 | OS | 发现 | 坐标来源 | |----|-----------|-------------------| | Linux (systemd) | `ListUnits` → `/proc//exe` | dpkg / rpm / pacman / apk | | Linux (SysV/OpenRC) | `service --status-all` / `rc-status` | package DB | | macOS | `launchctl list` → `ps`(仅限第三方) | Homebrew | | FreeBSD / DragonFly | `service -e` | `pkg` | | OpenBSD | `rcctl ls started` | `pkg_info` | | NetBSD | `/etc/rc.d` status | `pkg_info` | | Solaris / illumos | `svcs` → `svcprop` | 探测 (`--version`) | | Windows | `Win32_Service` → `Get-NetTCPConnection` / `netstat` | 注册表 / winget / Appx / Chocolatey / Scoop → CPE;npm / pip / dotnet → purl;OS 内部版本 → CPE | 如果没有 package 拥有某个二进制文件,版本将回退到强化的 `--version` 探测(仅限绝对路径,已清理环境)。在 macOS 上,Apple 系统服务(`com.apple.*`,受 SIP 保护的路径)会被跳过 —— 它们已被 OS 版本覆盖,探测数百个此类服务毫无意义。 在 **Windows** 上,所有信息均通过内置的 `powershell.exe` 收集(核心清单不需要额外的运行时或管理员权限)。已安装的应用程序通过精心整理的名称表映射到 NVD CPE(未映射的应用程序会回退到名称搜索,而不是错误猜测);OS 版本/内部版本将成为具有特定功能限定的 OS CPE(例如 `windows_11_23h2`);而 `--windows-missing-updates` 增加了可选的 Windows Update Agent 关于待处理安全补丁的咨询。 ## 输出 JSON 格式,具有确定性(已排序)的键且没有时间戳,因此报告可以干净地进行差异对比: - **`services`** — `pkg@version` → 已确认的发现(`cveId`、`severity`、`cvssScore`、`epss`、`kev`、`riskScore`、`decision`、`confirmed`、`matchedRange`、`matchBasis`、`fixedVersions`、`remediation`、`cwes`、`references`、`radarUrl`),按风险由高到低排列。 - **`unconfirmed`** — 版本无法确认的坐标匹配项(分流处理)。 - **`assets`** — `pkg@version` → `{ exe, versionSource, exposed, reachability, listeners }`(`versionSource` = `package-db` | `probe`;`reachability` 涵盖 TCP **和** UDP)。 - **`byCve`** — 每个 CVE 汇总了所有受影响的资产(“修补一次,解决多个”)。 - **`errors`** — 每个资产的查找失败,因此失败绝不会被误读为“干净”。 - **`registration`** — 当运行注册了主机时出现:`host_id`、`monitoring`、`drift`、`summary`、`newSinceLastCount`。 - **`meta`** — `{ tool, version, schemaVersion }`(`schemaVersion` 为 2)。 代码扫描 UI 也可使用 SARIF 2.1.0 报告 (`--sarif`)。 ## OffSeq 生态系统 | | |---|---| | [**OffSeq**](https://offseq.com) | 欧盟安全审计、威胁监控、CISO 即服务、NIS2 合规 | | [**Radar**](https://radar.offseq.com) | 实时威胁情报 —— threat-finder 匹配的目录 | | [**Radar Console**](https://radar.offseq.com/console) | 订阅、自定义订阅源和您的 `OFFSEQ_API_KEY` | | [**Radar API**](https://radar.offseq.com/api-docs) | 此处使用的 `/match` endpoint 的 REST 文档 | | [**Radar Threats**](https://radar.offseq.com/threats) | 可搜索的 CVE / 恶意软件 / 威胁行为者数据库 | | [**Radar Feeds**](https://radar.offseq.com/feeds) | 聚合 CISA、CIRCL、ThreatFox 等的自定义订阅源 | | [**Radar 定价**](https://radar.offseq.com/pricing) | 从免费层到企业版 | | [**Breach**](https://breach.offseq.com) | 暗网数据泄露和暴露凭证监控 | | [**Veil**](https://veil.offseq.com) | 客户端 PNG 隐写术 (AES-256-GCM) | | [**Guard**](https://offseq.com/guard/) | AI 网站安全与合规分析师 | | [**培训**](https://training.offseq.com) | PECB 认证的安全和隐私课程 | ## 开发 ``` cargo build --release cargo test # unit tests cargo test -- --ignored # + macOS live-discovery smoke test cargo clippy --all-targets ``` 引擎是一个 library crate(`find_threats`),具有 `Collector` 抽象(目前支持正在运行的服务和 OS package;接下来支持 lockfile / container / SBOM),因此二进制文件只是其上的一个轻量级 CLI。 ## 许可证 根据您的选择,在 [MIT](LICENSE) 或 [Apache-2.0](LICENSE) 双重许可下授权。
标签:AI合规, Claude, CVE检测, LNA, Rust, Web报告查看器, 可视化界面, 子域名枚举, 插件系统, 系统安全, 网络流量审计, 通知系统