我有一个 C 程序需要访问一个受保护的充满东西的目录。strong text这个想法是只有程序或管理员才能访问。
过去在 Linux 平台上,我相当成功地使用了文件系统的 SETUID 和 SETGID 位。该程序运行得很好,因为文件系统所说的任何 UID 和 GID 都是可执行文件的所有者,无论谁运行它。
或者,更确切地说,它曾经成功运行。
我不知道这个变化是什么时候发生的,因为我只倾向于在出现硬件故障时更新操作系统,所以我会同时获得两个更新......所以,鉴于很多版本都被跳过了,我,只有正确的现在,Fedora Core 17 上的开发系统不再支持这些位。由于 FC 19 是当前版本,我想最新版本只会变得更糟,而不是更好。
这是“ls -l”输出:
-rwsrwsr-x 1 cu cu 26403 Aug 28 2012 comp
在调查解决方案时,我发现 chmod 的手册页是这样说的:
其他限制可能会导致 MODE 或 RFILE 的 set-user-ID 和 set-group-ID 位被忽略。此行为取决于底层 chmod 系统调用的策略和功能。如有疑问,请检查底层系统行为。
好的,但我不知道如何按照建议检查该政策和功能!他们没有提供任何帮助,只能使用 info 命令 - 但我发现那里没有任何帮助,只有有关用于创建新文件的默认用户和组所有权的数据。
SELINUX 已关闭。
问题:
在现代做这种事情的“正确”方法是什么?
我如何检查政策 - 并更改它们?
感谢您的任何意见。
更多数据:
C 程序只有这一行分支以输出错误 - 摘录:
line=malloc(large);
if (!line) printf("virtual memory exhausted\n");
if (line && FileExists(filename))
{
if (access(filename,R_OK)==0)
{
cfile=fopen(filename, "r");
您的问题是使用
access()
.该
man 2 access
页面说:当您使用 setuid 二进制文件运行时,您只会更改您的有效UID,而不是您的真实 UID。所以
access()
调用总是会失败。您应该删除
access()
. 在这种情况下,它是多余的,因为无论如何您都使用 fopen 打开文件,执行这样的访问检查然后对其执行读取也很匆忙。