如何在Linux中使用以下权限位访问只读文件?

时间:2019-05-15 12:36:05

标签: linux permissions access

我的一个应用程序app允许读取具有权限的文件fileA

-r-------- app2 app2 // fileA
-rwsr-x--- app2 app1 // app

我尝试使用类似./app < ./fileA的输入将文件输入到应用程序中,以便我可以读取它,但这是行不通的。

尝试变体:echo ./fileA | ./app也不起作用。我做错了什么吗?我目前属于app1组,并且能够使用应用程序app

1 个答案:

答案 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的所有者运行