su в Debian chroot дает критическую ошибку (встроенная система)

619
virtualdj

Я пытаюсь установить Debian jessie внутри chroot на встроенной системе (QNAP NAS с ядром 2.6.33.2). Я успешно запустил debootstrapустановку базовой системы, и chroot работает правильно, потому что я могу обновлять пакеты, используя apt-get.

Проблема возникает при добавлении нового пользователя: suвсегда печатает su: Критическая ошибка - немедленная отмена . Вот распечатка:

CHROOT:/# whoami root CHROOT:/# id uid=0(root) gid=0(root) groups=0(root),100(users) CHROOT:/# su root su: Critical error - immediate abort CHROOT:/# adduser newuser Adding user `newuser' ... Adding new group `newuser' (1000) ... Adding new user `newuser' (1000) with group `newuser' ... Creating home directory `/home/newuser' ... Copying files from `/etc/skel' ... Enter new UNIX password:  Retype new UNIX password:  passwd: password updated successfully Changing the user information for newuser Enter the new value, or press ENTER for the default Full Name []: Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct? [Y/n] Y CHROOT:/# su newuser su: Critical error - immediate abort 

и каждый раз, когда я пытаюсь, suэта ошибка появляется на dmesg:

CHROOT:/# dmesg CHROOT:/# su root su: Critical error - immediate abort CHROOT:/# dmesg [ 0.000000] sys_set_ipsec_rules: copy_from_user failed! [ 0.000000] sys_set_ipsec_rules: copy_from_user failed! [ 0.000000] sys_set_ipsec_rules: copy_from_user failed! [ 0.000000] sys_set_ipsec_rules: copy_from_user failed! [ 0.000000] sys_set_ipsec_rules: copy_from_user failed! [ 0.000000] sys_set_ipsec_rules: copy_from_user failed! [ 0.000000] sys_set_ipsec_rules: copy_from_user failed! [ 0.000000] sys_set_ipsec_rules: copy_from_user failed! [ 0.000000] sys_set_ipsec_rules: copy_from_user failed! [ 0.000000] sys_set_ipsec_rules: copy_from_user failed! [ 0.000000] sys_set_ipsec_rules: copy_from_user failed! [ 0.000000] sys_set_ipsec_rules: copy_from_user failed! [ 0.000000] sys_set_ipsec_rules: copy_from_user failed! [ 0.000000] sys_set_ipsec_rules: copy_from_user failed! [ 0.000000] sys_set_ipsec_rules: copy_from_user failed! [ 0.000000] sys_set_ipsec_rules: copy_from_user failed! 

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

Кстати, у меня есть ОЧЕНЬ старый lenny chroot, который был создан таким образом, и в той же системе он работает правильно.

strace su root дает:

