Der Grund, warum ich irgendwie root werden muss, ohne zu tippen, sudo
ist, weil
error while loading shared libraries: libc.so.6:
cannot open shared object file: No such file or directory
Früher hatte sudo
ichsudo mv /lib64/libc.so.6 /lib64/libc.so.6.bak
Weil ich einige Anweisungen befolgt habe, damit ich den symbolischen Link libc-12.4.so
anstelle des aktuellen libc-12.2.so
durch aktualisieren kann
LD_PRELOAD=./libc-2.14.so ln -s ./libc-2.14.so ./libc.so.6
Aber das funktioniert nicht mit sudo
. Jetzt habe ich Angst, mich bis zum Tod des Systems abzumelden oder neu zu starten. Weil ich Root-Berechtigung benötige, um dies zu beheben.
Ich habe keine Rettungsdiskette. Im schlimmsten Fall muss ich die Festplatte auf einem anderen Computer montieren und reparieren.
Bitte helfen Sie.
$ 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
command-line
sudo
glibc
Hao
quelle
quelle
sudo bash -c "LD_PRELOAD=./libc-2.14.so ln -s ./libc-2.14.so ./libc.so.6"
, wenn auf der gleichen PartitionLD_PRELOAD=./libc-2.14.so sudo LD_PRELOAD=./libc-2.14.so ln -s ./libc-2.14.so ./libc.so.6
(wobei die Vorspannungsvariable sowohl fürsudo
als auch eingestellt istln
)?Antworten:
Sie sollten einfach von einem Live-USB (oder CD / DVD) booten und wieder umbenennen
libc.so.6
.LD_PRELOAD
funktioniert nicht mit ausführbaren Dateien von setuid. Wenn Sie möchten, können Sie jedoch/bin/busybox
vor dem Neustart Last-Minute-Sicherungen durchführen (für die keine Befehle als Root ausgeführt werden müssen). Es ist möglich, dies ohne Live-USB / CD / DVD zu beheben, aber Sie müssen immer noch neu starten, und ich schlage vor, eine zu verwenden.LD_PRELOAD
funktioniert nicht mit setuid-Befehlen.Derzeit versuchen Sie,
sudo
die umbenannte gemeinsam genutzte Bibliothek durch Festlegen zu verwendenLD_PRELOAD
. Dies wird nicht funktionieren. Sie können nicht ändern, mit was gemeinsam genutzte Bibliothekensudo
verknüpft sindLD_PRELOAD
, und es funktioniert auch nicht mit einer der Alternativen zusudo
. Wenn Sie dies tun könnten , wäre dies ein äußerst schwerwiegender Sicherheitsfehler.Die Art und Weise
sudo
undpkexec
(undsu
) Arbeit zu ermöglichen es Ihnen, elevate Privilegien ist , dass die ausführbaren Dateien haben den setuid Bit Satz 0 , die bewirkt , dass sie als Benutzer ausgeführt werden , den sie besitzt, die für die ausführbaren Dateien ist der Root - Benutzer, anstatt die Benutzer , dass läuft sie tatsächlich. Wenn sie ausgeführt werden, überprüfen sie sehr sorgfältig, was Sie von ihnen verlangen. Auf diese Weise können Benutzer, sofern ihre Entwickler vorsichtig genug waren, nur Aktionen ausführen, zu deren Ausführung sie berechtigt sind.LD_PRELOAD
hat keine Auswirkung auf ausführbare Setuid-Dateien, die von anderen Benutzern als ihren Besitzern ausgeführt werden . Dies ist für die Sicherheit unbedingt erforderlich. Andernfallskönnte jeder seine eigene Bibliothek erstellen und ein Programm erzwingen, das es gernesudo
verwendet, und dann könnte jeder Root-Rechte erlangen. Sie könnenLD_PRELOAD
damit nicht-setuid-Programme ausführen, und root kann damit fast alles ausführen. Aber als Nicht-RootBenutzer, können Sie es nicht laufen verwenden Programme wiesudo
,pkexec
undsu
das sind setuid root.Wenn bereits eine Root-Shell ausgeführt wurde, müssen Sie nicht neu starten. Aber selbst wenn Sie das Root-Konto aktiviert haben - das heißt, selbst wenn Sie ein Kennwort dafür festgelegt haben, mit dem Sie sich mit einem Befehl wie
su
root als root anmelden können -, können Sie das Problem ohne Neustart nicht beheben . Zum Beispielsu
in Ubuntu erfordertlibc.so.6
und ist auch setuid root, soLD_PRELOAD
wird auch nicht damit funktionieren. 1 (Siehe auch Peter Cordes ‚s Kommentare .)Das Problem hierbei ist, dass die verfügbaren Mechanismen zum Ausführen von Aktionen als Root erfordern, dass Sie ausführbare setuid-Dateien ausführen, die root gehören, aber
LD_PRELOAD
in dieser Situation keine Auswirkungen haben. Wenn Sie keine Aktionen als root ausführen müssten oder wenn Sie bereits eine Root-Shell geöffnet hätten, könnten Sie diese problemlos ohne Neustart und auch ohne Verwendung umbenennenLD_PRELOAD
. Dies liegt daran, dass Ubuntu-Systeme/bin/busybox
statisch verknüpft sind. Damit können Sie viele der gängigen * nix-Tools ausführen , einschließlich der Befehlemv
undcp
. Sie können ausführen oder nur ausführen , um eine Shell zu erhalten, in der Sie die Befehle ausführen können. Lauf/bin/busybox mv source destination
/bin/busybox sh
/bin/busybox
ohne Argumente, um eine Liste der unterstützten Befehle zu erhalten. Es hat sogar eine Version vondpkg
!Sie können Dateien sichern (wenn Sie möchten) und in einer Live-Umgebung neu starten.
Ich erwähne dies
busybox
hauptsächlich, weil Sie es zwar nicht verwenden können, um Root-Rechte zu erlangen und wiederherzustellenlibc.so.6
, aber Sie können damit alle Dateien sichern , die Sie verlieren möchten, bevor Sie in einer Live-Umgebung neu starten. Ich bezweifle sehr , Sie würden nichts verlieren , aber da Sie besorgt sind, können Sie verwenden möchtenbusybox
alle wichtigen Dateien zu kopieren - wie Dokumente , die Sie haben , seit der letzten Sicherung erstellt oder geändert - an einen anderen Ort.Ein Neustart auf die übliche Weise kann nicht sehr weit kommen, da beim normalen Herunterfahren tatsächlich dynamisch verknüpfte Programme ausgeführt werden, die davon abhängen
libc.so.6
. Möglicherweise möchten Sie verwenden Alt+ SysRq+REISUB zu sicher Neustart . Dies ist kein idealer Weg zum Herunterfahren, aber wahrscheinlich besser als ein meist ineffektiver Neustartversuch, gefolgt von einem Hard-Reset. Eine andere Möglichkeit wäre, einen Neustart zu versuchen und dann zu versuchen, die REISUB-Methode zu verwenden, um den Rest des Weges fortzusetzen. (Wenn Sie den Computer ausschalten möchten, anstatt ihn neu zu starten, verwenden Sie REISU O anstelle von REISU B. )Wenn Sie von einer Live-Umgebung aus starten, ist das Umbenennen der Datei einfach. Sie müssen
chroot
oder tun nichts Besonderes. Mounten Sie einfach Ihr Root-Dateisystem (was Sie normalerweise mit einem Klick im Dateibrowser tun können, obwohl Sie denmount
Befehl verwenden können, wenn Sie möchten). Verwenden Sie dann in einem Terminal den Befehlmv
odercp
zum Wiederherstellenlibc.so.6
. Sie brauchensudo
, aber das funktioniert gut in einer Live-Umgebung.Ich weiß, dass Sie erwähnt haben, dass Sie keine Rettungsdiskette haben. Es wäre schwierig, vielleicht unmöglich, einen bootfähigen Live-USB auf diesem System zu erstellen, auf dem Sie die meisten Programme nicht ausführen können. (Sie können
busybox
Dateien kopieren und verschieben, und es gibt sogar einendd
Befehl, aber ich würde nicht empfehlen, ihn dafür zu verwenden. Normalerweise müssten Siedd
als Root ausgeführt werden können, um Live-Medien zu erstellen.) Vielleicht wird es jemand tun einen Weg vorschlagen. Wenn Sie einen anderen Computer zum Einlegen der Festplatte haben, können Sie ihn hoffentlich mit diesem Computer erstellen. Wenn nicht, können Sie am besten einen Bekannten bitten, einen zu machen.Es gibt einen Weg ohne Live-CD / DVD / USB, aber Sie müssen immer noch neu starten.
Es gibt jedoch eine Alternative zum Booten von externen Medien. 2 Sie müssen noch neu starten, benötigen jedoch kein Live-System. Ich empfehle dies nicht besonders, da es umständlich ist; Die Verwendung einer Live-Umgebung ist einfacher. Sie können es aber auch ohne machen, wenn Sie es wirklich wollen.
Wie Zanna zuvor in Kommentaren betont hatte, würde der Rettungsmodus nicht funktionieren, da die meisten Programme dies benötigen
libc.6.so
(z. B. das/bin/bash
, was die Shell bereitstellt, benötigt). Sie können das System jedoch mit/bin/busybox sh
as initinit=/bin/busybox sh
booten, indem Sie es als Boot-Option an den Kernel in GRUB übergeben. 3 Dies ist im Wesentlichen die gleiche Technik wie die üblichereinit=/bin/sh
(oderinit=/bin/bash
), um eine Root-Shell zu erhalten, jedoch mit/bin/busybox sh
anstelle der regulären/bin/sh
, da sie/bin/sh
dynamisch verknüpft ist und erfordertlibc.so.6
.Wenn Sie dies auf diese Weise tun möchten, halten Sie Shiftbeim (erneuten) Booten die linke Taste gedrückt, damit das GRUB-Startmenü angezeigt wird. (Wenn Shiftdies nicht funktioniert, verwenden Sie Esc.) Wählen Sie mit den Pfeiltasten Erweiterte Optionen für Ubuntu aus und drücken Sie die Eingabetaste. Nach diesem Punkt werden Sie nicht mehr drücken, Enterda dies normalerweise und nicht mit benutzerdefinierten Startoptionen gestartet wird. Wählen Sie einen beliebigen Kernel aus und drücken Sie e, um die Startoptionen vorübergehend zu bearbeiten. Wenn mehrere Zeilen vorhanden sind und sich der Cursor nicht in der Zeile befindet, mit der begonnen wird
linux
, bewegen Sie ihn mit den Pfeiltasten dorthin. Fügen Sieinit=/bin/busybox sh
am Ende dieser Zeile hinzu und drücken Sie F10, um sie zu starten.Sie sollten eine BusyBox-Shell-Eingabeaufforderung erhalten. Sie müssen das Root-Dateisystem erneut schreiben und umbenennen,
libc.so.6
damit es den richtigen Namen hat, den es früher hatte. Führen Sie dazu die folgenden Befehle in der BusyBox-Shell aus (wo andere Leserlibc.so.6
an einem anderen Speicherort den an dencd
Befehl übergebenen Verzeichnisnamen anpassen müssten ):Dann empfehle ich Ihnen, alle zwischengespeicherten Schreibvorgänge mit dem Dateisystem zu synchronisieren, sie schreibgeschützt erneut bereitzustellen und neu zu starten:
(Ohne funktioniert
-f
derreboot
Befehl in dieser Situation überhaupt nicht, da kein richtiger Init-Daemon ausgeführt wird.)0 Für diejenigen, die interessiert sind: Wenn diese Programme (wie
sudo
) Ihren Befehl tatsächlich ausführen oder eine Shell als Root oder ein anderer alternativer Benutzer erstellen, werden sowohl Ihre realen als auch Ihre effektiven Benutzer-IDs auf die des Zielbenutzers festgelegt. Wenn Sie sie jedoch ausführen, bevor sie dies getan haben, während sie festlegen, ob Sie die von Ihnen angeforderte Aktion ausführen sollen, ist ihre effektive Benutzer-ID die von root, während ihre tatsächliche Benutzer-ID noch Ihre ist. Ich erwähne dies, um ein weit verbreitetes Missverständnis über die Funktionsweise realer und effektiver Benutzer-IDs in Programmen wie zsudo
. Wenn Sie noch nie von echten und effektiven Benutzer-IDs gehört haben, können Sie diese Fußnote ignorieren.1 Wie bereits erwähnt, ist
busybox
Ubuntu statisch verknüpft und nicht abhängiglibc.so.6
. Sie könnten denken, Sie könnten dies verwenden, um einen Neustart zu vermeiden, dabusybox
einsu
Befehl angeboten wird. Dies hilft jedoch keinem, da es bei der Installationbusybox
kein Setuid-Root ist. Um tatsächlich zu arbeiten, damit ein Nicht-Root-Benutzer root werden kann,su
muss root festgelegt werden. Die nützliche Funktion vonbusybox su
besteht darin, root zu erlauben , sich als andere Benutzer auszugeben, anstatt anderen Benutzern zu erlauben, sich als root auszugeben.2 Zanna hat viel zu diesem Verfahren beigetragen und auch alle Tests dafür durchgeführt!
3 Dies ist erfolgreich
sh
,busybox
obwohl Sie möglicherweise erwarten, dass es als nachfolgende Kernel-Startoption interpretiert wird. Das Einfügen von Anführungszeichen verhindert, dass es funktioniert. Beachten Sie auch , dass in Ubuntu, die statisch gelinktebusybox
ausführbare Datei ist nur genanntbusybox
, nichtbusybox-static
(obwohl das Paket , das es ermöglicht wird genanntbusybox-static
). Wenn Sie die statisch verknüpfte BusyBox deinstalliert und die dynamisch verknüpfte BusyBox installiert haben, funktioniert diese Methode nicht, aber es ist sehr unwahrscheinlich, dass Sie dies getan haben.quelle
su
ist auch setuid root, wiesudo
undpkexec
, und unterliegt den gleichenLD_PRELOAD
Einschränkungen wie sie. Mir fällt jedoch ein, dass Sie ohne CD / DVD / USB, obwohl der beste Ansatz wahrscheinlich immer noch darin besteht, eine zu erwerben, diese wahrscheinlich durch Booteninit=/bin/busybox sh
als Kernel-Option in GRUB lösen könnten . Das erfordert natürlich noch einen Neustart. Ich werde versuchen, etwas darüber hinzuzufügen. Wenn ich falsch verstanden habe, was Sie gesagt haben, und Sie es noch nicht behoben haben und die Informationen zum Bootenbusybox sh
jetzt haben möchten , lassen Sie es mich bitte wissen, und ich kann versuchen, etwas darüber hinzuzufügen, bevor ich afk gehe.getty
anderen Textkonsole. Wenn Sie eine statisch verknüpftesu
oder hattensudo
, können SieLD_PRELOAD=whatever LD_LIBRARY_PATH=whatever static-su --preserve-environment
diese benutzerdefinierte Umgebung an einebash
als Root ausgeführte Umgebung weitergeben . Wenn Sie dies nicht tun, sollten Sie einfach Ihren physischen Zugriff auf den Computer verwenden, um im Wiederherstellungsmodus (im normalen GRUB-Menü) oder von einer DVD oder einem USB-Stick zu starten./
startet nur lesbar, sondernbusybox
hatmount
und Remonrw
funktioniert. Es kann geschrieben, synchronisiert (Busybox hatsync
), wieder montiert werden,ro
wenn man möchte, und obwohl Busyboxreboot
ohne Optionen eingebaut ist , funktioniert es hier nicht, da es keinen richtigen Init gibtreboot -f
. Dies ist übrigens einer der Gründe, warum ich so lange brauche, um meine Bearbeitung durchzuführen. Ich spreche mit Zanna, die das testet. Ich habe im Moment keine Möglichkeit, bequem zu testen, aber ich möchte meine Antwort erweitern, da ich sonst möglicherweise eine Weile nicht darauf zugreifen kann. Die Tests sind größtenteils, aber noch nicht vollständig abgeschlossen.Sie können das Root-Passwort nicht verwenden, da Sie (durch Umbenennen von libc) alle "normalen" Verwendungsmöglichkeiten verletzt haben, einschließlich der Anmeldung an einer
getty
anderen Textkonsole. Wenn Sie ein statisch verknüpftes su oder sudo hatten , können Sie dieses zum Ausführenbusybox mv
oder (im allgemeinen Fall des Erhaltens einer funktionierenden Root-Shell) verwendenLD_PRELOAD=whatever LD_LIBRARY_PATH=whatever static-su --preserve-environment
um diese benutzerdefinierte Umgebung an eine Bash weiterzuleiten, die als root ausgeführt wirdSetuid-Binärdateien selbst können der Umgebung, die von einem Benutzer bereitgestellt wird, der sie ausführt, nicht vertrauen, können jedoch (sofern sie funktionieren) die Umgebung weitergeben, wenn Sie dies angefordert haben, und Sie kennen das richtige Kennwort zur Authentifizierung dieses Vorgangs.
Da Sie jedoch keine statische Setuid-Binärdatei haben, die Ihre Anforderung authentifizieren kann, eine benutzerdefinierte Umgebung an einen Prozess zu übergeben, der ausgeführt wird
root
, sollten Sie nur Ihren physischen Zugriff verwenden, um einen Neustart in einer Umgebung durchzuführen, in der Sie den Root-FS ändern können. zB eine DVD oder einen USB-Stick oder booten Sie Ihr reguläres System mitinit=/bin/busybox sh
(siehe @ Eliahs Antwort).Wenn Sie keine Wiederherstellungsmedien haben, erstellen Sie etwas Bootfähiges auf einem anderen Computer, indem Sie entweder ein Ubuntu-Live-Image oder eines von mehreren Recovery-Boot-Images verwenden, die zum Reparieren verschiedener Betriebssysteme und zum Ausführen der Hardwarediagnose geeignet sind ( hier eine Übersicht über 5 verschiedene diejenigen ). (Diese sind oft kleiner als ein Live-Ubuntu, z. B. nehmen sie nur etwa 700 MB auf einem USB-Stick auf.)
Sie können einen USB-Stick so einrichten, dass er mit einem dieser Sticks (oder Ubuntu) bootfähig ist, während Sie ihn weiterhin für die normale Dateispeicherung verwenden können. Sie müssen nicht einen ganzen USB-Stick für ein bootfähiges Image reservieren. (Die einfachste Möglichkeit, einen Live-USB-Stick zu erstellen, führt dazu, dass der vorherige Inhalt weggeblasen wird und manchmal sogar nicht zum Speichern von Dateien verwendet werden kann.)
Eine andere Möglichkeit besteht darin, die initramfs in eine Shell zu verschieben, bevor Sie das
pivot_root
ausführen und ausführen, wasinit=
Sie über die Kernel-Befehlszeile übergeben haben. Dies hängt nicht vom Inhalt des Root-FS selbst ab. Möglicherweise haben Sie überhaupt keinen Editor, aber Sie haben einecat
Umleitung sowie mv und ln. (cat > /mnt/root/etc/something
). Wenn das Problem, das Sie beheben müssen, nicht trivial ist, sollten Sie wahrscheinlich etwas Stärkeres booten!Dies geschieht automatisch in einigen Fällen von Startfehlern, z. B. wenn die RAID-Erkennung fehlschlägt oder etwas, sodass die Root-Fs überhaupt nicht gemountet werden (sogar schreibgeschützt). ( Ubuntu 15.10 - "BusyBox integrierte Shell (initramfs)" bei jedem Start )
Sie können es mit
break=bottom
der Kernel-Befehlszeile geschehen lassen, in die Busybox-Shell in den Initramfs zu gelangen, nachdem Sie die meisten Dinge erledigt haben (Module laden und den Root-FS schreibgeschützt mounten), aber bevor Sie den Real ausführeninit
.break=premount
stoppt früher; Siehe diesen Link oder/usr/share/initramfs-tools/init
für weitere Details.quelle