只跟踪 open、openat、openat2 和 stat 类调用才能可靠捕获非法文件读取意图,因程序读取前必先探测存在性或尝试打开;漏掉 openat2 或不加 -f 会错过容器/sandbox 绕过行为及子进程访问。

只跟踪 open、openat、openat2 和 stat 类调用,才能可靠捕获非法文件读取意图;漏掉 openat2 或不加 -f,大概率会错过关键行为。
为什么只盯 open 和 stat 就够了
程序读文件前,几乎总会先尝试打开或检查存在性——open 是最直接的入口,openat 支持相对路径(比如 /proc/self/fd/3 或 chroot 内路径),openat2 是 5.6+ 内核新增的更灵活接口,常被容器或 sandbox 环境下的载荷用于绕过旧式监控;而 stat 和 fstatat 是典型的“探路”行为,比如先 stat("/etc/shadow") 判断是否存在,再决定是否真正读取。只加 -e trace=open 会漏掉后两者,等于关掉一半监控窗口。
-
openat2在 strace 5.14+ 才默认识别,老版本需确认是否支持,否则会跳过该系统调用 -
stat调用失败(如= -1 ENOENT)本身不危险,但若紧跟着openat(..., O_RDONLY),就构成完整探测链 - 不加
-y时,openat(AT_FDCWD, "/tmp/.lock", ...)这类路径能看清,但后续read(3, ...)里的 fd=3 对应哪个文件,你得自己反查——容易误判
怎么过滤出真正可疑的路径
不是所有 open 都非法,重点看路径是否超出进程合理权限边界。以下几类必须人工核验:
-
/etc/shadow、/root/.ssh/id_rsa、/proc/*/mem:普通用户进程无权访问,出现即高危 -
/proc/self/environ、/proc/self/cmdline:容器中可能泄露父进程环境,尤其当进程 UID 不是 root 却在读这些 -
/sys/kernel/security/下任意文件:SELinux/AppArmor 策略相关,非安全模块不应直读 - 路径含
.env、secrets.yaml、config.json且位于/tmp、/home/otheruser等非应用部署目录
注意:systemd 服务读 /etc/systemd/system.conf 是合法的,要结合 UID、cgroup、是否在容器内等上下文交叉判断,不能单靠路径字面匹配。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
如何避免被噪音淹没
strace 默认输出极多,尤其是 Python import 或日志轮转这类批量试探路径的行为。直接扫屏基本无效,得靠组合过滤:
- 启动时加
-s 256,防止长路径(如容器挂载路径)被截成/var/lib/kubelet/pods/ab... (truncated) - 用
strace -e trace=open,openat,openat2,stat,fstatat -f -y -o trace.log ./app捕获全量,再离线 grep:grep -E "/etc/shadow|/root/\.ssh|/proc/[0-9]+/environ" trace.log - 对失败调用快速筛:
grep -E "(open|openat|stat).*EACCES|EPERM" trace.log,比如被拒读/etc/shadow比成功读更早暴露意图 - 加
-tt打微秒时间戳,配合timeout 3s控制捕获窗口,防止短命进程一闪而过
动态追踪运行中进程的关键参数
应急响应时,往往要 attach 到已运行的可疑进程,这时 -f 和 -y 是刚需,缺一不可:
- 不加
-f:fork 出的子进程(比如 shell 脚本调用的curl或python -c)完全不出现在 trace 中 - 不加
-y:看到write(3, "data", 4)却不知道 fd 3 是/dev/null还是/tmp/.steal,无法定位写入目标 - 真实案例中,恶意进程常先
openat(AT_FDCWD, "/proc/self/fd", O_RDONLY)探测继承的 fd,再通过readlink(/proc/self/fd/3)(这个不在 file trace 里,需额外加readlink)还原原始路径——所以别只盯着 open 类
最易被忽略的是:某些程序(如 Go 的 os.Open)会自动 fallback 多个路径,openat(..., "/etc/config.json") = -1 ENOENT 后立刻试 "/usr/local/etc/config.json",这种不算异常;但若在 /tmp 和 /root 之间反复试探,就得拉响警报。










