Как мне получить доступ к файлу только для чтения, используя следующие биты прав доступа в Linux? - PullRequest
0 голосов
/ 15 мая 2019

В одном из моих приложений app разрешено чтение файла fileA с правами доступа

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

Я пытался использовать ввод типа ./app < ./fileA для подачи файла в приложение, чтобы я мог его прочитать, но это не работает.

Попробовать варианты: echo ./fileA | ./app тоже не работает. Есть ли что-то, что я сделал неправильно? В настоящее время я принадлежу к группе app1 и могу использовать приложение app.

1 Ответ

0 голосов
/ 15 мая 2019

Поскольку блок

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

не является стандартным ls -l выводом, я должен немного догадаться, что вы имеете в виду.

Я предполагаю, что ваше приложение app имеет setuid бит установлен и принадлежит тому же пользователю, что и файл fileA, который вы хотите открыть.Я также предполагаю, что вы запускаете ваше приложение как другой пользователь, у которого нет доступа к fileA.

Ваша первая попытка ./app < ./fileA не работает, потому что это не программа app, которая открывает fileA.Ваша оболочка, которая, вероятно, работает от имени другого пользователя, пытается открыть файл для перенаправления ввода.Вы должны получить сообщение об ошибке из оболочки.setuid бит app здесь вам не поможет.

Вторая попытка echo ./fileA | ./app неверна, поскольку echo записывает имя файла, а не его содержимое.Вы, наверное, имеете в виду cat ./fileA | ./app.Это не удастся аналогичным образом, потому что cat попытается открыть файл как текущий пользователь после того, как оболочка соединила программы, используя канал.

Вы должны изменить свою программу так, чтобы онаоткрыть сам файл и прочитать из соответствующего дескриптора файла или FILE вместо stdin.Затем файл будет открыт с помощью app, который работает как UID владельца файла приложения.

Вы можете использовать что-то вроде этого:

#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;
}

Если ваш appдвоичная программа, которую вы не можете изменить, вы можете реализовать программу-обертку, которая открывает файл, указанный в командной строке для чтения, дополнительно переключается на реальный идентификатор пользователя, подключает дескриптор файла к 0 (stdin), используя dup2и execl s ваш app.Вы можете сделать эту программу-оболочку setuid для владельца входного файла.

Или, может быть, вы можете настроить sudo, чтобы разрешить запускать app от имени fileA.

...