Как я могу зафиксировать пропущение/переименовывание libc.so.6?

Причина, что я должен так или иначе стать корнем без ввода sudo то, потому что

error while loading shared libraries: libc.so.6: 
    cannot open shared object file: No such file or directory

Я использовал sudo иметь sudo mv /lib64/libc.so.6 /lib64/libc.so.6.bak

Поскольку я следовал некоторым инструкциям так, чтобы я мог обновить символьную ссылку на libc-12.4.so вместо тока libc-12.2.so

LD_PRELOAD=./libc-2.14.so ln -s ./libc-2.14.so ./libc.so.6

Но это не работает с помощью sudo. Теперь я боюсь выйти из системы или перезагрузить к смерти системы. Поскольку я должен получить корневое разрешение зафиксировать это.

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

Помогите.

$ sudo bash -c "LD_PRELOAD=./libc-2.14.so ln -s ./libc-2.14.so ./libc.so.6"
sudo: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory

$ LD_PRELOAD=./libc-2.14.so sudo LD_PRELOAD=./libc-2.14.so ln -s ./libc-2.14.so ./libc.so.6
sudo: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory

$ LD_PRELOAD=./libc-2.12.so sudo LD_PRELOAD=./libc-2.12.so ln -s ./libc-2.12.so ./libc.so.6
sudo: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory

