我正在开发的程序使用原始套接字。出于安全原因,要运行使用原始套接字的程序,该程序必须在有效 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)
提到这样的限制。)