谛听(Diting)第七周。上周的结尾很难看:全量回归检出率 22.7%,根因是规则加载器把一个 CIS 定义文件当规则吃掉、引擎静默降级为空。这周第一件事就是还债。
还债:让"静默失效"从设计里绝种
上周的翻车值得再复盘一遍:一个 yaml 文件放错了目录,加载器解析失败,然后整个规则引擎安静地变成空的------不报错、不退出。性能测试全绿、单测全过,因为它们都不走这条路径。
这周的修复不是补一个 bug,是立一套规矩,四个动作:
- fail-fast:坏文件拒绝启动,报错带文件名和原因,exit=1。加载失败从"悄悄降级"变成"响亮地死"。
- inode 自动登记:DSL 里的文件规则现在自动把目标文件的 inode 登记进内核监控表,不再需要先跑一遍基线快照才生效。以前"规则写了但没监控上"是可能的,现在不可能了。
- 加载期兜底警告:路径不存在、非绝对路径、含通配符------三类问题各有明确的 warn,告诉你哪条规则在什么情况下会降级。
- 单实例锁:flock 保证同一台机器只有一个探针实例在跑,双开直接被拒并告诉你持锁的 pid。
修完的回归:检出率从 27.3% 回到 97.7% (43/44)。
规则包第三批:挖矿与防御规避
规则包从 19 条扩到 27 条,新增两组:
- 挖矿类:连接已知矿池端口(stratum 的 3333/5555/7777)、矿池域名解析、挖矿二进制名执行(xmrig/kdevtmpfsi 这类老熟人)、/dev/shm 无扩展名执行。目前单事件可判定,三因子关联(进程特征+网络+算力占用)的设计文档已写好,排在 v2。
- 防御规避类:清安全日志(auth.log/wtmp)、停 auditd/rsyslog、chattr +i 锁文件、kill 安全工具进程。这一组是"攻击者反侦查"的针对性覆盖。
写防御规避规则时踩出了三个真 bug,都是攻击用例逼出来的:pid1 的祖先链豁免逻辑会静默吞掉告警、pkill 杀符号链接进程时匹配不上、rsyslog 的线程 comm 名和主进程不一样。这三个问题靠读代码很难发现,用例库替我发现的------自动化测试是单人项目的测试团队,这话我写在计划里,这周再次被验证。
最终:30 个用例连跑两轮,60/60,检出率 100% 。误报方面记录了 1 条、收紧了 2 条 condition。
Syslog 通道与意外的 RSS
周四加了 Syslog 外发通道(RFC 5424,UDP 514 或本地 /dev/log,severity 映射 syslog level),和 webhook 双通道并存、各自独立路由。这是对接客户 SOC/SIEM 的接口,大客户刚需。
RSS 瘦身专项变成了"复核"------周一修复完一量,内存自己降下来了:W5 基线 139.3MB,现在常态 124.6MB。5 分钟压测峰值 141.6MB、CPU 0.81%,窗口内蠕变 +0.86MB,无泄漏特征。有些性能问题不是优化出来的,是 bug 修好之后自己消失的。
数据
- 规则包:19 → 27 条 ;攻击用例:22 → 30 个,回归 60/60(100%)
- CIS 40 项:规则大改后零回归
- 单测 110 项全过;30 秒冒烟 30 万事件全入库,bus.hi 四路全 0
- RSS 141.6MB / CPU 0.81%(红线 150MB / 3%)
- 检出率:27.3%(修复前)→ 97.7%(修复后)→ 100%(本周全量)
下周
W8 转向交付面:等保报告打磨、欠账清零、集成测试预演。v1.0 的范围对焦这周做了复核,缺口清单已出,离定稿不远了。
------ 谛听开源在 GitHub(Apache 2.0),每周一篇开发日志。一个人写内核安全工具,慢,但不停。