riverrisk/marlinspike-malware

GitHub: riverrisk/marlinspike-malware

基于 Rust 的高性能网络 IOC 检测引擎,通过 YAML 规则包对网络遥测数据进行恶意软件和威胁指标匹配,支持完全离线运行并覆盖 ICS/OT 专用威胁。

Stars: 0 | Forks: 0

# marlinspike-malware 用于 MarlinSpike 套件中进行恶意软件和 IOC 检测的共享 Rust crate。 `marlinspike-malware` 是 [MarlinSpike](https://github.com/riverrisk/marlinspike) repo 家族中的 Rust 引擎之一,与 `marlinspike-dpi` 并存。它加载 YAML 规则包,根据这些规则评估通用的观测事件,并输出结构化的发现结果。该引擎有意设计为产品中立,以便 MarlinSpike 和 Fathom 都能将其自身的遥测数据适配到同一规则层面。 运行时操作完全在本地进行。设备在物理隔离(air-gapped)环境下仍能保持功能。公共订阅源(ThreatFox、URLhaus、MalwareBazaar)可以通过兄弟 [marlinspike-malware-rules](https://github.com/riverrisk/marlinspike-malware-rules) 仓库离线规范化为 YAML schema。 ## 架构 ``` marlinspike-dpi | Bronze events | marlinspike-malware / \ YAML rule packs ObservedEvent stream \ / MalwareFinding[] | MarlinSpike report (analysis block) ``` #### 扫描流程 ``` marlinspike-malware scan --rules-dir → load + compile YAML packs --events → ObservedEvent[] JSON (from _ms_engine.py) --output → MalwareFinding[] JSON (back to _ms_engine.py) ``` 该引擎位于 MarlinSpike 管道中,介于 DPI 事件发出和报告组装之间。它消费 Bronze 风格的观测事件(DNS 查询、HTTP 主机/URI、TLS SNI、工件哈希、IP 地址、协议元数据),并根据编译后的规则包对其进行评估,以生成 `MalwareFinding` 记录。 ### 集成契约 本引擎遵循为 MarlinSpike 套件定义的 [可扩展性契约](https://github.com/riverrisk/marlinspike/blob/main/docs/extensibility-contracts.md): | 层面 | 角色 | |---------|------| | **Rust engine** | 面向数据包/事件,高吞吐量 IOC 匹配 | | **YAML rule packs** | 声明式 IOC 和签名内容 | | **Python plugin** | 面向报告的富化(由其他模块处理) | 引擎接受一个规则目录,将其编译成规范化的包,并处理成批的 `ObservedEvent` 结构体。它不负责拓扑评分、ATT&CK 映射或 UI 行为。 ### Bronze 消费者契约 `marlinspike-malware` 消费与核心 MarlinSpike 引擎相同的 Bronze 事件层。它可以评估来自以下来源的事件: - `protocol_transaction` — 带有提取出的观测数据的网络会话 - `extracted_artifact` — 文件哈希、二进制签名、工件密钥 - `asset_observation` — 主机级指标 完整的消费者规则请参见 [bronze-consumer-contract.md](https://github.com/riverrisk/marlinspike/blob/main/docs/bronze-consumer-contract.md)。 ## 规则引擎 ### 可观测字段 规则与从 Bronze 事件中提取的以下可观测字段进行匹配: | 字段 | 描述 | 示例 | |-------|-------------|---------| | `dns_query` | DNS 查询域名 | `evil.example.com` | | `dns_answer` | DNS 响应数据 | `185.215.113.x` | | `http_host` | HTTP Host 头 | `c2.badactor.invalid` | | `http_uri` | HTTP 请求 URI | `/api/v1/beacon` | | `tls_sni` | TLS 服务器名称指示 | `update.malware.invalid` | | `artifact_sha256` | 提取工件的 SHA-256 哈希 | `a1b2c3d4...` | | `artifact_key` | 命名工件标识符(互斥体、注册表键、文件路径) | `HKLM\Software\Malware` | | `src_ip` | 源 IP 地址 | `10.0.0.50` | | `dst_ip` | 目的 IP 地址 | `45.33.32.156` | | `src_mac` | 源 MAC 地址 | `aa:bb:cc:dd:ee:ff` | | `dst_mac` | 目的 MAC 地址 | `ff:ee:dd:cc:bb:aa` | | `hostname` | 设备主机名 | `ENG-WS-014` | | `protocol` | 协议标识符 | `modbus`, `s7comm` | | `any_text` | 匹配所有文本字段 | 协议工件的兜底匹配 | ### 匹配运算符 | 运算符 | 行为 | |----------|----------| | `equals` | 精确字符串匹配(默认) | | `contains` | 子字符串匹配 | | `prefix` | 字符串以值开头 | | `suffix` | 字符串以值结尾 | 所有运算符均支持 `case_sensitive: true/false`(默认值:false)。 ### 匹配模式 | 模式 | 行为 | |------|----------| | `any` | 如果**任一**条件匹配则触发(默认,OR 逻辑) | | `all` | 仅当**所有**条件匹配时才触发(AND 逻辑) | ### 发现严重级别 `info` | `low` | `medium` | `high` | `critical` ### 发现输出 Schema `scan` 命令发出的每个 `MalwareFinding` 包含以下字段: | 字段 | 类型 | 描述 | |-------|------|-------------| | `finding_id` | string | 此发现结果的唯一标识符 | | `rule_id` | string | 匹配规则的 ID | | `rule_name` | string | 人类可读的规则名称 | | `family` | string | 恶意软件家族(如 `cobaltstrike`, `emotet`) | | `severity` | string | `info` \| `low` \| `medium` \| `high` \| `critical` | | `confidence` | float | 置信度分数 (0.0–1.0) | | `summary` | string | 匹配结果的人类可读描述 | | `observable_field` | string | 匹配到的字段(如 `dns_query`, `tls_sni`) | | `observable_value` | string | 触发匹配的值 | | `event_id` | string | 源事件 ID | | `capture_id` | string | 捕获会话 ID | | `timestamp` | string | 事件的 ISO 8601 UTC 时间戳 | | `src_ip` | string? | 源 IP 地址(若存在) | | `dst_ip` | string? | 目的 IP 地址(若存在) | | `src_mac` | string? | 源 MAC 地址(若存在) | | `dst_mac` | string? | 目的 MAC 地址(若存在) | | `references` | string[] | 指向公告、ATT&CK 技术等的 URL | | `tags` | string[] | 分类标签(如 `apt`, `c2`, `dns`) | | `source_feed` | string? | 归因订阅源名称(若适用) | | `metadata` | object | 来自规则或事件的任意键值元数据 | ## 规则包 Schema ``` version: v1 name: "Pack Name" source: name: "attribution source" url: "https://..." license: "Apache-2.0" description: "Source description" rules: - id: unique-rule-id name: "Human-readable rule name" family: "malware-family" severity: critical confidence: 0.90 description: "What this rule detects and why" tags: [apt, c2, dns] references: - "https://attack.mitre.org/techniques/T1071/" - "https://www.cisa.gov/..." match_mode: any conditions: - field: dns_query op: suffix value: ".malware.invalid" case_sensitive: false - field: tls_sni op: contains value: "beacon" ``` ## 内置规则包 `rules/` 目录附带了 29 个精选包,涵盖完整威胁 landscapes 的 919 条检测规则。 ### 威胁覆盖 | 包 | 规则数 | 覆盖范围 | |------|-------|----------| | **Malware Loaders** | 24 | BazarLoader, Emotet, QakBot, IcedID, Bumblebee, SocGholish, Gootloader, Raspberry Robin, Pikabot, GuLoader | | **C2 Frameworks** | 18 | Cobalt Strike, Metasploit, Sliver, Havoc, Brute Ratel, Mythic, PoshC2, Covenant, Empire, Nighthawk | | **RATs** | 32 | AsyncRAT, DarkComet, njRAT, Remcos, QuasarRAT, Agent Tesla, NanoCore, Warzone, DcRAT, XWorm, NetWire, Gh0st RAT | | **Ransomware** | 34 | LockBit, BlackCat/ALPHV, Royal/BlackSuit, Cl0p, Black Basta, Akira, Play, Rhysida, Medusa, BianLian, Hive, Conti | | **Infostealers** | 24 | RedLine, Raccoon, Vidar, LummaC2, Rhadamanthys, StealC, META, Aurora, Mystic, Titan, FormBook/XLoader | | **ICS/OT Threats** | 32 | TRITON, Industroyer 1+2, PIPEDREAM, BlackEnergy, Havex, Stuxnet-derived, FrostyGoop, CosmicEnergy, IRONGATE | | **Suspicious Patterns** | 38 | DNS tunneling, DGA, dynamic DNS abuse, encoded payloads, cryptomining, Tor, phishing lookalikes, exfiltration | | **APT Tooling** | 40 | APT28, APT29, APT41, Lazarus, Turla, Kimsuky, Sandworm, MuddyWater (SUNBURST, ShadowPad, PlugX, Snake, etc.) | | **Wipers** | 27 | WhisperGate, HermeticWiper, CaddyWiper, AcidRain, Shamoon, ZeroCleare, Dustman, Meteor, Agrius | | **Botnets** | 31 | Mirai variants, TrickBot, Dridex, ZLoader, Qakbot, Androxgh0st, Volt Typhoon, Emotet, Phorpiex, Amadey | | **Webshells** | 36 | China Chopper, Godzilla, Behinder, AntSword, ASPXSpy, HAFNIUM/ProxyShell drops, IIS backdoors, generic patterns | | **Backdoors & Implants** | 31 | ShadowPad, PlugX, MATA, Daxin, BPFDoor, Symbiote, BlackLotus, CosmicStrand, Derusbi, GoldMax | | **Exploit Delivery** | 35 | Log4Shell, ProxyShell/Logon/NotShell, MOVEit, Confluence, Citrix Bleed, FortiGate, Ivanti, Spring4Shell, exploit kits | | **Proxy & Tunneling** | 31 | Chisel, frp, ngrok, Cloudflare Tunnel, reGeorg, Ligolo, Plink, GOST, residential proxies, Shadowsocks | | **Credential Theft** | 30 | Mimikatz, LSASS dumps, Kerberoasting, Rubeus, Impacket, Responder, BloodHound, Evilginx, CrackMapExec | | **Data Exfiltration** | 31 | Cloud storage, Rclone, DNS exfil, ICMP tunneling, Telegram/Discord/Slack webhooks, paste sites, file hosting | | **Mobile & Spyware** | 34 | Pegasus, Predator, FinFisher, Hermit, Candiru, stalkerware, FluBot, SharkBot, Xenomorph, Cerberus, TeaBot | | **Cryptocurrency Threats** | 33 | Wallet drainers, clipbankers, fake exchanges, cryptojacking, DPRK crypto theft, mixers, fake wallet apps | | **Lateral Movement** | 34 | PsExec, WMI, WinRM, DCOM, RDP tunneling, EternalBlue, PrintNightmare, SCShell, CobaltStrike lateral | | **Supply Chain** | 37 | 3CX, SolarWinds, Kaseya, Codecov, Polyfill.io, npm/PyPI typosquatting, dependency confusion, CDN compromise | | **Recon & Scanning** | 41 | Nmap, Masscan, Nuclei, Shodan, ADFind, BloodHound, Gobuster, SQLMap, WPScan, cloud enumeration | | **Defense Evasion** | 41 | Certutil, mshta, bitsadmin, AMSI bypass, ETW patching, LOLBins, PowerShell cradles, reflective injection | | **Phishing-as-a-Service** | 39 | Tycoon 2FA, EvilProxy, Greatness, W3LL Panel, Rockstar 2FA, FlowerStorm, OAuth phishing, quishing | | **Cloud & SaaS Threats** | 35 | TeamTNT, Kinsing, Denonia, SCARLETEEL, SCATTERED SPIDER, container escapes, K8s exploitation, cloud C2 | | **DNS Abuse** | 35 | DoH C2, DNS rebinding, subdomain takeover, IDN homograph, sinkholes, malicious nameservers, fast-flux | | **Email Threats** | 35 | BEC infrastructure, malspam, HTML smuggling, callback phishing, OneNote/ISO abuse, OAuth consent phishing | | **IoT Threats** | 34 | Camera/router exploitation, Moobot, Fodcha, RapperBot, Zerobot, AVrecon, UPnP/SSDP/MQTT/CWMP abuse | | **Ransomware Ecosystem** | 35 | IAB marketplaces, OFAC-sanctioned exchanges, SystemBC, affiliate tools, loader handoffs, payment infra | | **Adware & PUPs** | 32 | Fireball, DealPly, Conduit, Superfish, BADBOX, tech support scams, SocGholish distribution, click fraud | ### 严重级别分布 | 严重级别 | 规则数 | |----------|-------| | Critical | ~380 | | High | ~380 | | Medium | ~110 | Low | ~30 | | Info | ~19 | | **Total** | **919** | ### IOC 来源 所有规则均源自公开的威胁情报: - **政府公告**:CISA, NSA, FBI, NCSC-UK, CERT-UA - **MITRE**:ATT&CK Enterprise + ICS 框架 - **供应商研究**:Mandiant, CrowdStrike, ESET, Kaspersky, Unit 42, SentinelOne, Sophos, ThreatFabric, Cleafy - **民间社会**:Amnesty International, Citizen Lab - **社区**:MalwareBazaar, abuse.ch, stalkerware-indicators - **标准机构**:OFAC 制裁指定 ## CLI 该 crate 包含一个用于规则包验证和编译的 CLI: ``` # 验证所有 rule packs cargo run -- validate --rules-dir rules/ # 使用 JSON output 进行验证 cargo run -- validate --rules-dir rules/ --json # 编译为 normalized JSON bundle cargo run -- compile --rules-dir rules/ --output build/bundle.json --pretty # 根据 rules 扫描 observed events cargo run -- scan --rules-dir rules/ --events events.json --output findings.json ``` `scan` 子命令读取一个 `ObservedEvent[]` JSON 数组,根据所有加载的规则评估每个事件,并将生成的 `MalwareFinding[]` JSON 写入输出路径。 验证检查: - 包和规则字段的完整性 - 置信度范围 (0.0-1.0) - 每条规则至少有一个条件 - 所有包中没有重复的规则 ID - 有效的字段名和运算符 ## MarlinSpike 集成 该引擎在分析管道的 **Stage 4b** 期间由 MarlinSpike 的 Python 引擎(`_ms_engine.py`)作为子进程调用。 ### 二进制文件自动发现 MarlinSpike 按顺序检查以下位置来定位 `marlinspike-malware` 二进制文件: 1. `MARLINSPIKE_MALWARE_BIN` 环境变量 2. `PATH` 3. `~/marlinspike-malware/target/release/` 4. `~/marlinspike-malware/target/debug/` ### 规则自动发现 规则包按顺序检查以下位置来定位: 1. `MARLINSPIKE_MALWARE_RULES` 环境变量 2. `~/marlinspike-malware/rules/` 3. `~/marlinspike-malware-rules/packs/` ### 事件转换 `_ms_engine.py` 在将 MarlinSpike 会话对象传递给引擎之前,会将其转换为 `ObservedEvent` JSON。提取以下观测数据: - DNS 查询和应答 - IP 地址(源和目的) - MAC 地址 - 协议标识符 - Bronze 透传属性(HTTP 主机/URI、TLS SNI、工件哈希等) ### 发现结果转换 引擎的 `MalwareFinding[]` 输出被转换回 MarlinSpike 报告结构: - 类型为 `MALWARE_IOC_MATCH` 的 **`c2_indicators`** - 附加到分析报告的 **`risk_findings`** ### 可选阶段 Stage 4b 是可选的。如果找不到二进制文件或规则目录,分析将继续进行,但不进行恶意软件匹配。当向 MarlinSpike 传递 `--fast` 参数时,恶意软件匹配将被完全跳过。 ## Library API ``` use marlinspike_malware::{MalwareEngine, ObservedEvent, ObservedValue, MatchField}; // Load rules from a directory let engine = MalwareEngine::from_rule_dir("rules/")?; println!("Loaded {} rules", engine.rule_count()); // Process observed events let findings = engine.process_observed_batch("bronze-dpi", &events); for finding in &findings { println!( "[{}] {} — {} (confidence: {:.0}%)", finding.severity.as_str(), finding.rule_name, finding.summary, finding.confidence * 100.0, ); } ``` ### 关键类型 | 类型 | 描述 | |------|-------------| | `MalwareEngine` | 编译后的规则集,处理事件批次 | | `ObservedEvent` | 带有元数据和观测数据的单个网络事件 | | `ObservedValue` | 事件中的一个可观测字段+值对 | | `MalwareFinding` | 带有规则元数据、严重级别、证据的检测结果 | | `RulePack` | 反序列化的 YAML 规则包 | | `CompiledRuleBundle` | 可序列化的编译包(用于 JSON 导出) | ## 兄弟仓库 | Repo | 用途 | |------|---------| | [marlinspike](https://github.com/riverrisk/marlinspike) | 套件 repo — 引擎、工作台、插件 | | [marlinspike-dpi](https://github.com/riverrisk/marlinspike-dpi) | Rust DPI 引擎 — 数据包解析、Bronze 事件发出 | | [marlinspike-malware-rules](https://github.com/riverrisk/marlinspike-malware-rules) | 发布的规则内容 — 手动包 + 公共订阅源导入 | | [marlinspike-mitre](https://github.com/riverrisk/marlinspike-mitre) | Python 插件 — 基于报告结果的 ATT&CK 映射 | ### 与 marlinspike-malware-rules 的关系 本仓库(`marlinspike-malware`)是**引擎**。兄弟仓库 `marlinspike-malware-rules` 是**发布的内容**: ``` marlinspike-malware marlinspike-malware-rules ├── src/ ├── packs/ │ ├── engine.rs │ ├── manual/ ← curated rules │ ├── rules.rs │ └── public/ ← ThreatFox, URLhaus, MalwareBazaar │ ├── finding.rs ├── manifests/ │ └── observed.rs │ └── index.yaml ├── rules/ └── scripts/ │ └── (dev/bundled rules) ├── build_index.py └── Cargo.toml └── update_public_feeds.py ``` 本仓库中的 `rules/` 目录附带了用于开发和独立使用的内置检测内容。对于生产部署,规则内容在 `marlinspike-malware-rules` 中管理,并通过 CLI 编译成包。 ## 开发 ``` # 构建 cargo build # 测试 cargo test # 验证 bundled rules cargo run -- validate --rules-dir rules/ # 编译 production bundle cargo run -- compile --rules-dir rules/ --output build/marlinspike-malware-bundle.json --pretty ``` ### 添加规则 1. 在 `rules/` 下选择合适的包(或创建新目录) 2. 按照上述 YAML schema 添加规则 3. 运行 `cargo run -- validate --rules-dir rules/` 检查错误 4. 确保规则 ID 在所有包中全局唯一 ### 规则 ID 约定 规则 ID 遵循模式 `{category}-{family}-{description}`: ``` c2-cobaltstrike-default-beacon-uri rat-asyncrat-default-mutex ics-triton-triconex-udp loader-emotet-epoch4-c2 ransomware-lockbit-leak-site ``` ## 许可证 `marlinspike-malware` 仅根据 GNU Affero General Public License v3.0 进行许可。参见 [LICENSE](LICENSE)。
标签:AWS, DPI, Fathom, Homebrew安装, HTTP/HTTPS抓包, IOC检测, MalwareBazaar, MarlinSpike, Rust, TCP/UDP协议, ThreatFox, URLhaus, YAML规则, 云计算, 可视化界面, 威胁情报, 安全工具开发, 开发者工具, 态势感知, 文档结构分析, 离线检测, 网络安全, 网络流量审计, 自动化分析, 规则引擎, 跨站脚本, 逆向工具, 通知系统, 隐私保护