mohidev-tech/runtime-detect
GitHub: mohidev-tech/runtime-detect
一个云原生的运行时检测项目,利用 Falco eBPF、Loki 和 Go 编写的 hunt CLI,通过预定义的攻击模拟和验证脚本确保检测规则有效触发并落入日志。
Stars: 0 | Forks: 0
# 🛰️ runtime-detect
[](LICENSE)
[](https://falco.org/)
[](https://grafana.com/oss/loki/)
[](https://attack.mitre.org/)
## 它的作用(真实的终端输出)
```
$ ./scripts/attack-sim.sh
==> [1] spawn shell in app container (HUNT-001)
==> [2] write to /var/run/secrets/kubernetes.io (HUNT-002)
==> [3] read /etc/shadow (HUNT-003)
==> [4] DNS lookup of evil.attacker.invalid (HUNT-004)
==> [5] mount inside container (HUNT-005)
==> Wait ~10s for events to flow through Falco -> sidekick -> Loki ...
==> Done.
$ ./scripts/verify-detect.sh
hunts run over [2026-05-23T20:14:32Z, 2026-05-23T20:24:32Z]
FIRED HUNT-001 Shell spawned in any app container (hits=3)
first: 2026-05-23T20:23:08Z last: 2026-05-23T20:23:09Z
> {"output":"Shell opened in app container ...","priority":"Critical","rule":"Shell spawned in app container","time":"..."}
FIRED HUNT-003 Sensitive file read (/etc/shadow, /etc/sudoers) (hits=1)
first: 2026-05-23T20:23:11Z last: 2026-05-23T20:23:11Z
> {"output":"Sensitive file read in container ...","priority":"Critical","rule":"Sensitive file read inside container", ...}
FIRED HUNT-004 Outbound traffic to known-bad destination (hits=1)
FIRED HUNT-005 Mount syscall inside container (escape precursor) (hits=1)
clean HUNT-002 Write to K8s secrets/config paths
clean HUNT-006 Burst of warnings from one pod
summary: 4/6 hunts fired
```
当 **攻击成功触发了正确的规则** 且 **verify-detect 能证明每次触发都落入了 Loki** 时,这个实验环境就算“正常工作”。
## 检测即代码的理念
Falco 将事件发送到标记为 `app=falco` 的 Loki。`hunt` CLI 运行一组固定的 LogQL 查询(每个 hunt 一个),并报告哪些匹配成功。每个 hunt 就是一个单独的 Go 结构体——清晰、可审查、可版本控制。
```
{
ID: "HUNT-001",
Title: "Shell spawned in any app container",
LogQL: `{app="falco", priority="Critical"} |= "Shell opened in app container"`,
Tags: []string{"mitre_execution", "T1059"},
}
```
添加一个新的 hunt 只需一条记录。CI 按计划运行 hunts;同一个二进制文件也可用于笔记本电脑上的临时威胁狩猎。
## 为什么你需要这个
| | **runtime-detect** | Falco + stdout | Sysdig Secure | Datadog Cloud SIEM |
|---|---|---|---|---|
| **价格** | 免费(Apache 2.0) | 免费 | $$$ 企业版 | $$$ 每台主机 |
| **包含自定义规则** | ✅ 5 条 K8s 调优规则 | ⚠️ 仅默认规则集 | ✅ | ⚠️ 高级版 |
| **事件路由** | ✅ falcosidekick → Loki | ❌ 仅 stdout | ✅ 专有 | ✅ 专有 |
| **Hunt-as-code CLI** | ✅ 内置 6 个 hunt | ❌ | ⚠️ UI 驱动 | ⚠️ UI 驱动 |
| **验证脚本** | ✅ attack-sim + verify-detect | ❌ | ❌ | ❌ |
| **规则上的 MITRE ATT&CK 标签** | ✅ 内联 | ✅ | ✅ | ✅ |
| **Grafana 仪表板 JSON** | ✅ 仓库内 | ❌ | 不适用 | 不适用 |
| **自托管** | ✅ | ✅ | ❌ 仅 SaaS | ❌ 仅 SaaS |
不与 Sysdig/Datadog 竞争——它们在规模化和机器学习增强方面胜出。但对于“一个希望获得真实运行时检测而又不想支付五位数年费的团队”来说,这个技术栈恰到好处。
## 快速开始
### 前置条件
- 一个正在运行的 Kubernetes 集群(kind、EKS 或任何支持 DaemonSet + eBPF 的集群)。对于 kind,内核版本 ≥ 5.8。
- `kubectl`、`helm`、`go 1.22+`。
### 安装技术栈(约 5 分钟)
```
git clone https://github.com/mohidev-tech/runtime-detect
cd runtime-detect
./scripts/bootstrap.sh # Loki + Falcosidekick + Falco + Grafana dashboard
```
### 触发规则并验证
```
./scripts/attack-sim.sh # exec into a pod and do bad-but-harmless things
./scripts/verify-detect.sh # exits 0 only when every expected hunt fired
```
### 临时运行 hunt
```
cd tools/hunt
go run ./cmd/hunt list # show every hunt
go run ./cmd/hunt run --since 1h # run all over last hour
go run ./cmd/hunt run --id HUNT-003 # run one
go run ./cmd/hunt run --format json > out.json
```
### 打开 Grafana
```
kubectl -n monitoring port-forward svc/kps-grafana 3000:80
# admin / admin → "runtime-detect — Falco events" 仪表板
```
## 仓库布局
```
deploy/
falco/
values.yaml Helm values: eBPF driver, JSON output, http→sidekick
custom-rules.yaml Our 5 hand-picked K8s rules (MITRE-tagged)
falcosidekick.yaml Event router: → Loki always, → Slack on critical
loki/values.yaml Single-binary Loki, filesystem storage
grafana/dashboards/
runtime-events.json 4 stat panels + timeseries + top rules + log feed
tools/hunt/ Go CLI; queries Loki using detection-as-code definitions
cmd/hunt/main.go list / run subcommands
internal/loki/client.go Minimal Loki HTTP client (no external deps)
internal/hunts/hunts.go 6 hunts as Go structs — add a hunt = one PR
scripts/
bootstrap.sh Install everything in order
attack-sim.sh Trip every custom rule (negative test for the pipeline)
verify-detect.sh Assert every trip landed in Loki within 10 min
docs/adr/ architecture decision records
```
## 五条 Falco 规则
| 规则 | 触发条件 | MITRE |
|---|---|---|
| **在应用容器中生成 shell** | 在 `app`/`default` 命名空间的容器内启动 `sh`/`bash`/`ash`/`fish` 进程 | T1059(执行)|
| **写入 K8s 服务账户目录** | 对 `/var/run/secrets/kubernetes.io` 或 `/etc/kubernetes` 进行写打开操作 | T1098(账户操作)|
| **在容器内读取敏感文件** | 对 `/etc/shadow` 或 `/etc/sudoers` 进行读打开操作 | T1003(操作系统凭据转储)|
| **出站 DNS 连接到可疑域名** | 容器解析/连接 `suspicious_domains` IOC 列表中的任何域名 | TA0011(命令与控制)|
| **在容器内执行挂载** | 容器内执行 `mount` 系统调用(逃逸前兆) | T1611(逃逸到宿主机)|
自定义规则 **与 Falco 上游规则集一起加载**——我们不会替换它。上游捕获通用模式;我们的规则则增加 K8s 特定的信号。
## 设计选择
| 选择 | 原因 |
|---|---|
| **Falco eBPF 驱动,而非内核模块** | eBPF 无需安装特权内核模块。适用于大多数现代发行版(内核 ≥ 5.8)。部署摩擦更小。 |
| **Falcosidekick 作为路由器,而非原始 HTTP 输出** | Sidekick 内置了向约 50 个后端(Loki、Slack、S3 等)的分发能力。未来添加 SIEM 只需修改 values.yaml,无需更改代码。 |
| **Loki,而非 Elasticsearch** | Loki 的“索引标签而非内容”模型与 Falco 的结构化 JSON 输出高度匹配。规模化成本更低,运维更简单,原生集成 Grafana。 |
| **以 Go 代码编写 hunt,而非 YAML** | 一个 hunt 包括一条查询、一个阈值和标签。代码比 YAML 更容易审查“有人在添加 hunt 时改变了什么”。Go 文件本身就是事实来源。 |
| **attack-sim 和 verify-detect 成对出现** | “Falco 已安装”不等于“Falco 正在检测”。保持流水线诚实性的唯一方法是主动触发它并确认事件确实到达。 |
## 限制——已记录,不隐藏
- **IOC 列表是精选的,而非威胁情报驱动。** `custom-rules.yaml` 中的 `suspicious_domains` 列表仅包含三个占位符。在生产部署中,请接入 `falco-plugins-http` 插件或将威胁情报预处理为 ConfigMap。
- **无告警关联。** 每个 hunt 是独立的。真正的 SOC会将同一 Pod 在 5 分钟内触发的“生成 shell”和“读取敏感文件”关联为单个事件。这应归属于独立的关联层(例如 Falco 的 reaction-engine 或下游 SIEM)。
- **Loki 是单二进制、单副本的。** 在实验环境中没问题;生产环境中应部署可扩展的读/写/后端分离架构并搭配对象存储。
- **`attack-sim` 要求目标 Pod 具有可用的 shell(`alpine`)。** 重点是触发规则;无发行版的应用 Pod 无法生成 shell,因此不适合作为测试目标。
## 如何融入整体体系
| 层 | 仓库 | 职责 |
|---|---|---|
| **构建** | [secure-supply-chain](https://github.com/mohidev-tech/secure-supply-chain) | 签名 + SBOM 证明镜像 |
| **准入** | [devsecops-platform](https://github.com/mohidev-tech/devsecops-platform) + [zero-trust-k8s](https://github.com/mohidev-tech/zero-trust-k8s) | 拒绝准入未签名/不安全的 Pod |
| **运行时** | **runtime-detect** *(本仓库)* | 捕获已逃脱准入检查的威胁 |
| **IaC 扫描** | [cspm-scanner](https://github.com/mohidev-tech/cspm-scanner) | 从一开始就捕获可能导致集群配置错误的 IaC 问题 |
这是 **运行时层**——当构建时、准入时和 IaC 时检查都放过了某些内容时,由它主动捕获。
## 贡献
欢迎提交 PR。参见 [CONTRIBUTING.md](CONTRIBUTING.md)。安全问题请查阅 [SECURITY.md](SECURITY.md)。
## 许可证
Apache 2.0 —— 参见 [LICENSE](LICENSE) 和 [NOTICE](NOTICE)。
标签:AMSI绕过, Chrome Headless, Docker镜像, EVTX分析, Falco, Go开发, Grafana, Kubernetes安全, LogQL, Loki, Web截图, 云原生工具, 告警规则, 威胁检测, 子域名突变, 容器安全, 攻击模拟, 敏感词过滤, 日志审计, 运行时检测, 驱动签名利用, 验证检测