问题背景

在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 -Isbsub -Ip)的场景下,如果LSF环境没有正确清理这些作业的环境变量,恶意用户可以在提交作业时设置LD_PRELOAD指向他们的自定义库。这将导致:

  1. 注入的库拦截和修改系统调用(如getuid()
  2. LSF系统误认为作业以不同的用户身份运行
  3. 作业可能访问本不应该有权访问的资源
  4. 导致用户身份伪造或权限提升

解决方案

方案一:使用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后,系统会自动完成以下操作:

  1. 创建从集群的lsf.conf文件到/etc/lsf.conf的符号链接
  2. LSF_EXT_SERVERDIRLSF_SERVERDIRLSF_ENV_OVERRIDE=N写入/etc/lsf.conf
  3. eauthesub*复制到LSF_EXT_SERVERDIR目录,赋予root权限,并在eauth上设置setuid

方案二:启用LSF_LD_SECURITY参数

对于批量交互式作业(尤其是伪终端中的作业),可以在lsf.conf文件中启用LSF_LD_SECURITY参数:

1
LSF_LD_SECURITY=y

此配置确保LSF在交互式作业初始化时移除LD_PRELOADLD_LIBRARY_PATH环境变量。这些变量会在作业实际运行前被恢复,从而防止在关键的初始执行阶段发生恶意库预加载。

关键配置参数说明

参数 说明
LSF_ENV_OVERRIDE=N 设置后,LSF仅使用/etc/lsf.conf中的参数。LSF_SERVERDIRLSF_BINDIR必须在此文件中定义
LSF_EXT_SERVERDIR 如果定义,LSF将从此目录使用eauth可执行文件
LSF_LD_SECURITY=y 启用LD安全机制,防止LD_PRELOAD攻击

最佳实践建议

  1. 在所有LSF节点上执行加固:确保在集群中的每一台主机上都运行hostsetup命令
  2. 保护/etc/lsf.conf文件:确保只有root用户可以修改此文件
  3. 保留原始eauth文件:为了兼容性,不要删除LSF_SERVERDIR中的eauth文件
  4. 定期审计:定期检查LSF配置文件的权限和完整性
  5. 监控异常行为:监控集群中是否有异常的LD_PRELOAD使用情况

EGO环境注意事项

如果启用了EGO,需要在$EGO_CONFDIR/ego.conf中定义EGO_SERVERDIR

参考资料

  1. IBM Documentation - Secure the lsf.conf file and prevent users from changing the job user at job submission time
  2. IBM Documentation - LSF LD_PRELOAD Security