Как я могу отследить активность файловой системы, особенно записи? - PullRequest
3 голосов
/ 21 июня 2011

Gentoo имеет функцию в портеже, которая предотвращает и регистрирует записи вне каталогов сборки и упаковки.

Checkinstall может отслеживать записи и упаковыватьвсе сгенерированные файлы после завершения.

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

  • Как я могу сделать это сам с безопасностью метода песочницы Gentoo?
  • Могу ли я использовать SELinux, rlimit или какой-либо другой API ограничения ресурсов?
  • Какие API доступны для этого в C, Python?

Update0

  • Используемый механизм не требует привилегий root или какой-либо вовлеченной / постоянной модификации системы.Это исключает создание пользователей и использование chroot().
  • Пожалуйста, обратитесь к документации по API, которые вы упоминаете, по некоторым причинам, их исключительно трудно найти.

Update1

  • Это для предотвращения несчастных случаев .Я не беспокоюсь о вредоносном коде, только плохо написанное разнообразие.

Ответы [ 5 ]

2 голосов
/ 21 июня 2011

Способ, которым Debian решает эту проблему, заключается в том, чтобы не запускать код установки от имени пользователя root. Сценарии компоновки пакетов запускаются как обычный пользователь, а сценарии установки запускаются с использованием fakeroot - эта библиотека LD_PRELOAD перенаправляет вызовы проверки разрешений, чтобы создать впечатление, что установщик фактически работает от имени пользователя root, поэтому получающийся в результате владелец файла и права являются правильными (т. е. если вы запускаете /usr/bin/install из среды fakeroot, дальнейшие stat s из среды показывают правильное владение root), но на самом деле установщик запускается как обычный пользователь.

Сборки также, в некоторых случаях (в основном для разработки), выполняются в chroot с использованием, например, pbuilder - однако это, вероятно, проще в бинарном выпуске, поскольку каждая сборка с использованием pbuilder переустанавливает все зависимости за пределами базы система, действующая как проверка того, что указаны все необходимые зависимости (это основная причина использования chroot; не для защиты от случайных установок)

0 голосов
/ 01 апреля 2016

Есть два способа сделать это.Один из них - использовать LD_PRELOAD для перехвата библиотечных вызовов, которые приводят к системным вызовам, таким как в libc, и вызова dlsym / dlopen.Это не позволит вам напрямую перехватывать системные вызовы.

Второй метод, который позволяет перехватывать системные вызовы, - это запуск вашего исполняемого файла под ptrace, который предоставляет опции для остановки и проверки системных вызовов при их возникновении.Это может быть установлено программно для песочницы вызовов в ограниченные области файловой системы, среди прочего.

0 голосов
/ 21 июня 2011

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

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

Другая идея будет заключаться в перехвате системных вызовов.Я не знаю много об этом, но strace - это начало, попробуйте запустить программу через него и проверьте, видите ли вы что-то, что вам нравится.

edit:

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

0 голосов
/ 21 июня 2011

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

0 голосов
/ 21 июня 2011

Один из подходов состоит в том, чтобы виртуализировать процесс, аналогично тому, как это делает wine, и заново интерпретировать пути к файлам.Это довольно тяжелая задача для реализации.

Более элегантный подход заключается в использовании системного вызова chroot(), который устанавливает поддерево файловой системы в качестве корневого каталога процесса.Создайте виртуальное поддерево, включая / bin, / tmp, / usr, / etc, так как вы хотите, чтобы процесс их видел, вызовите chroot с виртуальным деревом, а затем выполните целевой исполняемый файл.Я не могу вспомнить, возможно ли иметь символьные ссылки внутри дерева ссылочных файлов снаружи, но я так не думаю.Но, безусловно, все необходимое можно скопировать в песочницу, а затем, когда это будет сделано, проверить наличие изменений на оригиналах.

...