In welcher Reihenfolge durchsucht der dynamische Linker von Linux die Pfade?

In welcher Reihenfolge durchsucht der dynamische Linker von Linux die Pfade?

Dies ist kein Duplikat, da es sich hier um eine Besonderheit handelt, die mir bei der Verwendung aufgefallen ist /etc/ld.so.conf.

Um die Pfade zu erhalten, in denen der dynamische Linker nach Bibliotheken sucht, führe ich den Befehl aus ldconfig -v | grep -v "^"$'\t' | sed "s/:$//g". Wenn /etc/ld.so.confdarin keine Pfade aufgelistet sind. Die Ausgabe des vorherigen Befehls lautet

/lib
/usr/lib

Ich dachte, dass /libzuerst gesucht wird und dann /usr/lib. Wenn ich einen neuen Pfad hinzufüge, z. B. /usr/local/lib, zu /etc/ld.so.confund dann neu erstellen , wird /etc/ld.so.cachedie Ausgabe vonldconfig -v | grep -v "^"$'\t' | sed "s/:$//g"

/usr/local/lib
/lib
/usr/lib

Ich finde das merkwürdig, denn wenn ich damit richtig liege, dass die aufgelisteten Verzeichnisse in der Reihenfolge von oben nach unten durchsucht werden, dann werden zusätzliche Verzeichnisse vor /libund durchsucht /usr/lib. Dass die zusätzlichen Verzeichnisse vor den vertrauenswürdigen Verzeichnissen durchsucht werden, ist an sich nicht merkwürdig, aber wenn /libvor durchsucht wird /usr/lib, ist das merkwürdig, weil /bin& nach & in /sbindurchsucht werden ./usr/bin/usr/sbinPATH

Selbst wenn die von aufgelisteten Pfade ldconfig -v | grep -Ev "^"$'\t' | sed "s/:$//g"von unten nach oben durchsucht würden, wäre die Reihenfolge dennoch schief, weil nach den vertrauenswürdigen Verzeichnissen nach weiteren Verzeichnissen gesucht würde, während /libnach durchsucht würde /usr/lib.

In welcher Reihenfolge werden also die ld.soPfade nach Bibliotheken durchsucht? Warum wird /libvor durchsucht /usr/lib? Wenn nicht, warum werden dann nach durchsucht /lib?

Antwort1

Die Reihenfolge ist im Handbuch des dynamischen Linkers dokumentiert.ld.so. Es ist:

  1. Verzeichnisse von LD_LIBRARY_PATH;
  2. Verzeichnisse von /etc/ld.so.conf;
  3. /lib;
  4. /usr/lib.

(Ich vereinfache es ein wenig, alle Einzelheiten finden Sie im Handbuch.)

Die Reihenfolge ist sinnvoll, wenn man bedenkt, dass dies die einzige Möglichkeit ist, eine Bibliothek an einem Standardspeicherort durch eine benutzerdefinierte Bibliothek zu überschreiben. LD_LIBRARY_PATHist eine Benutzereinstellung, muss sie vor den anderen stehen. /etc/ld.so.confist eine lokale Einstellung, steht sie vor der Betriebssystem-Standardeinstellung. Wenn ich als Benutzer also ein Programm mit einer anderen Version einer Bibliothek ausführen möchte, kann ich das Programm mit dem Speicherort dieser anderen Bibliotheksversion ausführen . Und als Administrator kann ich eine andere Version der Bibliothek in und eine Liste LD_LIBRARY_PATHeinfügen ./usr/local/lib/usr/local/lib/etc/ld.so.conf

Vertrauen spielt hierbei keine Rolle. Jedes in diesem Suchpfad aufgeführte Verzeichnis muss vertrauenswürdig sein, da jede Bibliothek von dort geladen werden könnte. Theoretisch könnten Sie die Bibliotheksnamen auflisten, die von allen Programmen auf Ihrem System verwendet werden, „die mehr Vertrauen erfordern“, und sicherstellen, dass alle diese Bibliotheken in den „vertrauenswürdigsten“ Verzeichnissen vorhanden sind. Dann würden die „weniger vertrauenswürdigen“ Verzeichnisse nicht verwendet, wenn sie im Suchpfad nach den vertrauenswürdigeren Verzeichnissen kämen, mit Ausnahme der Programme, „die weniger Vertrauen erfordern“. Aber das wäre äußerst fragil. Es wäre auch ziemlich sinnlos: Wenn ein Angreifer einen Wert von LD_LIBRARY_PATHoder ein Element von einfügen kann /etc/ld.so.conf, hat er sicherlich einen direkteren Weg, beliebigen Code auszuführen, wie etwa das Einfügen eines Werts von PATH, von LD_PRELOADusw. Vertrauen in den Ladepfad der Bibliothek ist wichtig, wenn die Ausführung eine Vertrauensgrenze überschreitet, d. h. wenn ein Programm mit zusätzlichen Berechtigungen ausgeführt wird (z. B. ein Setuid-/Setgid-Programm oder über sudo). In diesem Fall wird LD_LIBRARY_PATHausgeblendet.

Was /libvs betrifft /usr/lib, spielt es keine große Rolle: Sie werden von derselben Entität (dem Betriebssystem) bereitgestellt und es sollte keine Bibliothek geben, die in beiden vorhanden ist. Es ist sinnvoll, /libzuerst aufzulisten, da dies einen (sehr kleinen) Leistungsvorteil bietet: Die am häufigsten verwendeten Bibliotheken, insbesondere die von kleinen Basisprogrammen verwendeten Bibliotheken (bei denen die Ladezeit einen größeren Anteil der Gesamtlaufzeit ausmacht als bei großen, lang laufenden Programmen), befinden sich in /lib.

verwandte Informationen