问题背景
在IBM Spectrum LSF集群环境中,存在一个潜在的安全漏洞:用户在提交作业时,可以通过预加载自定义的getuid函数来更改作业的运行用户身份。这种攻击方式利用了Linux的LD_PRELOAD机制,可能导致用户绑定作业用户时绕过权限限制。
攻击原理
LD_PRELOAD机制
LD_PRELOAD是Linux系统中的一个环境变量,它指示动态链接器在加载任何其他库(包括标准系统库)之前,优先加载指定的共享库。这个机制虽然对调试和测试非常有用,但也可能被滥用于恶意目的。
getuid劫持攻击
攻击者可以创建一个恶意的共享库,其中包含自定义的getuid()函数实现。正常情况下,getuid()函数用于获取当前进程执行者的用户ID(UID)。通过预加载包含自定义getuid()的库,攻击者可以欺骗程序,使其误认为自己正以不同的用户身份运行。
例如,攻击者可以让getuid()始终返回0(root用户的UID),从而欺骗程序认为它正以root权限运行。
在LSF中的影响
在LSF批量交互式作业提交(如使用bsub -Is和bsub -Ip)的场景下,如果LSF环境没有正确清理这些作业的环境变量,恶意用户可以在提交作业时设置LD_PRELOAD指向他们的自定义库。这将导致:
- 注入的库拦截和修改系统调用(如
getuid()) - LSF系统误认为作业以不同的用户身份运行
- 作业可能访问本不应该有权访问的资源
- 导致用户身份伪造或权限提升
解决方案
方案一:使用hostsetup命令加固配置
要防止用户预加载getuid并在作业提交时更改作业用户,需要在每台主机上以root权限运行hostsetup命令,并使用--ext-serverdir和--eauth(或--eauth-key)选项。
执行步骤
在每台主机上执行以下命令:
1
hostsetup --ext-serverdir="file_path" --eauth-key="my_eauth_key"
参数说明:
--ext-serverdir="file_path":指定eauth可执行文件的位置,该位置必须对本地主机可访问--eauth-key="my_eauth_key":指定一个密钥字符串,此命令会将LSF_EAUTH_KEY="my_eauth_key"写入/etc/lsf.sudoers文件。如果使用特殊字符,需要进行转义(例如:\\&abdfef)
hostsetup命令执行的操作
执行hostsetup --ext-serverdir后,系统会自动完成以下操作:
- 创建从集群的
lsf.conf文件到/etc/lsf.conf的符号链接 - 将
LSF_EXT_SERVERDIR、LSF_SERVERDIR和LSF_ENV_OVERRIDE=N写入/etc/lsf.conf - 将
eauth和esub*复制到LSF_EXT_SERVERDIR目录,赋予root权限,并在eauth上设置setuid位
方案二:启用LSF_LD_SECURITY参数
对于批量交互式作业(尤其是伪终端中的作业),可以在lsf.conf文件中启用LSF_LD_SECURITY参数:
1
LSF_LD_SECURITY=y
此配置确保LSF在交互式作业初始化时移除LD_PRELOAD和LD_LIBRARY_PATH环境变量。这些变量会在作业实际运行前被恢复,从而防止在关键的初始执行阶段发生恶意库预加载。
关键配置参数说明
| 参数 | 说明 |
|---|---|
LSF_ENV_OVERRIDE=N |
设置后,LSF仅使用/etc/lsf.conf中的参数。LSF_SERVERDIR和LSF_BINDIR必须在此文件中定义 |
LSF_EXT_SERVERDIR |
如果定义,LSF将从此目录使用eauth可执行文件 |
LSF_LD_SECURITY=y |
启用LD安全机制,防止LD_PRELOAD攻击 |
最佳实践建议
- 在所有LSF节点上执行加固:确保在集群中的每一台主机上都运行
hostsetup命令 - 保护
/etc/lsf.conf文件:确保只有root用户可以修改此文件 - 保留原始
eauth文件:为了兼容性,不要删除LSF_SERVERDIR中的eauth文件 - 定期审计:定期检查LSF配置文件的权限和完整性
- 监控异常行为:监控集群中是否有异常的
LD_PRELOAD使用情况
EGO环境注意事项
如果启用了EGO,需要在$EGO_CONFDIR/ego.conf中定义EGO_SERVERDIR。