Почему плохо иметь root-файлы для записи в каталог, не принадлежащий root?

28

Это появилось в комментарии к другому вопросу, и я был бы рад, если бы кто-то мог объяснить мне причины этого.

Я предложил, чтобы Apache регистрировал ошибки для данного VHost в домашнем каталоге пользователя. Это было сбито, потому что это было небезопасно. Зачем?

Я попросил разъяснений в ответном комментарии, но все, что я получил, было то, что небезопасно иметь записи root в папке, не принадлежащей root. Опять же, кто-нибудь может объяснить?

Благодарность,

Барт.

Барт Б
источник
4
Что Apache делает, работая от имени root - вопреки принципу наименьших привилегий!
Джонатан Леффлер
1
Apache работает как www, но запускается как root, поэтому он может связываться с портом 80, что является нормой. Видимо, он также входит в систему как root.
Барт Б

Ответы:

31

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

Например, если пользователь найдет способ сделать символическую ссылку из предполагаемого журнала Apache, скажем, в / etc / shadow, вы внезапно получите непригодную систему. Apache ( root) перезапишет учетные данные ваших пользователей, что сделает систему неисправной.

ln -s /etc/shadow /home/eviluser/access.log

Если файл access.log недоступен для записи пользователем, может быть трудно его взломать, но лучше избегать такой возможности!

Можно было бы использовать logrotate для выполнения работы , создавая ссылку на файл, который еще не существует, но этот logrotate перезапишет, как только журналы будут расти:

ln -s /etc/shadow /home/eviluser/access.log.1

Примечание :

Символический метод только один из возможных атак, учитывая , как доказательство концепции.

Безопасность должна делаться с умом из Белого списка , а не из черного списка того, что, как мы знаем, является проблемой.

AlberT
источник
Есть ли способ установить разрешения для него, чтобы они могли только читать файл, а не удалять, редактировать или делать что-либо еще (например, chown, chmod и т. Д.)?
Джошуа
Вы должны сделать эту операцию для каждого возможного целевого файла! Этот доступный для записи файл является любимым, а не сама ссылка, которая принадлежит атакующему при его создании.
drAlberT
2
@Joshua: chown может выполняться только пользователем root. chmod может выполнять тот, кто владеет файлом. IIRC, переименование может быть сделано тем, кто владеет каталогом. Как упоминает AlberT, создание ссылки до того, как root создаст файл, может выполнить любой, кто может писать в каталог.
ака
2
@atk: Кроме того, тот, кто владеет каталогом, может, как правило, удалять из него файлы (если не установлен +tбит закрепления), даже если у них нет разрешения на запись в сами файлы (поскольку unlink () - это запись в каталог, а не файл). Даже если root создает файл заранее, владелец каталога может удалить его и заменить символической ссылкой на что-то другое.
Джеймс Снерингер,
1
Если eviluser может писать в / home / eviluser (или может изменять разрешения для каталога - им принадлежит, IOW), то не имеет значения, какие есть разрешения на access.log; злой пользователь может (пере) переместить файл и поместить на его место символическую ссылку. Другой вопрос, обращает ли программное обеспечение внимание на то, что оно открывает.
Джонатан Леффлер
1

Хороший принцип отсутствия записи процессов в каталог, которому они не владеют или которому они не доверяют. Но в этом конкретном случае разумно полагать, что код Apache открывает журнал с помощью O_NOFOLLOWetc: вход в домашний каталог пользователя является обычной установкой.

poolie
источник