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 имеет обе необходимые возможности.

  • Используйте команду head или аналогично, чтобы определить, когда байты изменяются в файле
  • Где хранятся таблицы i-node?
  • Найти файлы рекурсивно, но выберите наиболее крупные из них с дублирующимися именами
  • Распакуйте все файлы в директории с тем же именем
  • Предоставить пользователю разрешение на доступ к файлам в каталоге
  • Удалять файлы в каталоге, которые также находятся в другом каталоге
  • Как удалить содержимое всех подкаталогов с именем «output»?
  • Можно ли редактировать файл с помощью разрешения «писать», но не в его родительском каталоге?
  • Как удалить повторяющиеся строки внутри текстового файла?
  • Как преодолеть «занятое устройство или ресурс»?
  • Как система знает, когда файл был изменен? В частности, файлы с отображением памяти
  • Interesting Posts

    Пакетное преобразование файлов модулей с помощью XMP

    Замена исполняемого двоичного файла в файловой системе только для чтения

    Проверка списка файлов xml

    Блокировка SSH: подозрительная локальная проблема, а не удаленная

    Как сопоставить ярлык терминала CTRL-M с другой комбинацией

    sed – удаление нуля – / 08 / to / 8 /

    Подпроцессы bash / gnome-terminal не заканчиваются (CentOS / RHEL)

    Что мешает моим оконным менеджерам распознавать некоторые комбинации клавиш?

    Использовать пользовательскую конфигурацию без полномочий root для учетной записи root

    Как копировать DVD-диски

    unattended-updates не обновляет пакеты из backport

    ldd возвращает «не динамический исполняемый файл» для 64-битного ELF, хотя objdump и readelf не согласны

    Debian игнорирует переменные env PAM (в то время как Arch не работает)

    Запуск нескольких программ в фоновом режиме и проверка их возвращаемого значения

    mv: невозможно удалить каталог: каталог не пуст

    Linux и Unix - лучшая ОС в мире.