识别可疑 pam_exec 条目需检查 /etc/pam.d/sshd 中含 pam_exec.so 的行,重点排查临时路径脚本、expose_authtok 参数、log=/dev/null 或 seteuid 隐藏行为,因其默认不写系统日志,须结合进程监控、文件访问和网络连接动态验证。

sshd 的 pam.d 配置里怎么识别可疑的 pam_exec 条目
直接看 /etc/pam.d/sshd 文件,重点扫描含 pam_exec.so 的行。合法使用通常带明确路径、quiet 或 stdout 等可控参数;后门倾向省略日志控制、调用非常规脚本(如 /tmp/.x、/dev/shm/a.sh)、或加 expose_authtok 窃取密码明文。
常见可疑模式包括:
-
auth [default=ignore] pam_exec.so /tmp/.p—— 路径在临时目录,无日志输出 -
auth [success=done] pam_exec.so expose_authtok /var/log/.a——expose_authtok是高危标志,且目标脚本名伪装成日志 - 同一行混用
seteuid+log=/dev/null—— 主动屏蔽执行痕迹
为什么 pam_exec 后门往往不写系统日志
因为默认情况下 pam_exec.so 不自动记录到 syslog,除非显式加 log=file_path 或脚本自身调用 logger。攻击者正是利用这个默认静默行为绕过常规审计。
排查时不能只盯 /var/log/secure 或 /var/log/auth.log 里有没有 pam_exec 记录——大概率什么都没有。真正线索藏在:
- 脚本自身的网络外连(
netstat -tupn | grep :443查异常连接) - 脚本读取的环境变量(
env | grep -i pass可能暴露被窃凭证) - 脚本是否设了
seteuid并 fork 子进程隐藏父 PID
如何动态验证某条 pam_exec 是否真在执行
别依赖日志,改用进程和文件监控。在测试账号登录前后快速抓快照:
- 用
strace -f -e trace=execve,openat,connect -p $(pgrep -f "sshd.*@") 2>&1 | grep -E "(execve|/tmp|.sh)"捕获实际调用 - 对疑似脚本加
inotifywait -m -e access,modify /tmp/.backdoor.sh,再触发一次 SSH 登录看是否触发 - 检查该脚本是否设置了
LD_PRELOAD或PATH劫持(strings /tmp/.x | grep -E "(LD_|PATH=)")
注意:某些后门会检测是否在 strace 下运行,进而跳过敏感逻辑,所以多换几种方式交叉验证。
排查时最容易忽略的两个点
一是 /etc/pam.d/common-auth 或 /etc/pam.d/system-auth 被间接 include 进 sshd,后门可能不在 sshd 本体文件里;二是容器或云主机中,/etc/pam.d/sshd 可能被 overlayfs 或 initramfs 覆盖,真实生效配置得查 grep -r "pam_exec" /usr/lib/pam.d/ 或运行时 sshd -T | grep -i pam。
另外,pam_exec 支持传参给脚本,比如 pam_exec.so /bin/sh -c 'id >> /dev/shm/log',这种内联命令极难静态识别,必须结合运行时行为分析。