$ LD_PRELOAD=./libc-2.12.so ln -s ./libc-2.12.so ./libc.so.6
ln: creating symbolic link `./libc.so.6': Permission denied
7
задан 28 April 2018 в 11:34

3 ответа

Необходимо просто загрузиться от живого USB (или CD/DVD) и переименовать libc.so.6 назад.

LD_PRELOAD не работает с setuid исполняемыми файлами. Но, если Вы хотите, можно использовать /bin/busybox сделать резервные копии на последней минуте (которые не требуют рабочих команд как корня) перед перезагрузкой. Возможно зафиксировать это без живого USB/CD/DVD, но необходимо будет все еще перезагрузить, и я предлагаю использовать тот.


LD_PRELOAD не работает с командами setuid.

В настоящее время Вы пытаетесь сделать sudo пользуйтесь переименованной общей библиотекой путем установки LD_PRELOAD. Это не будет работать. Вы не можете изменить то, что совместно использовало библиотеки sudo ссылки на с LD_PRELOAD, и это не работает ни с одной из альтернатив sudo также. Если бы Вы могли бы сделать это, то это была бы чрезвычайно серьезная ошибка безопасности.

Путь sudo и pkexecsu) работа, чтобы позволить Вам поднимать полномочия состоит в том, что те исполняемые файлы имеют set0 бита setuid, который заставляет их работать как пользователь, который владеет ими, который для тех исполняемых файлов является пользователем root, а не пользователем, который на самом деле выполняет их. Когда они работают, они очень тщательно проверяют то, что Вы просите, чтобы они сделали. Таким образом, если их разработчики были достаточно осторожны, они только позволят пользователям выполнять действия, которые они разрешены выполнить.

LD_PRELOAD не имеет никакого эффекта для setuid исполняемых файлов, выполненных пользователями кроме их владельцев. Это абсолютно жизненно важно для безопасности. Иначе кто-либо мог сделать их собственную библиотеку и вызвать программу как sudo для использования его, и затем кто-либо мог получить полномочия пользователя root. Можно использовать LD_PRELOAD запускать non-setuid программы и корень может использовать его для выполнения примерно чего-либо. Но как некорневой пользователь, Вы не можете использовать его для запущения программ как sudo, pkexec, и su это - корень setuid.

Если бы у Вас уже была корневая оболочка, работающая затем, то Вы не должны были бы перезагружать. Но даже если Вам включили корневую учетную запись - то есть, даже если Вам установили пароль для нее, что Вы могли использовать для входа в систему как корень с командой как su- Вы все еще не смогли бы решить проблему без перезагрузки. Например, su в Ubuntu также требует libc.so.6 и также setuid корень так LD_PRELOAD не будет работать с ним ни один 1 (См. также комментарии Peter Cordes.)

Проблема здесь - то, что доступные механизмы для выполнения действий как корень требуют, чтобы Вы выполнили setuid исполняемые файлы, принадлежавшие корню как сами, но LD_PRELOAD не имеет никакого эффекта в той ситуации. Если бы не потребность выполнить действия как корень - или если бы у Вас уже была корневая открытая оболочка - затем, Вы смогли бы переименовать ее назад легко, не перезагружая и также без использования LD_PRELOAD. Это вызвано тем, что системы Ubuntu имеют /bin/busybox, который статически связан. Это позволяет, Вы выполнить многие общие *отклоняете инструменты, включая mv и cp команды. Можно работать /bin/busybox mv source destination или можно работать просто /bin/busybox sh получить оболочку, в которой можно затем выполнить команды. Выполненный /bin/busybox без аргументов для получения списка поддерживаемых команд. Это даже имеет версию dpkg!

Можно создать резервную копию файлов (если Вы хотите), и перезагрузка к продуктивной среде.

Я упоминаю busybox в основном, потому что, хотя Вы не сможете использовать его для получения полномочий пользователя root и восстановления libc.so.6, можно использовать его для резервного копирования любых файлов, которые Вы обеспокоены потерей перед перезагрузкой в продуктивную среду. Я очень сомневаюсь, что Вы потеряли бы что-либо, но так как Вы заинтересованы, можно хотеть использовать busybox для копирования любых важных файлов - как документы, Вы создали или изменили начиная со своего последнего резервного копирования - к другому местоположению.

Перезагрузка обычным способом не может стать очень далекой, потому что нормальные завершения работы на самом деле включают запущение динамично связанных программ, которые зависят от libc.so.6. Можно хотеть использовать Alt+SysRq+REISUB для перезагрузки безопасно. Это не идеальный способ закрыться, но это, вероятно, лучше, чем главным образом неэффективная попытка перезагрузить сопровождаемый жесткой перезагрузкой. Другая опция состояла бы в том, чтобы попытаться перезагрузить и затем попытаться использовать метод REISUB для взятия его остальная часть пути. (Если Вы хотите выключить машину вместо того, чтобы перезагрузить его, используйте REISUO вместо REISUB.)

Когда Вы действительно загрузитесь от продуктивной среды, переименовывание файла будет легко. Вы не должны chroot или сделайте что-либо полагает. Просто смонтируйте свою корневую файловую систему (который можно обычно делать одним щелчком в файловом браузере, хотя можно использовать mount управляйте, нравится ли Вам). Затем в терминале используйте mv или cp управляйте для восстановления libc.so.6. Вам будет нужно sudo, но это хорошо работает в продуктивной среде.

Я знаю, что Вы упомянули, что у Вас нет спасательного диска. Это было бы трудно, возможно, невозможно, для создания загрузочного живого USB в той системе, где Вы не можете запустить большинство программ. (Можно использовать busybox чтобы скопировать и переместить файлы, и это даже имеет a dd команда, но я не рекомендовал бы пытаться использовать его для этого. Обычно необходимо было бы смочь работать dd как базируются для создания живых медиа.), Возможно, кто-то предложит путь. Если у Вас есть другая машина, чтобы вставить жесткий диск, надо надеяться, можно создать его с той машиной. В противном случае Ваш лучший выбор может состоять в том, чтобы попросить, чтобы знакомство сделало тот.

Существует путь без живого CD/DVD/USB, но все еще необходимо перезагрузить.

Однако существует альтернатива начальной загрузке от внешних медиа 2, которые необходимо будет все еще перезагрузить, но Вам не нужна живая система. Я особенно не рекомендую это, поскольку это является громоздким; использование продуктивной среды легче. Можно сделать это без того, если Вы действительно хотите, все же.

Как Zanna ранее указал в комментариях, спасательный режим не будет работать, потому что для большинства программ нужно libc.6.so (например, /bin/bash, тому, которое обеспечивает оболочку, нужна она). Но можно загрузить систему с /bin/busybox sh как init путем передачи init=/bin/busybox sh как параметр загрузки к ядру в Личинке 3 Это - по существу та же техника как более общее init=/bin/sh (или init=/bin/bash) получить корневую оболочку, но с /bin/busybox sh вместо постоянного клиента /bin/sh, потому что /bin/sh динамично связан и требует libc.so.6.

Если Вы хотите сделать это этот путь, удержать клавишу сдвига влево, в то время как (ре), загружающее так меню начальной загрузки GRUB, появляется. (Если Сдвиг не работает, используйте Esc.) С клавишами со стрелками, выберите Расширенные настройки для Ubuntu и нажмите Enter. После этой точки Вы не нажмете Enter, потому что это обычно загружалось бы, а не с пользовательскими параметрами загрузки. Выберите любое ядро и нажмите e для редактирования его параметров загрузки временно. Если существует несколько строк, и Ваш курсор не находится на строке, которая запускается с linux, переместите его туда с клавишами со стрелками. Добавить init=/bin/busybox sh в конец той строки и нажимают F10 для начальной загрузки его.

Необходимо получить приглашение оболочки BusyBox. Необходимо будет повторно смонтировать корневое чтение-запись файловой системы и переименовать libc.so.6 таким образом, это имеет корректное имя, которое это раньше имело. Для достижения этого выполните эти команды в оболочке BusyBox (где другие читатели, которые имеют libc.so.6 в другом месте должен был бы корректироваться, имя каталога передало cd команда):

mount -o remount,rw /
cd /lib64
mv libc.so.6.bak libc.so.6

Затем я рекомендую, чтобы Вы затем синхронизировали любые кэшируемые записи к файловой системе, повторно смонтировали его только для чтения, и перезагрузка:

sync
mount -o remount,ro /
reboot -f

(Без -f, reboot команда не работает вообще в этой ситуации, поскольку никакой надлежащий init демон не работает.)


0 Для тех, кому интересно: когда те программы (как sudo) на самом деле выполните свою команду или создайте оболочку, поскольку корень или некоторый другой альтернативный пользователь, и Ваши реальные и эффективные идентификаторы пользователей установлены на того из целевого пользователя. Но когда Вы выполняете их, прежде чем они сделали это, в то время как они определяют, должны ли они позволить Вам выполнять действие, Вы попросили, их эффективный идентификатор пользователя является идентификатором пользователя корня, в то время как их идентификатор реального пользователя является все еще Вашим. Я упоминаю это для обращения к распространенному заблуждению о способе, как который реальные и эффективные идентификаторы пользователей работают в программах sudo; если Вы никогда не слышали о реальных и эффективных идентификаторах пользователей, не стесняйтесь игнорировать эту сноску.

1, Как упомянуто, busybox в Ubuntu статически связан и не полагается libc.so.6. Вы могли бы думать, что могли использовать это, чтобы не перезагружать, потому что busybox предложения a su команда. Однако это не помогает никому, потому что, поскольку это установлено, busybox не корень setuid. На самом деле работать, чтобы позволить некорневому пользователю становиться корнем, su должен быть корень setuid. Полезная функция busybox su должен позволить корню исполнять роль других пользователей, вместо того, чтобы позволять другим пользователям являться олицетворением корня.

2 Zanna, внесенные значительно этой процедуре и также, сделали все тестирование на него!

3 Это успешно выполняется при передаче sh кому: busybox даже при том, что Вы могли бы ожидать, что это будет интерпретировано как последующий параметр загрузки ядра. Включая кавычки препятствует тому, чтобы он работал. Обратите внимание также что, в Ubuntu, статически связанный busybox исполняемый файл просто называют busybox, нет busybox-static (хотя пакет, который обеспечивает его, называют busybox-static). Если Вы удалили статически связанный BusyBox и установили динамично связанный BusyBox, то этот метод не будет работать, но очень маловероятно, что Вы сделали это.

5
ответ дан 23 November 2019 в 06:35

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

Вы не можете использовать пароль root, потому что (путем переименования libc) Вы повредили все "нормальные" способы, которыми можно использовать его, включая вход в систему на a getty на другой текстовой консоли. Если бы у Вас были статически связанный su или sudo, то Вы могли бы использовать это для выполнения busybox mv, или (в общем случае получения рабочей корневой оболочки), использовать

LD_PRELOAD=whatever LD_LIBRARY_PATH=whatever static-su --preserve-environment передавать эту пользовательскую среду удару, работающему как корень

Сами двоичные файлы Setuid не могут доверять среде, предоставленной пользователем, выполняющим их, но (если они работают), может передать среду, если Вы запросили, и знать, что правильный пароль аутентифицирует ту операцию.

Но так как у Вас нет статического setuid двоичного файла, который может аутентифицировать Ваш запрос для передачи пользовательской среды процессу, работающему как root, необходимо просто использовать физический доступ к перезагрузке в среду, которая позволяет Вам изменить корневой FS, например, DVD или карту с интерфейсом USB, или загрузить Вашу регулярную систему с init=/bin/busybox sh (см. ответ @Eliah).

Если Вы не имеете заседания медиа восстановления, создаете что-то загрузочное на другом компьютере, с помощью или Ubuntu живое изображение или одного из нескольких загрузочных образов восстановления, которые подходят для восстановления различных Ose и выполнения аппаратной диагностики (вот обзор 5 различных). (Они часто меньше, чем живая Ubuntu, например, приведение в рабочее состояние только приблизительно 700 МБ на карте с интерфейсом USB.)

Можно настроить карту с интерфейсом USB, чтобы быть загрузочными с одним из них (или Ubuntu) в то время как все еще способность использовать его для нормального хранилища файлов; Вы не должны выделять целую карту с интерфейсом USB загружаемому образу. (Самые простые способы создать живую карту с интерфейсом USB сдуют предыдущее содержание и иногда даже не оставлять ее применимой для того, чтобы хранить файлы, все же.)


Другая опция состоит в том, чтобы заставить initramfs заскакивать в оболочку перед выполнением pivot_root и execing init= Вы передали командную строку ядра. Это не зависит ни от какого содержания самого корневого FS. У Вас не могло бы быть редактора вообще, но Вы действительно имеете cat и перенаправление, а также mv и ln. (cat > /mnt/root/etc/something). Если проблема, которую необходимо решить, нетривиальна, необходимо, вероятно, загрузить что-то более мощное!

Это происходит автоматически в некоторых случаях отказа при начальной загрузке, например, если обнаружение RAID перестало работать или что-то так, что корневая фс не монтируется во-первых (даже только для чтения). (Ubuntu 15.10 - "BusyBox встроенная оболочка (initramfs)" на каждой начальной загрузке)

Можно заставить его произойти с break=bottom на командной строке ядра для заскакивания в оболочку busybox в initramfs, после выполнения большей части материала (загружающий модули и монтирующий корневой FS, только для чтения), но прежде execing реальное init. break=premount остановки ранее; см. ту ссылку или /usr/share/initramfs-tools/init для получения дополнительной информации.

2
ответ дан 23 November 2019 в 06:35

Я решил эту проблему в elementary OS, создав загрузочный диск с версией elementary OS, которая у меня была, а затем загрузившись с него в режиме реального времени.

После загрузки liveusb я скопировал папку /lib в мою неисправную папку /lib elementary OS и объединил, сохранив последние файлы.

Мне это помогло. Надеюсь, это относится и к вам.

0
ответ дан 10 August 2020 в 20:02

Другие вопросы по тегам:

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