我的一个应用程序app
允许读取具有权限的文件fileA
-r-------- app2 app2 // fileA
-rwsr-x--- app2 app1 // app
我尝试使用类似./app < ./fileA
的输入将文件输入到应用程序中,以便我可以读取它,但这是行不通的。
尝试变体:echo ./fileA | ./app
也不起作用。我做错了什么吗?我目前属于app1
组,并且能够使用应用程序app
。
答案 0 :(得分:0)
作为障碍
-r-------- app2 app2 // fileA
-rwsr-x--- app2 app1 // Application
不是标准的ls -l
输出,我不得不猜测一下您的意思。
我假设您的应用程序app
设置了setuid
位,并且与要打开的文件fileA
属于同一用户。我进一步假设您以无法访问fileA
的其他用户身份启动应用程序。
您的第一次尝试./app < ./fileA
不起作用,因为它不是打开app
的程序fileA
。您的外壳(可能以其他用户身份运行)试图打开文件以进行输入重定向。您应该从外壳程序中收到一条错误消息。 setuid
的{{1}}位在这里无济于事。
第二次尝试app
是错误的,因为echo ./fileA | ./app
写入文件名而不是文件内容。您可能是说echo
。这将以类似的方式失败,因为cat ./fileA | ./app
将在外壳程序使用管道连接程序后尝试以当前用户身份打开文件。
您必须以某种方式修改程序,该程序将打开文件本身并从相应的文件描述符或cat
而不是FILE
中读取。然后,该文件将由stdin
打开,该文件作为应用程序文件所有者的UID运行。
您可以使用类似这样的内容:
app
如果#include "stdio.h"
int main(int ac, char **av)
{
FILE *inFile;
if(ac < 2)
{
/* print usage and/or report error */
return 1;
}
/* Here the input file is opened by the setuid-application. */
inFile = fopen(av[1]);
if(inFile == NULL)
{
/* handle error */
return 2;
}
/* read and process data from inFile instead of stdin */
fclose(inFile);
return 0;
}
是无法更改的二进制程序,则可以实现一个包装程序,该程序打开命令行上指定的文件以进行读取,或者有选择地切换回真实用户ID,连接文件描述符到app
到0(stdin
)的范围内,并dup2
将您的execl
。您可以将此包装程序app
设置为输入文件的所有者。
或者也许您可以配置setuid
以允许将sudo
作为app
的所有者运行