Кто, черт возьми, блокирует меня от chroot?
Это был не SELinux - это была охота на диких гусей ( getenforce
возврат «Permissive» означает, что SELinux действительно больше не используется).
Виновником - после добавления большого количества printk
в исходный код ядра для отслеживания сбоев как chroot
, так и mount
- оказался возможности . В частности, «набор ограничений возможностей» Android - вы можете прочитать все о них через man
( man 7 features
), и, признаюсь, я никогда раньше не утруждал себя изучением их - моя повседневная Задачи UNIX зависят от них, и я понятия не имел ... попробуйте это в своем Linux-окне, чтобы убедиться в этом:
$ getfattr -d -m - /sbin/ping
getfattr: Removing leading '/' from absolute path names
# file: sbin/ping
security.capability=0s......
Видите? Ping больше не является корнем SUID - он использует информацию , хранящуюся в расширенных атрибутах файловой системы , чтобы знать, что у него есть доступ к уровню необработанных сокетов (чтобы он мог выполнять свои функции ICMP - то есть на уровне IP).
В любом случае, я отвлекся - момент операции в моем ядре, где я остановил «сбросить набор моих возможностей» - возможно, отвратительным способом «пусть они все идут своим чередом» - это ( security / commoncap.c
):
static long cap_prctl_drop(struct cred *new, unsigned long cap)
{
if (!capable(CAP_SETPCAP))
return -EPERM;
if (!cap_valid(cap))
return -EINVAL;
// ttsiodras: come in, everyone, the water's fine!
//cap_lower(new->cap_bset, cap);
return 0;
}
Это означает, что возможности НИКОГДА не упускаются - действительно, очень безопасная конфигурация: -)
$ adb shell
shell@K01E_2:/ $ su
root@K01E_2:/ # chroot /data/debian/ /bin/bash
root@localhost:/# export PATH=/bin:/sbin:/usr/bin:/usr/sbin:\
/usr/local/bin:$PATH
root@localhost:/# cat /etc/issue
Debian GNU/Linux 8 \n \l
Привет, мой милый Debian: -)
О, и "Root checker" тоже работает - Я вырезал "su.c", чтобы все пользователи моего планшета могли получить root-права:
int main(int argc, char **argv)
{
struct passwd *pw;
uid_t uid, myuid;
gid_t gid, gids[50];
/* Until we have something better, only root and shell can use su. */
myuid = getuid();
//
// ttsiodras - Oh no, you don't :-)
//
//if (myuid != AID_ROOT && myuid != AID_SHELL) {
// fprintf(stderr,"su: uid %d not allowed to su\n", myuid);
// return 1;
//}
Теперь, когда он работает, я должен заставить его работать правильно - т.е. разрешить только мои termux
и Terminal Emulator
пользователей, чтобы они вызывали su
и chroot
, и не позволяли никому и их бабушке входить: -)
Dos soluciones:
Un bucle de concha:
for name in /usr/bin/*file*; do
case "${name##*/}" in
*[!a-z]*) ;;
*) printf '%s\n' "$name"
esac
done
Esto primero genera una lista de nombres de ruta bajo /usr/bin
cuyo nombre base coincide con *file*
y luego comprueba si esos nombres base también contienen caracteres que no son letras minúsculas. Si no se encuentran letras minúsculas que no sean -, se imprime el nombre de ruta.
Esto potencialmente también encontraría nombres de directorios que cumplan con los criterios. Si eso no es lo que quieres, solo haz
[ ! -f "$name" ] && continue
antes de la instrucción case
para omitir todos los nombres que no sean archivos normales.
Usando GNUfind
:
find /usr/bin -maxdepth 1 -type f -name '*file*' -regex '.*/[a-z]*$'
Esto también hace un filtrado de dos etapas. Primero en el nombre base que debe coincidir con *file*
, y luego al final del nombre de ruta(-regex
coincide con el nombre de ruta completo )para asegurarse de que solo haya letras minúsculas allí.