Penjara klasik baru dalam foto – bahkan klasik perlu diubah

Ubuntu


Sebagai bagian dari desain dasar berbasis keamanan, SNAP harus dijalankan secara terpisah dari infrastruktur. Dalam kebanyakan kasus, ide ini bekerja dengan baik, dan akses granular ke sumber daya sistem menggunakan mekanisme antarmuka memungkinkan pengembang SNAP untuk mengirimkan aplikasi paket mereka dengan batasan ketat.

Namun, ada beberapa skenario di mana bahkan penggunaan gratis plugin antarmuka tidak dapat sepenuhnya memenuhi semua kebutuhan aplikasi dari aplikasi tertentu. Beberapa aplikasi memerlukan akses seluruh sistem ke direktori dan file, sementara yang lain mungkin memerlukan binari arbitrer untuk dieksekusi sebagai bagian dari eksekusi mereka. Untuk tujuan ini, SNAP juga dapat diinstal dalam mode enklosur “Klasik”, yang memberi mereka akses yang sama yang akan tersedia jika aplikasi diinstal dengan cara tradisional. Solusinya berhasil, tetapi sekarang, ada saran untuk membuat mode klasik lebih kuat dan lebih efisien.

Masalah dengan enklosur klasik adalah bahwa hal itu menghilangkan beberapa prediktabilitas yang ada dalam gambar yang sangat terbatas. Sementara SNAP diharapkan untuk berperilaku sama pada semua sistem yang didukung, SNAP klasik dapat mengandalkan pustaka host untuk dijalankan, atau mereka mungkin menganggap bahwa pustaka tertentu (dan/atau versi tertentu) ada. Hal ini dapat menyebabkan potensi konflik dalam cara program dimuat dan dijalankan.

Agar dapat berjalan dengan benar, paket SNAP yang terbatas biasanya memerlukan file dinamis yang dapat dieksekusi untuk memuat pustaka bersama dari lokasi yang tepat. dasar Snap alih-alih menggunakan file sistem root host. Ini berarti bahwa bidikan klasik bertindak lebih seperti bidikan yang sepenuhnya terbatas, yang seharusnya mengarah pada kompatibilitas dan prediktabilitas yang lebih tinggi.

Proposal kerja baru menjelaskan apa yang diperlukan untuk memvalidasi parameter tautan dinamis dalam file biner dalam paket SNAP klasik.

Paket SNAP klasik berjalan di sistem file root host, yang mungkin tidak kompatibel dengan lingkungan build-nya. Untuk menghindari inkonsistensi, binari dalam snap klasik harus dibuat atau ditambal dengan parameter penautan yang sesuai untuk memungkinkan mereka memuat pustaka bersama. dasar Jepret. Untuk potensi masalah tautan dinamis, pembuat SNAP harus menyadari bahwa paket mereka mungkin tidak berjalan seperti yang diharapkan.

Dengan proposal baru, parameter tautan dinamis berikut harus dicakup:

  • Rute Perpustakaan Rute – Bagian dinamis adalah file ELF yang berisi input RPATH yang mencantumkan jalur runtime ke pustaka bersama yang akan dicari. sebelum Jalur diatur dalam variabel lingkungan LD_LIBRARY_PATH dan masukan RUNPATH. Banyak jalur yang dipisahkan oleh titik dua dapat diidentifikasi.
  • Rute $ ASAL – Eigenvalue $ ORIGIN mewakili jalur tempat biner berada, sehingga memungkinkan jalur pustaka runtime disetel relatif terhadap lokasi itu (misalnya: $ ORIGIN /../ lib untuk file yang dapat dieksekusi yang diinstal di bin / Dengan pustaka di lib /).
  • Penerjemah Berkas – Bagian khusus ELF .interp menyimpan path dari program interpreter. Jika digunakan, itu harus disetel ke jalur tautan dinamis yang sesuai: tautan dinamis sedang dibuat dari paket snap jika libc dipentaskan, atau tautan dinamis disediakan oleh dasar Jika tidak, ketuk Pengembang harus menyadari bahwa binari yang dilampirkan ke libc alternatif dapat menggunakan nilai juru bahasa yang mengarah ke penaut dinamis yang berbeda.

File yang terpengaruh dan rpath baru

Untuk berjalan seperti yang diharapkan, binari dalam aplikasi Snap klasik harus mencari perpustakaan bersama yang disediakan oleh dasar SNAP atau seluler sebagai bagian dari aplikasi SNAP. Ini dicapai dengan menyetel jalur runtime untuk pustaka bersama di semua binari ELF (kecuali file objek yang dapat dipindahkan) yang terdapat dalam pemuatan paket.

rpath File ELF harus disetel dengan benar jika:

  1. Proyek ini memiliki basis. Dan
  2. Basis proyek tidak kosong. Dan
  3. Penjara itu klasik atau libc dipentaskan

Nilai rpath harus diatur untuk mencapai semua input yang DIBUTUHKAN di bagian biner dinamis ELF. Jika biner sudah berisi rpath, seharusnya hanya menyimpan item yang terdaftar di $ ORIGIN. Input Rpath yang mengarah ke lokasi di dalam konsinyasi harus diubah menjadi $ ORIGIN. Namun, ini tidak menyertakan atau mendukung jalur identifikasi ke pustaka bersama yang dimuat dengan dlopen ().

