Pluggable Authentication Module (PAM)是用于验证用户的机制。使用在多种Linux版本上。 Linux-PAM中的pam_wheel没有安全地使用getlogin()函数,本地攻击者可以利用这个漏洞有可能绕过部分限制,无需密码获得root用户权限。 pam_wheel模块一般结合su(1)允许属于可信组的用户无需密码使用部分命令。此模块利用getlogin()函数判断当前登录用户名,获取的用户名然后与配置文件中指定的可信组列表成员进行比较,下面是部分代码: fromsu = getlogin(); if (fromsu) { tpwd = getpwnam(fromsu); } ... ... ... /* * 测试用户是否为组成员,或者用户是否把\"wheel\"作为它的首要组 */ if (is_on_list(grp->gr_mem, fromsu) || (tpwd->pw_gid == grp->gr_gid)) { if (ctrl & PAM_DENY_ARG) { retval = PAM_PERM_DENIED; } else if (ctrl & PAM_TRUST_ARG) { retval = PAM_SUCCESS; /* this can be a sufficient check */ } else { retval = PAM_IGNORE; } } else { 如果在pam_wheel配置文件中\"trust\"选项使能,而\"use_uid\"选项不使用的情况下,任意本地用户可以伪造由getlogin()返回的用户名,无需密码获得超级用户权限。 不过上面的配置在多数Linux安装中不是默认配置。
Pluggable Authentication Module (PAM)是用于验证用户的机制。使用在多种Linux版本上。 Linux-PAM中的pam_wheel没有安全地使用getlogin()函数,本地攻击者可以利用这个漏洞有可能绕过部分限制,无需密码获得root用户权限。 pam_wheel模块一般结合su(1)允许属于可信组的用户无需密码使用部分命令。此模块利用getlogin()函数判断当前登录用户名,获取的用户名然后与配置文件中指定的可信组列表成员进行比较,下面是部分代码: fromsu = getlogin(); if (fromsu) { tpwd = getpwnam(fromsu); } ... ... ... /* * 测试用户是否为组成员,或者用户是否把\"wheel\"作为它的首要组 */ if (is_on_list(grp->gr_mem, fromsu) || (tpwd->pw_gid == grp->gr_gid)) { if (ctrl & PAM_DENY_ARG) { retval = PAM_PERM_DENIED; } else if (ctrl & PAM_TRUST_ARG) { retval = PAM_SUCCESS; /* this can be a sufficient check */ } else { retval = PAM_IGNORE; } } else { 如果在pam_wheel配置文件中\"trust\"选项使能,而\"use_uid\"选项不使用的情况下,任意本地用户可以伪造由getlogin()返回的用户名,无需密码获得超级用户权限。 不过上面的配置在多数Linux安装中不是默认配置。