Линукс дистрибутив в chroot на nosuid-носителе

Для чайников и не только
kaztost
Сообщения: 223
Зарегистрирован: 17 июл 2017, 00:29

Сообщение kaztost » 29 янв 2018, 02:36

Надеюсь, что не сильно оффтоплю в данном разделе (предупреждаю - будут торчать андроидные уши), но просто хотел поделиться с одним из решений проблемы с линукс-дистрибутивом, чрутованном в директории, находящейся в разделе, монтированном с nosuid-флагом (классический пример - /data в андроиде). Понятно дело, никакие su и sudo для не-рут пользователей внутри чрута работать не будут. Держать же наготове рут-консоль постоянно не хочется, все же в нормальных дистрибутивах принято работать не в рут. Обычно обходным маневром работает монтирование образа через loop-устройство, а там уже suid можно и включить. Другим методом может служить запуск клиент-серверного приложения (например, ssh или telnet), позволяющего клиенту получить шелл рут-сервера. Мое решение из той же серии, но с использованием UNIX-сокетов. Поиск готовых Linux-решений в интернете ни к чему не привел, наиболее близкие решения - некоторые версии netcat и su-бинарники для андроида. В качестве основы взял koush's Superuser, откуда выдрал все, что касается андроидной специфики, связанной с активити, базами данных и проч. Надеюсь, ничего нужного не удалил. В общем, вот получившиеся сорцы вместе со статически собранными бинарниками для arm. Утилиту назвал dsu (daemon superuser). Запуск сервера от рут (например через init.d)

Код: Выделить всё

dsu --daemon uid.list &

где uid.list - файл, строки которого имеют формат UID[/comment], например, "0/superuser" , или "5000/admin", или просто "5001", со списком разрешенных UID. Если другой процесс c разрешенным UID вызовет

Код: Выделить всё

dsu -c <command>

то command выполнится сервером, а клиент получит stdout и stderr от этой command. Если вызов dsu будет без параметров, то выполнится интерпретатор SHELL из окружения сервера. Вызывать dsu можно и вне chroot, лишь бы UID совпадал. Два бинарника в архиве собраны с разными именами используемых сокетов (DSUPERUSER1 и DSUPERUSER2) и могут использоваться параллельно в разных чрутах. Если хотите еще - надо пересобрать, исправив начало в su.h.

Отмечу, что данные бинарники по-прежнему можно использовать в качестве получателей рут-прав в андроиде. Нужно лишь заполнить uid.list UIDами андроид-приложений, которым дозволен рут. Конечно, тут уже никакой интерактивности, оповещений и пополнения списка на лету. Но зато 62 Kb статики! Предупреждаю - это для продвинутых, поскольку сервер должен быть вызван с максимальным полномочиями (capabilities и SELinux), а на современных девайсах один su-бинарник на другой простым копированием не заменишь.

Ну, и если кто заменит проблему, пожалуйста, сообщите. Ну и добро пожаловать тем, кто сам захочет что-то улучшить.

Вернуться в «Linux - все вопросы тут»

Кто сейчас на конференции

Всего 2 посетителя :: 0 зарегистрированных, 0 скрытых и 2 гостя (основано на активности пользователей за последние 5 минут)
Больше всего посетителей (162) здесь было 16 ноя 2019, 18:33

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя