In welcher Reihenfolge sucht der dynamische Linker von Linux nach Pfaden?

11

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

Um die Pfade abzurufen, in denen der dynamische Linker nach Bibliotheken sucht, führe ich den Befehl aus ldconfig -v | grep -v "^"$'\t' | sed "s/:$//g". Wann /etc/ld.so.confsind keine Pfade aufgeführt. Die Ausgabe des vorherigen Befehls ist

/lib
/usr/lib

Ich dachte mir, dass es /libzuerst und dann sucht /usr/lib. Wenn ich einen neuen Pfad hinzufügen, wie /usr/local/lib, zu /etc/ld.so.confund dann Remake /etc/ld.so.cachevom Ausgang ldconfig -v | grep -v "^"$'\t' | sed "s/:$//g"wird

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

Ich finde das seltsam, denn wenn ich richtig bin, dass die Reihenfolge, in der die aufgelisteten Verzeichnisse durchsucht werden, von oben nach unten ist, 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 seltsam, aber wenn /libvorher gesucht /usr/libwird, ist das seltsam, weil /bin& /sbinnach /usr/bin& /usr/sbinin gesucht werden PATH.

Selbst wenn die von aufgelisteten Pfade ldconfig -v | grep -Ev "^"$'\t' | sed "s/:$//g"von unten nach oben durchsucht würden, wäre dies immer noch eine verzerrte Reihenfolge, da zusätzliche Verzeichnisse nach den vertrauenswürdigen /libdurchsucht würden , während danach gesucht würde /usr/lib.

In welcher Reihenfolge werden ld.soPfade nach Bibliotheken durchsucht? Warum wird /libvorher gesucht /usr/lib? Wenn nicht, warum werden dann zusätzliche Verzeichnisse gesucht /lib?

Melab
quelle

Antworten:

13

Die Bestellung 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 ein wenig, siehe das Handbuch für die vollständigen Details.)

Die Reihenfolge ist sinnvoll, wenn Sie bedenken, dass dies die einzige Möglichkeit ist, eine Bibliothek an einem Standardspeicherort mit einer benutzerdefinierten Bibliothek zu überschreiben. LD_LIBRARY_PATHist eine Benutzereinstellung, muss sie vor den anderen kommen. /etc/ld.so.confist eine lokale Einstellung, sie kommt vor der Standardeinstellung des Betriebssystems. Wenn ich als Benutzer ein Programm mit einer anderen Version einer Bibliothek ausführen möchte, kann ich das Programm so ausführen LD_LIBRARY_PATH, dass es den Speicherort dieser anderen Bibliotheksversion enthält. Und als Administrator, kann ich eine andere Version der Bibliothek in setzen /usr/local/libund Liste /usr/local/libin /etc/ld.so.conf.

Vertrauen geht hier nicht ein. Jedes Verzeichnis, das in diesem Suchpfad aufgeführt ist, muss vertrauenswürdig sein, da jede Bibliothek von dort geladen werden kann. Theoretisch könnten Sie die Bibliotheksnamen auflisten, die von allen Programmen verwendet werden, die "mehr Vertrauen" auf Ihrem System erfordern, und sicherstellen, dass alle diese Bibliotheken in den "vertrauenswürdigsten" Verzeichnissen vorhanden sind und die "weniger vertrauenswürdigen" Verzeichnisse dann nicht verwendet werden, wenn sie nach den vertrauenswürdigeren Verzeichnissen im Suchpfad kommen, mit Ausnahme der Programme, die "weniger Vertrauen erfordern". Aber das wäre extrem zerbrechlich. Es wäre auch ziemlich sinnlos: Wenn ein Angreifer einen Wert von LD_LIBRARY_PATHoder ein Element von /etc/ld.so.confeinfügen kann, hat er sicherlich einen direkteren Weg, um beliebigen Code auszuführen, z. B. einen Wert von PATH, vonLD_PRELOADusw. Das Vertrauen in den Ladepfad der Bibliothek spielt eine Rolle, wenn die Ausführung eine Vertrauensgrenze überschreitet, dh wenn ein Programm mit zusätzlichen Berechtigungen ausgeführt wird (z. B. setuid / setgid-Programm oder via sudo). In diesem Fall wird das LD_LIBRARY_PATHausgeblendet.

Für /libvs /usr/libspielt 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 Bibliotheken, die von kleinen Basisprogrammen verwendet werden (für die die Ladezeit einen höheren Anteil an der Gesamtlaufzeit ausmacht als für große, lange -Laufprogramm), befinden sich in /lib.

Gilles 'SO - hör auf böse zu sein'
quelle
Wenn in LD_LIBRARY_PATH mehrere Verzeichnisse aufgeführt sind, in welcher Reihenfolge werden sie durchsucht?
argentum2f
@ argentum2f Von links nach rechts, wie PATH.
Gilles 'SO - hör auf böse zu sein'