一、PAM 认证机制概述
可插拔认证模块(Pluggable Authentication Modules,PAM) 是 Linux/Unix 系统中一套标准化的认证框架,它将认证逻辑从应用程序中剥离出来,通过模块化的方式统一管理。PAM 的设计初衷是解决早期系统中认证机制与应用程序紧耦合的问题——当需要切换认证方式(如从密码认证改为指纹认证)时,开发者无需修改应用源码,只需调整 PAM 配置文件即可。
PAM 的核心架构由 应用程序(Application)、PAM 库(libpam) 和 认证模块(Module) 三部分组成。当用户尝试登录系统时,应用程序(如 sshd、login、su)调用 PAM API,PAM 库根据服务名称加载对应的配置文件,然后按顺序执行配置文件中指定的认证模块,最终返回认证结果。
1.1 配置文件体系
PAM 的配置文件主要位于 /etc/pam.d/ 目录下,每个服务对应一个独立的配置文件,文件名即为服务名称。例如,sshd 服务使用 /etc/pam.d/sshd,su 命令使用 /etc/pam.d/su。此外,系统级配置可通过 /etc/pam.conf 文件统一管理(现代系统较少使用)。
每条配置记录的格式为:
module_type control_flag module_path [module_arguments]
1.2 四种模块类型
PAM 定义了四种类型的模块,分别对应认证流程的不同阶段:
- auth(认证):验证用户身份,如密码校验、指纹比对等。
- account(账户):检查账户合法性,如账户是否过期、是否允许在特定时间登录等。
- password(密码):管理认证令牌的更新,如用户修改密码时的策略检查。
- session(会话):处理会话级别的操作,如登录时挂载目录、设置环境变量等。
1.3 控制标志
控制标志(Control Flags)决定了模块执行结果的传递逻辑,常见的有:
- required:模块必须成功,失败时继续执行后续模块,但最终返回失败。
- requisite:模块必须成功,失败时立即返回,不再执行后续模块。
- sufficient:模块成功时直接返回成功,跳过其余模块;失败时继续执行后续模块。
- optional:模块失败不影响最终结果。
二、PAM 服务名称映射机制
PAM 加载配置文件的关键在于 服务名称映射机制。当应用程序调用 pam_start() 函数初始化 PAM 会话时,需要传入一个服务名称参数。PAM 库根据该名称在 /etc/pam.d/ 目录下查找对应的配置文件。
关键问题在于:PAM 获取服务名称的方式是读取 argv[0](即程序的文件名),而非程序的绝对路径。这意味着,如果通过软链接将 sshd 伪装为 su,PAM 会将其识别为 su 服务,从而加载 /etc/pam.d/su 的配置,而非 /etc/pam.d/sshd。
这一设计在提供灵活性的同时,也为攻击者留下了可乘之机。
三、后门威胁原理
PAM 的模块化设计虽然提供了灵活性,但也可能被恶意利用,尤其是与 sshd 相关的后门攻击。以下是一种典型的 pam_sshd 后门攻击原理:
在默认情况下,sshd 服务通过 /etc/ssh/sshd_config 文件启用 PAM 认证(UsePAM yes)。如果 /etc/pam.d/sshd 或引用的配置文件中包含以下配置:
auth sufficient pam_rootok.so
pam_rootok.so 模块会检查用户的 UID 是否为 0(即 root 用户),如果为 root,则直接认证成功,无需进一步验证密码。这种配置在某些场景下可能被恶意利用。
攻击者可利用 PAM 的服务名称映射机制,通过以下步骤实施后门攻击:
-
创建软链接,将
/usr/sbin/sshd链接到/tmp/su:ln -sf /usr/sbin/sshd /tmp/su -
启动一个新的 SSH 服务,使用自定义端口(如 8080):
/tmp/su -oPort=8080这会启动一个独立的
sshd进程,监听指定端口,并使用/etc/pam.d/su的认证配置。 -
连接到该服务:
ssh root@127.0.0.1 -p 8080由于
/etc/pam.d/su中可能包含auth sufficient pam_rootok.so,PAM 仅检查 UID 是否为 0,而不验证密码。因此,攻击者可使用任意密码以 root 身份登录,成功绕过常规认证机制。
这种攻击的核心在于 PAM 的配置文件加载机制:PAM 根据服务名称(如 su 或 sshd)从 /etc/pam.d/ 目录中查找对应的配置文件。攻击者通过软链接将 sshd 伪装为其他服务(如 su),利用目标配置文件中的宽松认证规则(如 pam_rootok.so)实现无密码登录。这种攻击手法隐蔽且高效,特别是在目标系统未严格监控或配置不当的情况下。
四、攻击原理图解

上图清晰展示了正常认证流程与后门攻击流程的对比。在正常流程中,sshd 调用 PAM API,PAM 读取 /etc/pam.d/sshd,通过 pam_unix.so 验证密码哈希。而在攻击流程中,攻击者通过软链接将 sshd 伪装为 su,PAM 误加载 /etc/pam.d/su,遇到 pam_rootok.so 后检查 UID 为 0 即直接通过,跳过了密码验证环节。
五、防御建议
针对此类后门攻击,可从以下几个层面进行防御:
-
监控 PAM 配置文件:定期检查
/etc/pam.d/目录下的配置文件,确保未引入异常的pam_rootok.so等宽松认证规则。 -
限制软链接创建:通过文件系统权限控制,防止非授权用户在关键目录创建指向系统二进制文件的软链接。
-
审计进程启动:监控系统中异常端口的
sshd进程,特别是从非标准路径启动的实例。 -
最小化 PAM 配置:遵循最小权限原则,仅启用必要的 PAM 模块,避免在关键服务配置中使用
sufficient等过于宽松的控制标志。
六、结语
PAM 作为 Linux 系统的核心认证框架,其模块化设计极大地提升了系统的灵活性和可扩展性。然而,服务名称映射机制依赖 argv[0] 而非绝对路径 的设计,为攻击者提供了绕过认证的可能。理解 PAM 的工作原理和潜在风险,对于构建安全的 Linux 系统至关重要。安全从业者应持续关注 PAM 配置的安全性,结合监控与审计手段,有效防范此类后门威胁。
原文 https://blog.csdn.net/2301_79518550/article/details/145524969