strace只记录系统调用事实,不判断“非法”;所谓非法需结合上下文由人判定,如不该写/etc/shadow却write、非网络服务频繁connect到c2域名ip。

strace 本身不判断“非法”,只记录系统调用事实
strace 不是入侵检测工具,它不会标记某个 open 或 connect 是“非法”的。它只忠实地输出:哪个进程、在什么时间、调用了什么系统调用、传了什么参数、返回了什么值(含 -1 EACCES、-1 ENOENT 等错误)。所谓“非法”,必须由人结合上下文判断——比如一个只该读配置的进程突然 write 到 /etc/shadow,或非网络服务进程频繁 connect 到 C2 域名的 IP。
用 -e trace + 错误码过滤快速定位可疑行为
直接全量跟踪会产生海量噪音,重点应放在“失败但本不该失败”或“成功但不该成功”的调用上:
- 聚焦权限类失败:
strace -e trace=open,openat,execve,connect -o suspicious.log ./app 2>&1 | grep -E "(EACCES|EPERM|EACCES|ENOTCONN)" - 捕获所有失败的系统调用(不含高频时间类):
strace -e trace=all -e trace=!clock_gettime,!gettimeofday,!rt_sigreturn -o trace.log ./app,再用grep " = -1 "提取失败项 - 若怀疑恶意写入,单独高亮
write和sendto:strace -e trace=write,sendto,openat -y ./app,-y会把 fd 映射成路径,一眼看出写到了哪
追踪运行中进程时,-f 和 -y 是刚需
攻击载荷常 fork 子进程或通过 socket 传递 fd,不带 -f 会漏掉关键分支;没有 -y,你只能看到 write(3, ...),却不知道 fd 3 对应 /tmp/.shell 还是 /dev/null:
- 先查 PID:
pgrep -f "python.*malware" - 再动态注入:
strace -p 12345 -f -y -e trace=openat,write,sendto,execve -T -o live_trace.log - 中断后立刻检查
live_trace.log中是否出现:openat(AT_FDCWD, "/proc/self/fd", ...)(重定向探测)、execve("/tmp/...", ...)、或sendto(3/tcp/192.168.1.200:443>, ...)
离线分析时,别忽略返回值和耗时异常
有些行为不靠“调用类型”暴露,而靠“结果反常”:
-
connect(3, {sa_family=AF_INET, sin_port=htons(443), sin_addr=inet_addr("10.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress)—— 正常,但若后续没poll/select就直接write,可能是绕过连接检查 -
read(4, "", 1024) = 0频繁出现,可能在轮询空 pipe 或已关闭 socket,属隐蔽信道特征 -
stat("/tmp/.lock", {...}) = -1 ENOENT后紧跟openat(AT_FDCWD, "/tmp/.lock", O_WRONLY|O_CREAT|O_EXCL, 0600) = 3,说明在抢锁,需结合文件内容判断是否为恶意进程互斥逻辑
真正难的是把零散的系统调用串成行为链——比如 openat 读取某脚本 → execve 解释执行 → socket+connect 建连 → sendto 发送加密载荷。这要求你对目标进程的正常行为有 baseline 认知,否则所有调用看起来都“合法”。











