
threat-finder v0.3.0
Сканер уязвимостей времени выполнения: находит CVE в сервисах, фактически запущенных на хосте, и ранжирует их по сетевой доступности.
OffSeq Threat Finder
threat-finder находит уязвимое ПО, реально запущенное на хосте, — а не то,
что заявляет манифест, — и сообщает, какие находки доступны по сети. Он
приводит каждый запущенный сервис (а с --scope all — и каждый установленный
пакет ОС) к точному Package-URL и
сопоставляет его с каталогом OffSeq Radar, используя
нативные для экосистемы правила версий, поэтому бэкпортированные/исправленные
сборки не помечаются ложно.
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/…
[email protected] — 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) доступны на странице релизов. Для сборки из исходников требуется 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,
чтобы также просканировать каждый установленный пакет ОС.
Использование
threat-finder [OPTIONS]
| Флаг | Описание |
|---|---|
-o, --output <PATH> | Записать JSON-отчёт в PATH (по умолчанию: запрос, или /tmp/threats.json) |
--json | Вывести JSON-отчёт в stdout вместо файла |
--scope <SCOPE> | running (по умолчанию) или all (+ каждый установленный пакет ОС) |
--severity <LEVEL> | Сообщать только о находках уровня critical|high|medium|low и выше |
--strict | Отбрасывать находки с неподтверждёнными координатами (сообщать только о подтверждённых) |
--fail-on <WHAT> | Выход с кодом 5 при наличии соответствующих находок: any|critical|high|medium|low|kev|exposed |
--sarif <PATH> | Также записать отчёт SARIF 2.1.0 (для интерфейсов сканирования кода) |
--include <GLOB> / --exclude <GLOB> | Фильтровать активы по glob-шаблону имени (можно указывать несколько раз) |
-q, --quiet | Подавить баннер, индикатор выполнения и сводку |
--no-color | Отключить ANSI-цвета |
-y, --yes | Использовать значения по умолчанию, никогда не запрашивать (CI/cron) |
--reset | Заново ввести API-ключ, игнорируя сохранённый |
--register | Зарегистрировать просканированный хост в Radar для непрерывного мониторинга (без запроса) |
--no-register | Не регистрировать и не запрашивать мониторинг в этом запуске |
--host-name <NAME> | Понятное имя хоста, отправляемое при регистрации |
--unregister | Удалить инвентаризацию этого хоста из Radar и выйти |
--windows-missing-updates | (Windows) Дополнительно вывести ожидающие обновления безопасности от агента Windows Update (онлайн-сканирование; запускать с повышенными правами) |
-h, --help / -V, --version | Справка / версия |
# CI: only high+ findings, JSON to stdout, no prompts
OFFSEQ_API_KEY=… threat-finder --yes --json --severity high > report.json
# Fail the build only when a network-exposed service has a known-exploited CVE
OFFSEQ_API_KEY=… threat-finder --yes --quiet --fail-on exposed
Коды выхода: 0 — успешно · 1 — ошибка поиска/ввода-вывода · 2 — нет
API-ключа · 3 — неподдерживаемая ОС · 4 — лимит запросов/квота или требуется
доступ к API (нужно обновление) · 5 — достигнут порог --fail-on.
API-ключ (получите его в Radar Console), определяется в следующем порядке:
- Переменная окружения
OFFSEQ_API_KEY(лучше всего для CI/cron). - Сохранённый ключ в
$XDG_CONFIG_HOME/offseq-rust/config.toml(0600), если не указан--reset. - Интерактивный скрытый запрос в TTY — затем сохраняется для следующего раза.
В неинтерактивном режиме (--yes / нет TTY) при отсутствии ключа происходит
выход с кодом 2.
Задайте OFFSEQ_CONFIG_DIR, чтобы переопределить расположение конфигурации
(по умолчанию: стандартная для ОС пользовательская папка конфигурации) — удобно
для контейнеров и CI, которым нужен детерминированный путь.
Как это работает
Точное сопоставление координат. Каждый актив становится purl с полной
версией (эпоха + ревизия дистрибутива) и квалификатором ?distro=, например
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: подтверждённые совпадения сообщаются; координатные совпадения,
версию которых нельзя подтвердить, выводятся отдельно как unconfirmed /
triage (исключены из подсчёта, byCve и --fail-on; отбросьте их с помощью
--strict).
Корреляция сетевой доступности. Сканеры манифестов (Trivy, Grype,
osv-scanner) читают списки пакетов; внешние сканеры (Nessus, OpenVAS) требуют
второй хост. Этот инструмент сопоставляет процесс каждого запущенного сервиса
с сокетами, на которых он слушает (/proc/net в Linux, lsof в других
Unix-системах, Get-NetTCPConnection / netstat в Windows), и классифицирует
достижимость — loopback / private / public. Уязвимый сервис на 0.0.0.0 —
это совсем иной риск, чем на 127.0.0.1: находки ранжируются с приоритетом
доступности, а --fail-on exposed привязывает CI именно к этому. Пакеты не
отправляются. Находки также несут CISA KEV и EPSS.
Приоритизация с учётом доступности. Каждая находка получает riskScore
(0–100) и диапазон decision в стиле SSVC — act-now · soon · schedule · track —
объединяющий серьёзность, EPSS, KEV и сетевую доступность актива-владельца.
Сводка начинает каждую строку с бейджа в стиле [ACT-NOW 92] и сортирует по
нему, поэтому немногочисленные публично доступные и известные эксплуатируемые
проблемы всплывают наверх в зашумлённом хосте. Оценка использует одну и ту же
формулу локально и на стороне сервера (в представлении мониторинга Radar
добавляется небольшой бонус, когда находка KEV просрочена — дата, которой у CLI
нет), и появляется в --json и SARIF (properties).
Непрерывный мониторинг
Разовый скан — это лишь один момент времени. Зарегистрируйте хост один раз, и Radar продолжит наблюдение: когда недавно опубликованный CVE затрагивает одну из его координат, вы получаете оповещение (email + Console), приоритизированное по доступности — повторное сканирование не нужно.
После интерактивного сканирования инструмент спрашивает:
Add these 42 services to Radar for continuous monitoring & alerts? [Y/n/never]
Y регистрирует этот хост; n пропускает этот запуск; never запоминает ваш
выбор (он сохраняется в конфигурации, и вас больше не спросят). При повторном
сканировании также сообщается о дрейфе (+added / -removed / ~changed) и о
любых находках, новых с момента последнего сканирования. Управляйте хостами
— включайте/выключайте мониторинг, просматривайте находки, отменяйте
регистрацию — в разделе Inventory в Radar Console.
Для автоматизации пропустите запрос: --register регистрирует в неинтерактивном
режиме (по умолчанию выключен в CI), --no-register отказывается от
регистрации, --host-name <NAME> задаёт имя хоста, а --unregister удаляет его.
Стабильный идентификатор хоста и ваше предпочтение по запросам хранятся в
$XDG_CONFIG_HOME/offseq-rust/config.toml. Регистрация никогда не меняет код
выхода — сбой мониторинга не приведёт к провалу сканирования. Требуется
тарифный план Basic/Pro/Enterprise (или Pro Console).
Область охвата
--scope running (по умолчанию) сканирует живые сервисы — небольшой, но
высокоинформативный набор, доступность которого можно коррелировать.
--scope all дополнительно перечисляет каждый установленный пакет ОС
(dpkg/rpm/pacman/apk/brew/pkg/pkg_info), расширяя сопоставляемую
поверхность в 10–50 раз. Пакет, который также обеспечивает работу запущенного и
доступного процесса, сохраняет эту доступность (активы дедуплицируются и
объединяются по координатам). Ядро покрывается как свой пакет (linux-image…)
при --scope all.
--scope allможет дать от сотен до тысяч пакетов. На бесплатном тарифе (15 поисков/час) это приведёт к ограничению частоты запросов; инструмент предупреждает, когда инвентаризация превышает бюджет. (Поиски уже пакетируются; локальный кэш результатов — в планах.)
Поддержка по ОС
| ОС | Обнаружение | Источник координат |
|---|---|---|
| Linux (systemd) | ListUnits → /proc/<pid>/exe | dpkg / rpm / pacman / apk |
| Linux (SysV/OpenRC) | service --status-all / rc-status | база пакетов |
| macOS | launchctl list → ps (только сторонние) | Homebrew |
| FreeBSD / DragonFly | service -e | pkg |
| OpenBSD | rcctl ls started | pkg_info |
| NetBSD | статус /etc/rc.d | pkg_info |
| Solaris / illumos | svcs → svcprop | зонд (--version) |
| Windows | Win32_Service → Get-NetTCPConnection / netstat | реестр / winget / Appx / Chocolatey / Scoop → CPE; npm / pip / dotnet → purl; сборка ОС → CPE |
Если ни один пакет не владеет бинарником, версия определяется через усиленный
зонд --version (только абсолютные пути, очищенное окружение). В macOS
системные сервисы Apple (com.apple.*, пути под защитой SIP) пропускаются — они
покрываются версией ОС, и зондировать сотни из них бессмысленно.
В Windows всё собирается через встроенный powershell.exe (без
дополнительной среды выполнения и без прав администратора для базовой
инвентаризации). Установленные приложения сопоставляются с NVD CPE через
курируемую таблицу имён (несопоставленные приложения используют поиск по имени,
а не неверное предположение); редакция/сборка ОС становится CPE ОС с
квалификацией по функциям (например, windows_11_23h2); а
--windows-missing-updates добавляет опциональное уведомление агента Windows
Update об ожидающих исправлениях безопасности.
Выходные данные
JSON с детерминированными (отсортированными) ключами и без отметки времени, чтобы отчёты давали чистый diff:
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 }(schemaVersion2).
Отчёт SARIF 2.1.0 (--sarif) также доступен для интерфейсов сканирования кода.
Экосистема OffSeq
| OffSeq | Аудит безопасности ЕС, мониторинг угроз, CISO-as-a-Service, соответствие NIS2 |
| Radar | Разведка угроз в реальном времени — каталог, с которым сопоставляет threat-finder |
| Radar Console | Подписки, пользовательские фиды и ваш OFFSEQ_API_KEY |
| Radar API | REST-документация для конечной точки /match, используемой здесь |
| Radar Threats | Поисковая база CVE / вредоносных программ / субъектов угроз |
| Radar Feeds | Пользовательские фиды, агрегирующие CISA, CIRCL, ThreatFox, … |
| Radar Pricing | От бесплатного тарифа до Enterprise |
| Breach | Мониторинг утечек данных в даркнете и скомпрометированных учётных данных |
| Veil | Клиентская PNG-стеганография (AES-256-GCM) |
| Guard | AI-аналитик безопасности и соответствия веб-сайтов |
| Training | Аккредитованные PECB курсы по безопасности и конфиденциальности |
Разработка
cargo build --release
cargo test # unit tests
cargo test -- --ignored # + macOS live-discovery smoke test
cargo clippy --all-targets
Движок — это библиотечный крейт (find_threats) с абстракцией Collector
(сейчас — запущенные сервисы и пакеты ОС; далее — lock-файлы / контейнеры /
SBOM), поэтому бинарник — это тонкий CLI поверх него.
Лицензия
Двойное лицензирование: MIT или Apache-2.0, на ваш выбор.