Ada beberapa strategi untuk menyiapkan rpath dan interpreter.

Setel rpath pada waktu pembuatan

Biner ELF yang dihasilkan selama eksekusi siklus hidup komponen dapat menyesuaikan nilai rpathnya menggunakan parameter kopling yang sesuai. Linker biasanya dipanggil secara tidak langsung melalui driver compiler. Dalam kasus gcc, parameter dapat diteruskan ke linker menggunakan opsi -Wl:

$ gcc -o foo foo.o -Wl,-rpath=\$ORIGIN/lib,--disable-new-dtags -Llib -lbar

Strategi serupa dapat digunakan untuk mengatur rpath dalam biner cgo:

package main
/*
#cgo LDFLAGS: -L${SRCDIR}/lib -Wl,-rpath=\$ORIGIN/lib -Wl,--disable-new-dtags -lbar
#include "bar.h"
*/

import "C"

func main() {
    C.bar()
}

Dalam kedua kasus, pemeriksaan isi bagian dinamis ELF menunjukkan bahwa nilai rpath diatur dengan benar:

Tag                Type             Name/Value
0x0000000000000001 (NEEDED)         Shared library: [libbar.so]
0x0000000000000001 (NEEDED)         Shared library: [libc.so.6]
0x000000000000000f (RPATH)          Library rpath: [$ORIGIN/lib]

Ubah file yang dapat dieksekusi yang dihasilkan

Setelah SNAP mungkin berisi binari ELF prefabrikasi yang diinstal dari sumber arbitrer (biasanya dari arsip distribusi, setelah instalasi paket tahap). Dalam hal ini, rpath harus disesuaikan dengan memodifikasi biner yang ada menggunakan alat seperti patchelf:

$ patchelf --force-rpath --set-rpath \$ORIGIN/lib foo
$ readelf -d a | grep RPATH
0x000000000000000f (RPATH)              Library rpath: [$ORIGIN/lib]

Patchelf juga dapat digunakan untuk mengubah penerjemah ke tautan dinamis yang berbeda:

$ patchelf --set-interpreter /lib64/ld-linux-x86-64.so.2 foo
$ readelf -p .interp a
String dump of section '.interp':
[     0]  /lib64/ld-linux-x86-64.so.2

Tentu saja, tidak ada jaminan bahwa binari individu dapat ditambal, atau semua kegunaan dapat ditutupi. Patch biner ELF untuk memodifikasi input rpath atau interpreter mungkin gagal dalam skenario tertentu seperti file yang dapat dieksekusi go yang terkait dengan go linker atau binari menggunakan tipe libc yang memerlukan penerjemah non-standar. Selain itu, tambalan menyebabkan binari validasi yang ditandatangani gagal.

Sebagai bagian dari pengalaman pengembang yang ditingkatkan, alat snapcraft juga memberikan peringatan untuk membantu pembuat Snap lebih memahami secara akurat jika ada potensi masalah dengan membuat Snap menggunakan enklosur klasik. Khususnya, jika kiriman berisi file biner yang dapat memuat pustaka bersama yang tidak kompatibel, pemuat harus mengeluarkan peringatan.

  • Patch diperlukan, dan penerjemah biner ELF tidak disetel ke tautan dinamis yang benar (dari dasar Atau libc bertahap). Jika biner ELF menggunakan penerjemah non-standar, perhatian khusus mungkin diperlukan (jika tidak, liner akan mengeluarkan peringatan positif palsu).
  • Koreksi diperlukan dan biner rpath ELF diatur ke nilai yang diperlukan untuk memuat dependensi perpustakaan bersama dasarAtau dari snap jika ketergantungannya bukan bagian darinya dasar.
  • Selain peringatan tersebut, alat snapcraft juga dapat mencetak informasi tentang cara mengatur parameter atau menambal biner pada saat pembuatan.
  • Snapcraft juga dapat melakukan pengepakan biner ELF secara otomatis sesuai dengan parameter yang diatur dalam file konfigurasi proyek. Terlepas dari kebijakan default, harus ada opsi untuk tidak melakukan auto-patch karena keterbatasan mekanisme patch atau karena nilai yang ada tidak boleh diubah.

Skenario pemenjaraan klasik adalah skenario yang sulit karena memerlukan penyajian perilaku yang berulang dan konsisten dan menghasilkan lingkungan yang tidak dapat diprediksi (mesin pengguna). Tim SnapCraft berusaha untuk membuat pengalaman itu seindah mungkin, sehingga pengembang dapat dengan andal mengemas aplikasi mereka sebagai Snap klasik dan mengirimkannya ke penggunanya. Dalam artikel ini, kami membahas beberapa alat dan metode yang digunakan untuk meningkatkan fitur ini. Jika Anda memiliki pertanyaan atau ide tentang Snaps Klasik, silakan bergabung dengan komunitas kami dan beri tahu kami pendapat Anda.

Foto Rustyness di Unsplash.



Source link

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *