Почему файл с разрешениями 400 виден для записи пользователем root, но доступен только для чтения?

На самом деле это очень короткая команда diff. Она предписывает удалить строку //#define DEBUG и заменить ее на #define DEBUG.

В этом формате diff строки, начинающиеся с одиночных -, удаляются, а строки с + добавляются. Остальные строки служат для контекста, а @@ указывает смещение в файле и количество строк, на которые ссылаются. (А тройные строки +++ --- говорят о том, какой файл был изменен)

Две распространенные причины, по которым патч не применяется:

  1. Фактически затронутые строки изменились, или
  2. Контекст вокруг этих строк изменился (возможно, изменился слишком сильно, потому что патч обычно использует "нечеткий" алгоритм.

В этом случае, вероятно, проще всего посмотреть на участок кода вручную (в файле linux-user/flatload.c, как видно из первой строки), и посмотреть, нет ли где-нибудь закомментированного #define DEBUG, а затем удалить символы комментария //.

Глядя на код, я вижу, что проблема, вероятно, на самом деле причина №3 - патч искажен, потому что он был отрисован так, как не должен был. Видите ту строчку, где просто написано #include? В исходном тексте говорится #include . Программа блога, в котором вы нашли патч, вероятно, решила, что - подозрительный HTML-тег, и тихо удалила его, а автор не заметил.

10
03.05.2018, 20:35
3 ответа

test -wон же [ -wне проверяет режим файла. Он проверяет, доступен ли он для записи. Для рута это так.

$ help test | grep '\-w'
  -w FILE        True if the file is writable by you.

Способ, который я бы проверил, состоял в том, чтобы выполнить побитовое сравнение с выводомstat(1)("%aПрава доступа в восьмеричном виде" ).

(( 0$(stat -c %a somefile) & 0200 )) && echo rw || echo ro

Обратите внимание, что подоболочка $(...)нуждается в префиксе 0, чтобы вывод statинтерпретировался как восьмеричный с помощью ((... )).

27
27.01.2020, 19:59

Я думаю, вы неправильно поняли, что делает -w. Он не проверяет, есть ли у файла «права на запись», он проверяет, доступен ли для записи файл пользователю , вызвавшему .

Более конкретно, он вызывает access(2)или аналогичный.

например, если скрипт имеет if [ -w /etc/shadow ], то если вы запустите straceв скрипте, вы можете увидеть строку, похожую на

faccessat(AT_FDCWD, "/etc/shadow", W_OK)

Поскольку rootможет записывать в файл, он возвращает 0.

например, как обычный пользователь:

faccessat(AT_FDCWD, "/etc/shadow", W_OK) = -1 EACCES (Permission denied)

Как root

faccessat(AT_FDCWD, "/etc/shadow", W_OK) = 0

И это несмотря на то, что /etc/shadowимеет разрешение 000на моей машине.

---------- 1 root root 4599 Jan 29 20:08 /etc/shadow

Теперь то, что вы хотите сделать, становится интересным и не таким простым.

Если вы хотите проверить простые разрешения, проверьте вывод lsили вызовите statили что-то подобное. Но имейте в виду, что ACL могут превышать -эти разрешения.Тот факт, что файл имеет разрешение 400, не мешает ему быть доступным для записи...

30
27.01.2020, 19:59

Пользователь root может делать все, что ему заблагорассудится, «обычные» права доступа к файлам не являются ограничениями. Он не будет напрямую запускать простой файл без каких-либо разрешений на выполнение, просто для небольшой страховки от практики использования мишени.

1
27.01.2020, 19:59

Теги

Похожие вопросы