### CUT ### read(3, "#\n# /etc/login.defs - Configurat"..., 4096) = 4096 read(3, " issuing \n# the \"mesg y\" command"..., 4096) = 4096 read(3, "It supports passwords of unlimit"..., 4096) = 2286 close(3) = 0 munmap(0xb76e7000, 4096) = 0 access("/var/run/utmpx", F_OK) = -1 ENOENT (No such file or directory) open("/var/run/utmp", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3 _llseek(3, 0, [0], SEEK_SET) = 0 alarm(0) = 0 rt_sigaction(SIGALRM,, , 8) = 0 alarm(10) = 0 fcntl64(3, F_SETLKW, ) = 0 read(3, "", 384) = 0 fcntl64(3, F_SETLKW, ) = 0 alarm(0) = 10 rt_sigaction(SIGALRM,, NULL, 8) = 0 close(3) = 0 getuid32() = 0 time(NULL) = 1491675822 socket(PF_LOCAL, SOCK_DGRAM|SOCK_CLOEXEC, 0) = 3 connect(3,, 110) = -1 ENOENT (No such file or directory) close(3) = 0 socket(PF_NETLINK, SOCK_RAW, NETLINK_AUDIT) = 3 fcntl64(3, F_SETFD, FD_CLOEXEC) = 0 sendto(3, "p\0\0\0Q\4\5\0\4\0\0\0\0\0\0\0op=PAM:session_o"..., 112, 0,, 12) = 112 poll([], 1, 500) = 1 ([]) recvfrom(3, "$\0\0\0\2\0\0\0\4\0\0\0\2477\0\0\0\0\0\0p\0\0\0Q\4\5\0\4\0\0\0"..., 8988, MSG_PEEK|MSG_DONTWAIT,, [12]) = 36 recvfrom(3, "$\0\0\0\2\0\0\0\4\0\0\0\2477\0\0\0\0\0\0p\0\0\0Q\4\5\0\4\0\0\0"..., 8988, MSG_DONTWAIT,, [12]) = 36 close(3) = 0 time(NULL) = 1491675822 socket(PF_LOCAL, SOCK_DGRAM|SOCK_CLOEXEC, 0) = 3 connect(3,, 110) = -1 ENOENT (No such file or directory) close(3) = 0 open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3 fstat64(3, ) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb76e7000 read(3, "# Locale name alias data base.\n#"..., 4096) = 2492 read(3, "", 4096) = 0 close(3) = 0 munmap(0xb76e7000, 4096) = 0 open("/usr/share/locale/en_US.UTF-8/LC_MESSAGES/Linux-PAM.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en_US.utf8/LC_MESSAGES/Linux-PAM.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en_US/LC_MESSAGES/Linux-PAM.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en.UTF-8/LC_MESSAGES/Linux-PAM.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en.utf8/LC_MESSAGES/Linux-PAM.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en/LC_MESSAGES/Linux-PAM.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en_US.UTF-8/LC_MESSAGES/shadow.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en_US.utf8/LC_MESSAGES/shadow.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en_US/LC_MESSAGES/shadow.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en.UTF-8/LC_MESSAGES/shadow.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en.utf8/LC_MESSAGES/shadow.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en/LC_MESSAGES/shadow.mo", O_RDONLY) = -1 ENOENT (No such file or directory) write(2, "su: Critical error - immediate a"..., 37su: Critical error - immediate abort ) = 37 socket(PF_NETLINK, SOCK_RAW, NETLINK_AUDIT) = 3 fcntl64(3, F_SETFD, FD_CLOEXEC) = 0 sendto(3, "l\0\0\0P\4\5\0\5\0\0\0\0\0\0\0op=PAM:setcred a"..., 108, 0,, 12) = 108 poll([], 1, 500) = 1 ([]) recvfrom(3, "$\0\0\0\2\0\0\0\5\0\0\0004<\0\0\0\0\0\0l\0\0\0P\4\5\0\5\0\0\0"..., 8988, MSG_PEEK|MSG_DONTWAIT,, [12]) = 36 recvfrom(3, "$\0\0\0\2\0\0\0\5\0\0\0004<\0\0\0\0\0\0l\0\0\0P\4\5\0\5\0\0\0"..., 8988, MSG_DONTWAIT,, [12]) = 36 close(3) = 0 munmap(0xb73e2000, 8284) = 0 munmap(0xb7324000, 16500) = 0 munmap(0xb7320000, 12384) = 0 munmap(0xb7319000, 24776) = 0 munmap(0xb72fb000, 119488) = 0 munmap(0xb73b7000, 163088) = 0 munmap(0xb7344000, 467256) = 0 munmap(0xb72ca000, 196956) = 0 munmap(0xb73df000, 8220) = 0 munmap(0xb72c7000, 8232) = 0 exit_group(1) = ? +++ exited with 1 +++ 
0

1 ответ на вопрос

0
virtualdj

После установки Debian же Jessie в другой NAS с новым ядром и, видя это работало, мне удалось идентифицировать преступник путем сравнения файлов /etc/pam.d/: это pam_limits.so (в изолированном окружении Debian), который я думаю, что не совместим с наружным старше ядро.

Итак, если я проверю проблемный chroot, я могу увидеть, какие службы используют pam_limits.so с:

CHROOT:/# grep -l "^session.*pam_limits.so" $(find /etc/pam.d -type f) /etc/pam.d/runuser /etc/pam.d/login /etc/pam.d/su /etc/pam.d/cron 

Эта команда ищет все сервисы, которые по умолчанию позволяют запустить pam_limits.so, и вы видите, что suон есть (вот почему он не работает). Так что я могу закомментируйте все это по Предварению #с sedтаким образом:

CHROOT:/# sed -i "/^session.*pam_limits.so/s/^/#/" $(find /etc/pam.d -type f) CHROOT:/# grep -l "^session.*pam_limits.so" $(find /etc/pam.d -type f) 

После выдачи sedбольше нет включенного pam_limits (поскольку grepтеперь ничего не печатается), и фактически suон работает без dmesgвывода:

CHROOT:/# whoami root CHROOT:/# dmesg CHROOT:/# su root CHROOT:/# dmesg CHROOT:/# exit exit CHROOT:/# whoami root 

Похожие вопросы