Apa urutan pencarian tautan dinamis Linux?

12

Ini bukan duplikat karena ini berurusan dengan kekhasan yang saya perhatikan ketika saya gunakan /etc/ld.so.conf.

Untuk mendapatkan jalur yang dicari oleh tautan dinamis untuk pustaka, saya menjalankan perintah ldconfig -v | grep -v "^"$'\t' | sed "s/:$//g". Ketika /etc/ld.so.conftidak memiliki jalur yang terdaftar di dalamnya. Output dari perintah sebelumnya adalah

/lib
/usr/lib

Saya pikir itu mencari /libpertama dan kemudian /usr/lib. Saat saya menambahkan jalur baru, seperti /usr/local/lib, ke /etc/ld.so.confdan kemudian membuat kembali /etc/ld.so.cache, output dari ldconfig -v | grep -v "^"$'\t' | sed "s/:$//g"menjadi

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

Saya menemukan ini aneh karena jika saya benar bahwa urutan direktori yang terdaftar dicari adalah dari atas ke bawah, maka direktori tambahan dicari sebelum /libdan /usr/lib. Direktori tambahan dicari sebelum direktori tepercaya tidak aneh dengan sendirinya, tetapi ketika /libdicari sebelumnya /usr/lib, itu aneh karena /bin& /sbindicari setelah /usr/bin& /usr/sbinmasuk PATH.

Bahkan jika jalur yang terdaftar oleh ldconfig -v | grep -Ev "^"$'\t' | sed "s/:$//g"dicari dari bawah ke atas, itu masih akan menjadi pemesanan miring karena direktori tambahan akan dicari setelah yang tepercaya sementara /libakan dicari setelah /usr/lib.

Jadi, bagaimana urutan ld.sopencarian jalur untuk perpustakaan? Mengapa /libdicari sebelumnya /usr/lib? Jika tidak, lalu mengapa direktori tambahan dicari /lib?

Melab
sumber

Jawaban:

15

Urutan ini didokumentasikan dalam manual tautan dinamis, yaitu ld.so. Ini:

  1. direktori dari LD_LIBRARY_PATH;
  2. direktori dari /etc/ld.so.conf;
  3. /lib;
  4. /usr/lib.

(Saya menyederhanakan sedikit, lihat manual untuk detail selengkapnya.)

Urutan masuk akal ketika Anda menganggap bahwa itu satu-satunya cara untuk mengganti pustaka di lokasi default dengan pustaka kustom. LD_LIBRARY_PATHadalah pengaturan pengguna, harus ada sebelum yang lain. /etc/ld.so.confadalah pengaturan lokal, ia datang sebelum default sistem operasi. Jadi sebagai pengguna, jika saya ingin menjalankan program dengan versi pustaka yang berbeda, saya dapat menjalankan program dengan LD_LIBRARY_PATHmemuat lokasi dari versi pustaka yang berbeda. Dan sebagai administrator, saya dapat menempatkan versi yang berbeda dari perpustakaan di /usr/local/libdan daftar /usr/local/libdi /etc/ld.so.conf.

Kepercayaan tidak masuk ke dalam ini. Direktori apa pun yang tercantum di jalur pencarian ini harus tepercaya, karena perpustakaan mana pun akhirnya dapat dimuat dari sana. Secara teori, Anda bisa mendaftar nama-nama perpustakaan yang digunakan oleh semua program "yang membutuhkan lebih banyak kepercayaan" pada sistem Anda dan memastikan bahwa semua perpustakaan ini ada di direktori "paling tepercaya", dan kemudian direktori "kurang tepercaya" tidak akan digunakan jika mereka datang setelah direktori yang lebih tepercaya di jalur pencarian, kecuali untuk program “yang membutuhkan lebih sedikit kepercayaan”. Tapi itu akan sangat rapuh. Itu juga akan sangat tidak berguna: jika seorang penyerang dapat menyuntikkan nilai LD_LIBRARY_PATHatau elemen /etc/ld.so.conf, mereka pasti memiliki rute yang lebih langsung untuk mengeksekusi kode arbitrer, seperti menyuntikkan nilai PATH, dariLD_PRELOAD, dll. Kepercayaan pada jalur pemuatan perpustakaan tidak masalah ketika eksekusi melewati batas kepercayaan, yaitu saat menjalankan program dengan hak istimewa tambahan (mis. program setuid / setgid, atau via sudo). Apa yang terjadi dalam kasus ini adalah yang LD_LIBRARY_PATHkosong.

Sedangkan untuk /libvs /usr/lib, tidak masalah banyak: mereka disediakan oleh entitas yang sama (sistem operasi) dan seharusnya tidak ada perpustakaan yang ada di keduanya. Masuk akal untuk mendaftar /libterlebih dahulu karena memberikan keunggulan kinerja (sangat kecil): perpustakaan yang paling sering digunakan, terutama perpustakaan yang digunakan oleh program dasar kecil (yang memuat waktu adalah fraksi yang lebih tinggi dari total waktu berjalan daripada besar, panjang Program -running), berlokasi di /lib.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Jika beberapa direktori terdaftar di LD_LIBRARY_PATH, urutan apa yang dicari?
argentum2f
@ argentum2f Dari kiri ke kanan, sama dengan PATH.
Gilles 'SO- stop being evil'