write () игнорирует права доступа к файлам

Я сделал очень простую программу на C, которая пишет «Test string» в файл с именем «file.txt»:

root@3:~# cat test.c #include "unistd.h" #include "string.h" #include "stdio.h" main() { FILE *fp; int fd; fp = fopen("file.txt", "w"); fd = fileno(fp); write(fd, "Test string\n", strlen("Test string\n")); } root@3:~# 

Я создал файл с именем «file.txt» перед тем, как выполнить test :

 root@3:~# ls -l file.txt -r-------- 1 root root 0 sept 21 22:28 file.txt root@3:~# 

Как видно выше, file.txt имеет только разрешения на чтение. Однако, если я выполняю test , «тестовая строка» записывается в «file.txt»:

 root@3:~# strace ./test execve("./test", ["./test"], [/* 22 vars */]) = 0 brk(0) = 0x188d000 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc03a44e000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=30251, ...}) = 0 mmap(NULL, 30251, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fc03a446000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\300\357\1\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0755, st_size=1599504, ...}) = 0 mmap(NULL, 3713112, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fc039ea6000 mprotect(0x7fc03a028000, 2093056, PROT_NONE) = 0 mmap(0x7fc03a227000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x181000) = 0x7fc03a227000 mmap(0x7fc03a22c000, 18520, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fc03a22c000 close(3) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc03a445000 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc03a444000 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc03a443000 arch_prctl(ARCH_SET_FS, 0x7fc03a444700) = 0 mprotect(0x7fc03a227000, 16384, PROT_READ) = 0 mprotect(0x7fc03a450000, 4096, PROT_READ) = 0 munmap(0x7fc03a446000, 30251) = 0 brk(0) = 0x188d000 brk(0x18ae000) = 0x18ae000 open("file.txt", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3 write(3, "Test string\n", 12) = 12 exit_group(12) = ? root@3:~# cat file.txt Test string root@3:~# 

Как это может произойти?

One Solution collect form web for “write () игнорирует права доступа к файлам”

Вы можете писать в файл, потому что вы являетесь пользователем root . Рассмотрим следующее:

 > cat file.txt > ls -al file.txt -r-------- 1 sdanna staff 0 Sep 21 20:43 file.txt > ./a.out Segmentation fault: 11 > sudo ./a.out > cat file.txt Test string 

Здесь ./a.out – ваша представленная программа. Как вы можете видеть, когда я запускаю команду как обычный пользователь, я получаю ошибку сегментации, когда я пытаюсь работать с нулевым указателем, возвращенным сбойным fopen.

Если я запускаю команду как root она работает нормально. Пользователь root всегда может писать в файл, если только расширенные атрибуты файла не изменяются. Справочная страница path_resolution (7) в linux, подводит итог ситуации красиво:

В традиционной системе UNIX суперпользователь (root, user ID 0) является мощным и обходит все ограничения прав доступа при доступе к файлам.

В Linux привилегии суперпользователя делятся на возможности (см. Возможности (7)). Для проверки прав доступа к файлам важны две возможности: CAP_DAC_OVERRIDE и CAP_DAC_READ_SEARCH. (Процесс имеет эти возможности, если его fsuid равен 0.)

Функция CAP_DAC_OVERRIDE переопределяет все проверки разрешений, но предоставляет разрешение на выполнение только тогда, когда установлен хотя бы один из трех битов разрешения на выполнение файла.

Функция CAP_DAC_READ_SEARCH предоставляет разрешение на чтение и поиск в каталогах и разрешение на чтение для обычных файлов.

Корневой пользователь Linux имеет обе необходимые возможности.

  • Не удалось запустить chmod, chown и даже ls в папке
  • Должен ли владелец / usr быть root?
  • Объедините несколько текстовых файлов в один со следующей строкой для каждого файла
  • Получить файл / время создания?
  • Скопируйте только определенные типы файлов из структуры папок в другую
  • Найти файлы, которые пользователь может писать, эффективно с минимальным процессом создания
  • Не удалось удалить файл в Fedora
  • для цикла в списках bash для точек и двухточечных папок
  • Псевдо-файлы для временных данных
  • Одно и то же имя в другом каталоге одинаково?
  • Разделяйте неизменные данные из центрального хранилища в сети
  • Linux и Unix - лучшая ОС в мире.