Wie kann ich eine fehlende / umbenannte libc.so.6 beheben?


8

Der Grund, warum ich irgendwie root werden muss, ohne zu tippen, sudoist, weil

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

Früher hatte sudoichsudo mv /lib64/libc.so.6 /lib64/libc.so.6.bak

Weil ich einige Anweisungen befolgt habe, damit ich den symbolischen Link libc-12.4.soanstelle des aktuellen libc-12.2.sodurch 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

Verwenden Sie sudo bash -c "LD_PRELOAD=./libc-2.14.so ln -s ./libc-2.14.so ./libc.so.6", wenn auf der gleichen Partition
George Udosen

Haben Sie es versucht LD_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ür sudoals auch eingestellt ist ln)?
Byte Commander

danke für die Antwort. funktioniert nicht. Ich kann jetzt nichts tun, wie ein einfacher Befehl wie ls ohne libc.so.6, der zurück zu seinem ursprünglichen Standort verschoben wurde ...
Hao

Antworten:


6

Sie sollten einfach von einem Live-USB (oder CD / DVD) booten und wieder umbenennen libc.so.6.

LD_PRELOADfunktioniert nicht mit ausführbaren Dateien von setuid. Wenn Sie möchten, können Sie jedoch /bin/busyboxvor 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, sudodie umbenannte gemeinsam genutzte Bibliothek durch Festlegen zu verwenden LD_PRELOAD. Dies wird nicht funktionieren. Sie können nicht ändern, mit was gemeinsam genutzte Bibliotheken sudoverknüpft sind LD_PRELOAD, und es funktioniert auch nicht mit einer der Alternativen zu sudo. Wenn Sie dies tun könnten , wäre dies ein äußerst schwerwiegender Sicherheitsfehler.

Die Art und Weise sudound pkexec(und su) 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_PRELOADhat 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 gernesudoverwendet, und dann könnte jeder Root-Rechte erlangen. Sie könnenLD_PRELOADdamit 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,pkexecundsudas 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 suroot als root anmelden können -, können Sie das Problem ohne Neustart nicht beheben . Zum Beispiel suin Ubuntu erfordert libc.so.6und ist auch setuid root, so LD_PRELOADwird 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_PRELOADin 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 umbenennen LD_PRELOAD. Dies liegt daran, dass Ubuntu-Systeme /bin/busyboxstatisch verknüpft sind. Damit können Sie viele der gängigen * nix-Tools ausführen , einschließlich der Befehle mvund cp. 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/busyboxohne Argumente, um eine Liste der unterstützten Befehle zu erhalten. Es hat sogar eine Version von dpkg!

Sie können Dateien sichern (wenn Sie möchten) und in einer Live-Umgebung neu starten.

Ich erwähne dies busyboxhauptsächlich, weil Sie es zwar nicht verwenden können, um Root-Rechte zu erlangen und wiederherzustellen libc.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öchten busyboxalle 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 chrootoder tun nichts Besonderes. Mounten Sie einfach Ihr Root-Dateisystem (was Sie normalerweise mit einem Klick im Dateibrowser tun können, obwohl Sie den mountBefehl verwenden können, wenn Sie möchten). Verwenden Sie dann in einem Terminal den Befehl mvoder cpzum Wiederherstellen libc.so.6. Sie brauchen sudo, 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 busyboxDateien kopieren und verschieben, und es gibt sogar einen ddBefehl, aber ich würde nicht empfehlen, ihn dafür zu verwenden. Normalerweise müssten Sie ddals 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 shas 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 üblichere init=/bin/sh(oder init=/bin/bash), um eine Root-Shell zu erhalten, jedoch mit /bin/busybox shanstelle der regulären /bin/sh, da sie /bin/shdynamisch verknüpft ist und erfordert libc.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 Sie init=/bin/busybox sham 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.6damit es den richtigen Namen hat, den es früher hatte. Führen Sie dazu die folgenden Befehle in der BusyBox-Shell aus (wo andere Leser libc.so.6an einem anderen Speicherort den an den cdBefehl übergebenen Verzeichnisnamen anpassen müssten ):

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

Dann empfehle ich Ihnen, alle zwischengespeicherten Schreibvorgänge mit dem Dateisystem zu synchronisieren, sie schreibgeschützt erneut bereitzustellen und neu zu starten:

sync
mount -o remount,ro /
reboot -f

(Ohne funktioniert -fder rebootBefehl 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 z sudo. 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 busyboxUbuntu statisch verknüpft und nicht abhängig libc.so.6. Sie könnten denken, Sie könnten dies verwenden, um einen Neustart zu vermeiden, da busyboxein suBefehl angeboten wird. Dies hilft jedoch keinem, da es bei der Installation busyboxkein 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 von busybox subesteht 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, busyboxobwohl 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 gelinkte busyboxausführbare Datei ist nur genannt busybox, nicht busybox-static (obwohl das Paket , das es ermöglicht wird genannt busybox-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.


Danke für Ihre Antwort. Ich kenne nur das Root-Passwort, also sollte es eine Möglichkeit geben, eine Root-Shell zu öffnen, aber anscheinend kann ich das nicht. Ich habe genau das getan, was Sie beantwortet haben, um es per DVD zu beheben.
Hao

3
@Hao suist auch setuid root, wie sudound pkexec, und unterliegt den gleichen LD_PRELOADEinschrä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 Booten init=/bin/busybox shals 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 Booten busybox shjetzt haben möchten , lassen Sie es mich bitte wissen, und ich kann versuchen, etwas darüber hinzuzufügen, bevor ich afk gehe.
Eliah Kagan

@Hao: 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 gettyanderen Textkonsole. Wenn Sie eine statisch verknüpfte suoder hattensudo , können Sie LD_PRELOAD=whatever LD_LIBRARY_PATH=whatever static-su --preserve-environmentdiese benutzerdefinierte Umgebung an eine bashals 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.
Peter Cordes

2
@PeterCordes Ja, /startet nur lesbar, sondern busyboxhat mountund Remon rwfunktioniert. Es kann geschrieben, synchronisiert (Busybox hat sync), wieder montiert werden, rowenn man möchte, und obwohl Busybox rebootohne Optionen eingebaut ist , funktioniert es hier nicht, da es keinen richtigen Init gibt reboot -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.
Eliah Kagan

1
Hat eine Antwort gepostet. Ich habe nicht versucht, dies gründlich zu testen. Ihre Antwort sollte die Anlaufstelle für Leute sein, die ein Rezept benötigen. Ich wollte meine nur als eine Übersicht über einige andere Dinge, die möglich und interessant sind, sich dessen bewusst zu sein.
Peter Cordes

3

Ich kenne das Root-Passwort, daher sollte es eine Möglichkeit geben, eine Root-Shell zu öffnen, aber anscheinend kann ich das nicht.

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 gettyanderen Textkonsole. Wenn Sie ein statisch verknüpftes su oder sudo hatten , können Sie dieses zum Ausführen busybox mvoder (im allgemeinen Fall des Erhaltens einer funktionierenden Root-Shell) verwenden

LD_PRELOAD=whatever LD_LIBRARY_PATH=whatever static-su --preserve-environment um diese benutzerdefinierte Umgebung an eine Bash weiterzuleiten, die als root ausgeführt wird

Setuid-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 wirdroot , 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 mit init=/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_rootausführen und ausführen, was init=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 eine catUmleitung 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=bottomder 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=premountstoppt früher; Siehe diesen Link oder/usr/share/initramfs-tools/initfür weitere Details.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.