Кто тут утверждал что линукс это дружественная система ? Не верю! (ц)
Написал утилитку, запускающую /system/bin/sh из-под рута. Столкнулся с тем, что в запущенном шелле не получается примонтировать /system на rw. Тогда как в su от KingRoot все отлично монтируется.
Подскажите, куда копать ?
Вводные:
— Linux: 3.10.49
— Android 5.1.1
— файл утилиты лежит в /system/xbin (ссылка из /system/bin), имеет chown 0.0 и chmod 06755
— root получается вызовами seteuid(0) + setresgid(0,0,0) + setresuid(0,0,0) (вызовы подсмотрел в опенсорсной SuperUser от Koushi, это отдельный ппц, ИМХО, наворотили этих uid-ов)
— для красоты еще setgroups(0, 0) + setenv("USER", "root", 1)
— в запущенном шелле команда "mount -o remount,rw /system" возвращает "mount: Operation not permitted"
Грешил на SELinux, но он не причём: переключил его в Permissive через setenforce 0 и даже перезапустил утилиту через "runcon u:r:init:s0" — теперь контексты, возвращаемые командой "id", у меня и у стороннего su сопадают. Но он может монтировать раздел, а я нет. Вызов printenv показывает одинаковые переменные окружения.
ИМХО тут больше спецов по линуксу, чем в профильном форуме.
UPD: китайский su это стаб для демона, который (скорее всего) запускается в ходе init. НО! Это же Linux! Тем более root! Должен быть способ наделить свой процесс аналогичными свойствами! (Еще бы понять, какие они...)
Единственной составляющей ОС Android, что объединяет её с GNU/Linux, это ядро, сам Linux. Те, кто думает, что слово "Linux" относится ко всей комбинации GNU/Linux, запутывают сами себя и делают парадоксальные выводы о том, что "Android содержит Linux, но это не Linux". Если избежать этого недопонимания, то смысл становится понятным: Android содержит Linux (он остаётся отдельной программой в её составе, под лицензией GPLv2.), но не GNU, и таким образом, Android и GNU/Linux не имеют почти ничего общего.
Здравствуйте, IID, Вы писали:
IID>Кто тут утверждал что линукс это дружественная система ? Не верю! (ц)
А это больше замуты гугла/андроида, а не линукса.
IID>Написал утилитку, запускающую /system/bin/sh из-под рута. Столкнулся с тем, что в запущенном шелле не получается примонтировать /system на rw. Тогда как в su от KingRoot все отлично монтируется. IID>Подскажите, куда копать ?
NAND lock / Temporary Root / Shell Root / Full Root. Гуглить с ключевым словом android.
IID>Грешил на SELinux, но он не причём: переключил его в Permissive через setenforce 0 и даже перезапустил утилиту через "runcon u:r:init:s0" — теперь контексты, возвращаемые командой "id", у меня и у стороннего su сопадают. Но он может монтировать раздел, а я нет. Вызов printenv показывает одинаковые переменные окружения.
Помимо SELinux и (x)id есть всё описанное здесь: https://www.kernel.org/doc/Documentation/security/credentials.txt.
Я андроидом особо не занимался, но он вроде как использует из описанного TYPES OF CREDENTIALS > (2) Capabilities (http://linux.die.net/man/2/capset).
IID>UPD: китайский su это стаб для демона, который (скорее всего) запускается в ходе init. НО! Это же Linux! Тем более root! Должен быть способ наделить свой процесс аналогичными свойствами! (Еще бы понять, какие они...)
В Linux есть способы ограничить права root (как раз Capabilities) необратимым способом.
Здравствуйте, IID, Вы писали:
IID>- файл утилиты лежит в /system/xbin (ссылка из /system/bin), имеет chown 0.0 и chmod 06755
Вроде же /system монтируется с опцией nosuid, не? Ты в своей утилите логировал результаты вызова всех этих seteuid/getuid? А тулза делает fork/exec или просто exec?
Здравствуйте, andrey.desman, Вы писали:
AD>Здравствуйте, IID, Вы писали:
IID>>- файл утилиты лежит в /system/xbin (ссылка из /system/bin), имеет chown 0.0 и chmod 06755
AD>Вроде же /system монтируется с опцией nosuid, не?
хз
rr — моя тулза
su — китайская
shell@T01:/ $ mount | grep /system
/dev/block/bootdevice/by-name/system /system ext4 ro,seclabel,relatime,data=ordered 0 0
shell@T01:/ $ rr
root@T01:/ # mount -o remount,rw /system
mount: Operation not permitted
255|root@T01:/ # exit
255|shell@T01:/ $ su
root@T01:/ # mount -o remount,rw /system
root@T01:/ # exit
shell@T01:/ $ mount | grep /system
/dev/block/bootdevice/by-name/system /system ext4 rw,seclabel,relatime,data=ordered 0 0
shell@T01:/ $
Еще что замечено:
1) китайская не работает без демона, запущенного от init. Демон — файл с точно таким же содержанием, но другим именем. Попытка грохнуть 2 процесса-демона и перезапутить демона от root вручную приводит к тому, что su с таким демоном сразу же завершается.
2) убитые процессы-демоны самостоятельно перезапускаются в течении ~минуты. Парент /init (pid=1). Механизм перезапуска пока не выяснил. Китайцы вообще мощно в систему внедрились, я около 10ка копий насчитал, это только бегло найденные.
3) в моей тулзе я не могу зайти в /data/local/tmp. Китайская же заходит без проблем.
IID>Ты в своей утилите логировал результаты вызова всех этих seteuid/getuid?
Все такие вызовы успешны. Отдизасмил частично китацев — они делают вот так:
if (setgid(0) || setuid(0))
return -1;
if (setresgid(-1, gid, -1) || setresuid(-1, uid, -1))
return -2;
if (setresgid(gid, gid, gid) || setresuid(uid, uid, uid))
return -3;
Эффекта это не даёт.
IID>А тулза делает fork/exec или просто exec?
моя
const char* sh = "/system/bin/sh";
if (execlp(sh, sh, NULL) < 0)
{
В китайской видел сисколлы execve, fork, vfork. Других, относящихся к запуску, нет.
Здравствуйте, IID, Вы писали:
IID>2) убитые процессы-демоны самостоятельно перезапускаются в течении ~минуты. Парент /init (pid=1). Механизм перезапуска пока не выяснил. Китайцы вообще мощно в систему внедрились, я около 10ка копий насчитал, это только бегло найденные.
Собственно, init их и презапускает.
IID>>Ты в своей утилите логировал результаты вызова всех этих seteuid/getuid? IID>Все такие вызовы успешны. Отдизасмил частично китацев — они делают вот так:
Это странно. Может обманывает?
Ты из adb запускаешь? Я посмотрел код adb демона — он дропает cap_setuid/cap_setgid из своего bounding set. Получить их обратно уже невозможно, даже если запускать setuid бинарь.
Вероятно по этой причине китайцы запилили демон.
Upd. Ничего странного. Он не дропает cap_setuid/cap_setgid, а наоборот, оставляет только их. Т.е. да, ты получаешь рута, только этот рут ничего не может.
Здравствуйте, andrey.desman, Вы писали:
AD>Здравствуйте, IID, Вы писали:
IID>>2) убитые процессы-демоны самостоятельно перезапускаются в течении ~минуты. Парент /init (pid=1). Механизм перезапуска пока не выяснил. Китайцы вообще мощно в систему внедрились, я около 10ка копий насчитал, это только бегло найденные.
AD>Собственно, init их и презапускает.
А почему он это делает ?
AD>Upd. Ничего странного. Он не дропает cap_setuid/cap_setgid, а наоборот, оставляет только их. Т.е. да, ты получаешь рута, только этот рут ничего не может.
AD>Ты из adb запускаешь? Я посмотрел код adb демона — он дропает cap_setuid/cap_setgid из своего bounding set. Получить их обратно уже невозможно, даже если запускать setuid бинарь.
Патч ADB демона, изменяющий всего 2 байта и отучающий его от такого поведения (чтобы не менять system-wide props, как это штатным образом положено).