Linux setcap 和对可执行文件所做的更改

Linux setcap 和对可执行文件所做的更改

我正在开发的程序使用原始套接字。出于安全原因,要运行使用原始套接字的程序,该程序必须在有效 ID 为 0(root?)的用户下运行,或者设置以下功能:CAP_NET_RAW。

因此,在构建之后,我使用以下命令设置了功能:

sudo setcap cap_net_raw+ep <executable>

终端中的文件变为红色背景和黑色文本,我不确定这意味着什么。它在运行时仍然具有其他程序的所有其他文件属性,ls -l因此我不确定它到底发生了哪些变化。我已验证该功能已设置getcap

问题出在运行之后setcap。加载程序无法加载其他共享对象,并显示错误消息“找不到文件”。如果没有,程序可以setcap运行并加载所有必需的共享对象(以 root 身份运行时),但我宁愿不这样做。共享对象路径在环境变量中设置LD_LIBRARY_PATH

有没有提示或技巧可以说明可执行文件发生了什么变化,导致加载程序无法加载其他共享对象?可能是因为它链接的其他共享对象没有此功能?

谢谢你的帮助。

答案1

至少对于 setuid 程序,出于安全原因,环境变量(例如LD_LIBRARY_PATH或 )LD_PRELOAD会被忽略。有关详细信息,请参阅手册页ld.so(8)

我可以想象,对于设置了功能的程序来说,情况是相同的,或者至少是相似的。(不过,手册页capabilities(7)和手册页都没有ld.so(8)提到这样的限制。)

相关内容