udev 规则为什么能被用来持久化
udev 规则可以在设备事件(插拔、网络变化、模块加载)发生时以 root 权限执行 RUN 命令,不依赖 cron 也能反复触发,因此是 Linux 上比较隐蔽的持久化点。/etc/udev/rules.d 下的自定义规则优先级高于 /lib 与 /usr/lib 下的规则。
基本信息
| 规则目录 | /etc/udev/rules.d 优先,其次 /lib 与 /usr/lib/udev/rules.d |
|---|---|
| 执行点 | RUN+= 赋值,内联 shell 需自带引号 |
| 触发条件 | 匹配的设备事件发生时执行 |
| 生效方式 | udevadm control --reload-rules 后处理后续事件 |
| 其他执行键 | PROGRAM=、IMPORT{program} |
| 排查禁忌 | 不要用 udevadm trigger 试跑可疑规则 |
典型使用场景
- 排查「没有 cron、没有 systemd 单元却定期有命令执行」的持久化
- 清理攻击者留下的规则文件
- 加固巡检,建立规则文件基线
- 分析设备事件与异常进程启动之间的关联
- 与 init、cron、systemd 一起做完整持久化清点
- 处置后验证恶意规则不再触发
- 容器宿主机排查:容器相关设备事件容易被规则利用
检查规则中的执行键与文件时间
检查规则中的执行键与文件时间
grep -rnH 'RUN' /etc/udev/rules.d /lib/udev/rules.d /usr/lib/udev/rules.d 2>/dev/null | grep -v '#'
grep -rnH 'IMPORT{program}\|PROGRAM=' /etc/udev/rules.d 2>/dev/null | head # 其他可执行键
ls -la --time-style=long-iso /etc/udev/rules.d/ # 文件清单与时间
stat -c '%y %n' /etc/udev/rules.d/*.rules 2>/dev/null # 逐个看 mtime
rpm -qf /etc/udev/rules.d/60-xyz.rules 2>/dev/null || dpkg -S /etc/udev/rules.d/60-xyz.rules 2>/dev/null规则键读法
| 键 | 含义 | 排查价值 |
|---|---|---|
| RUN+= | 事件匹配时执行命令 | 最直接的执行点 |
| PROGRAM= | 执行程序并按返回码匹配 | 同样可执行外部程序 |
| IMPORT{program} | 执行程序并把输出导入属性 | 最容易被忽略的执行点 |
| ACTION / MATCH | 触发条件定义 | 判断哪些事件会触发规则 |
| ATTRS / KERNEL | 设备匹配条件 | 决定规则被触发的频率 |
规则文件常被命名得像系统自带(例如 60-something.rules):先看 mtime,再用包管理查询归属,归属不明的那几个才需要逐行读内容。
排查时不要执行 udevadm trigger 或对可疑规则做试跑:那会真实触发设备事件,可能让后门当场执行。
删除恶意规则后要执行 udevadm control --reload-rules:不重新加载的话,udev 仍按内存里的旧规则处理后续事件,看起来像是「删了没用」。