strace不判定非法,只记录系统调用事实;异常需结合进程身份、上下文和安全策略人工识别,应聚焦openat、write、sendto、execve、connect等高风险调用,配合-y、-f、-p及grep分析定位隐蔽恶意行为。

Strace本身不判定“非法”,只忠实记录系统调用事实;所谓异常,需结合进程身份、运行上下文和安全策略人工识别——比如一个仅应解析日志的程序却反复openat /etc/shadow,或非代理服务进程持续connect到已知C2域名对应的IP。
聚焦高风险系统调用,避免信息过载
全量跟踪会产生大量噪音,应优先捕获与权限、文件、网络、执行强相关的调用:
- 用 -e trace=openat,write,sendto,execve,connect 锁定核心行为面
- 加 -y 显示文件描述符对应的真实路径(如
write(3</tmp/.payload>, ...)),否则只能看到抽象fd编号 - 搭配 -f 跟踪fork/exec子进程,恶意载荷常藏身于子进程中
- 对运行中进程,先
pgrep -f "可疑关键词"获取PID,再strace -p PID -f -y -e trace=... -o trace.log
从返回值和调用模式中发现隐蔽异常
很多恶意行为不靠“调用了什么”,而靠“结果是否合理”或“节奏是否反常”:
-
openat(..., "/proc/self/fd", ...) = 3→ 常见于探测已打开的文件描述符,为重定向或窃取做准备 -
read(4, "", 1024) = 0频繁出现 → 可能轮询已关闭socket或空pipe,属隐蔽信道特征 -
stat("/tmp/.lock", ...) = -1 ENOENT后紧接openat(..., O_CREAT|O_EXCL)→ 抢锁行为,需检查文件内容是否含恶意互斥逻辑 -
connect(..., "192.168.1.200:443") = -1 EINPROGRESS后无poll/select直接write → 可能绕过连接状态校验
快速筛选可疑线索的实用命令组合
离线分析trace.log时,用以下grep模式直击关键信号:
- 查权限失败但本不该失败:
grep -E "(EACCES|EPERM|ENOTCONN)" trace.log - 查所有失败调用(排除高频时间类干扰):
grep " = -1 " trace.log | grep -v -E "(clock_gettime|gettimeofday|rt_sigreturn)" - 查敏感路径写入:
grep -E "(write|sendto).*<(/etc/|/root/|/proc/|/sys/)" trace.log - 查可疑执行行为:
grep "execve.*(/tmp/|/dev/shm/|\.so$|\.sh$)" trace.log
结合ltrace补充分析用户层行为
strace看内核交互,ltrace看库函数调用,二者互补:
- 用
ltrace -p PID -e "crypt@libc.so*,MD5@libcrypto.so*"检测未授权加密行为 - 监控
connect@libc.so*, send@libc.so*,比strace更早暴露网络意图(在系统调用前) - 加
-c统计耗时与频次:ltrace -c -p PID,若某函数调用次数远超正常值(如base64_encode达每秒数百次),即为异常信号 - 注意:ltrace无法跟踪静态链接程序或Go/Rust等不依赖glibc的二进制


















