Bagaimana cara mengekstrak file tar yang tidak dipercaya dengan aman?

30

Saya ingin dapat mengekstrak file tar, sehingga semua file yang diekstraksi ditempatkan di bawah direktori awalan tertentu. Setiap upaya oleh file tar untuk menulis ke direktori luar harus menyebabkan ekstraksi gagal.

Seperti yang Anda bayangkan, ini agar saya dapat mengekstrak file tar yang tidak dipercaya dengan aman.

Bagaimana saya bisa melakukan ini dengan GNU tar?

Saya datang dengan:

tar --exclude='/*' --exclude='*/../*' --exclude='../*' -xvf untrusted_file.tar

tapi saya tidak yakin ini cukup paranoid.

Demi
sumber
2
Itu tidak cukup paranoid. Saya membangun beberapa tarbal jahat di masa lalu yang naik melalui tautan simbolis yang dibuatnya. Saya akhirnya membuat tar saya sendiri yang sudah disetuid-root sehingga bisa mengeksekusi chroot (".") Dan memberikan privilege.
Joshua
8
@ Yosua jadi solusi Anda untuk membuat utilitas yang sangat teruji lebih aman adalah dengan membuat versi Anda sendiri dan memberikannya root privilege?
Stop Harming Monica
4
@OrangeDog: int main (int argc, char ** argv) {chroot (".") || keluar (1); setuid (getuid ()); mudah diaudit.
Joshua
2
Anda mungkin juga ingin memeriksa apa yang ada di dalam file tar dengan menggunakan -topsi.
Thomas

Jawaban:

40

Anda tidak perlu paranoia sama sekali. GNU tar- dan pada kenyataannya setiap yang ditulis dengan tarprogram yang diproduksi dalam 30 tahun terakhir atau lebih - akan menolak untuk mengekstrak file dalam tarball yang dimulai dengan garis miring atau yang mengandung ..unsur-unsur, secara default.

Anda harus keluar dari cara Anda untuk memaksa tarprogram - program modern untuk mengekstrak tarbal yang berpotensi berbahaya: baik GNU maupun BSD tarmemerlukan -Popsi untuk membuatnya menonaktifkan perlindungan ini. Lihat bagian Absolute File Names dalam manual tar GNU.

The -PBendera tidak ditentukan oleh POSIX, ¹ meskipun, jadi lain tarprogram mungkin memiliki cara yang berbeda untuk mengatasi ini. Sebagai contoh, Schily Tools' starProgram kegunaan -/dan -..untuk menonaktifkan perlindungan ini.

Satu-satunya hal yang mungkin Anda pertimbangkan untuk ditambahkan ke tarperintah naif adalah -Cbendera untuk memaksanya mengekstrak hal-hal dalam direktori sementara yang aman, jadi Anda tidak harus ke cdsana terlebih dahulu.


Selain itu :

  1. Secara teknis, tarsama sekali tidak ditentukan oleh POSIX. Mereka mencoba memberi tahu dunia komputasi Unix bahwa kita seharusnya menggunakan paxsekarang alih-alih tardan cpio, tetapi dunia komputasi sebagian besar mengabaikannya.

    Ini relevan di sini untuk mencatat bahwa spesifikasi POSIX untuk paxtidak mengatakan bagaimana ia harus menangani garis miring terkemuka atau ..elemen yang disematkan . Ada --insecurebendera yang tidak standar untuk BSDpax untuk menekan perlindungan terhadap ..elemen jalur yang disematkan , tetapi tampaknya tidak ada perlindungan standar terhadap garis miring terkemuka; paxhalaman manual BSD secara tidak langsung merekomendasikan penulisan -saturan substitusi untuk menangani risiko jalur absolut.

    Itulah hal yang terjadi ketika standar de facto tetap digunakan secara aktif sementara standar de jure sebagian besar diabaikan.

Warren Young
sumber
7
pax - portable archive interchangeAwww, lucu sekali, POSIX berpikir itu akan menggantikan mungkin format arsip yang paling banyak digunakan: P
cat
1
@ kucing Format arsip default adalah varian tar yang didukung cukup luas (AIUI juga seharusnya mendukung format cpio). Pax lebih merupakan upaya untuk mengganti antarmuka perintah untuk berurusan dengan arsip seperti itu, karena penanganan argumen perintah tar adalah ... unik.
Acak832
Catatan sisi acak: Saya cukup yakin itu "de jour", yaitu kata Prancis, yang bertentangan dengan "de jure."
Dana Gugatan Monica
7
@QPaysTaxes bukan. de jure adalah bahasa Latin dan kontras dengan situasi saat ini, yaitu apa yang secara de facto. De jour juga harus du jour untuk mematuhi aturan tata bahasa Prancis.
Perdana
1
Ini adalah kasus kognitif serumpun yang malang. Bahasa Prancis "du jour" ("hari ini") terlihat / terdengar sangat mirip dengan bahasa Latin "de jure" ("hukum") di sini bertolak belakang dengan "de facto" ("fakta"). Orang bisa berargumen bahwa pax adalah "standar bulan ini" atau "standar du jour" untuk mengolok-olok bagaimana standar baru sering diajukan, sementara sejumlah besar pengguna tetap dengan apa yang sesuai untuk mereka (standar de facto), mengetahui bahwa (secara kiasan) akan ada standar baru besok untuk mereka abaikan.
Monty Harder
19

Dengan GNU tar, sederhana saja

tar -xvf untrusted_file.tar

dalam direktori kosong. Tar GNU secara otomatis menghapus /nama anggota terkemuka saat mengekstraksi, kecuali secara eksplisit tidak diberitahu sebaliknya dengan --absolute-namesopsi . Tar GNU juga mendeteksi kapan penggunaan ../akan menyebabkan file diekstraksi di luar direktori tingkat atas dan menempatkan file-file itu di direktori tingkat atas, misalnya komponen foo/../../bar/quxakan diekstraksi seperti bar/quxdalam direktori tingkat atas daripada bar/quxdi induk direktori tingkat atas . GNU tar juga menangani tautan simbolik yang menunjuk di luar direktori tingkat atas, misalnya foo -> ../..dan foo/bartidak akan menyebabkan bardiekstraksi di luar direktori tingkat atas.

Perhatikan bahwa ini hanya berlaku untuk (versi terbaru dari) tar GNU (serta beberapa implementasi lainnya, misalnya * BSD tar dan tar BusyBox). Beberapa implementasi lain tidak memiliki perlindungan seperti itu.

Karena tautan simbolis, perlindungan yang Anda gunakan tidak akan cukup: arsip dapat berisi tautan simbolis yang menunjuk ke direktori di luar pohon dan mengekstrak file di direktori itu. Tidak ada cara untuk menyelesaikan masalah itu hanya berdasarkan nama anggota, Anda perlu memeriksa target tautan simbolik.

Perhatikan bahwa jika Anda mengekstraksi ke direktori yang sudah berisi tautan simbolik, jaminan mungkin tidak lagi berlaku.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
6

Untuk membahas beberapa hal, jawaban lain belum:

  1. Pertama, lihat apa yang ada di file sebelum Anda mengekstraknya:

    tar -tvf untrusted_tar_file.tar
    

    Jika ada sesuatu di sana yang Anda tidak percaya atau ingin mengekstrak, jangan mengekstrak tarball.

  2. Kedua, ekstrak tarball sebagai pengguna non-root yang hanya memiliki akses tulis ke satu direktori tempat Anda mengekstrak tarball. Misalnya, ekstrak tarball dari dalam direktori home pengguna non-root.
Andrew Henle
sumber
4
1. Itu tidak praktis untuk operasi batch. 2. Kecuali jika Anda menjalankan pengaturan khusus, lokasi tertentu dapat ditulis oleh semua pengguna, terutama / tmp /
pipe
@pipe seseorang juga bisa membuat direktori dan pengguna baru, dan hanya pengguna itu yang memiliki akses hanya ke direktori itu, kemudian jalankan perintah. Saya sangat menyukai direktori home saya, terima kasih.
kucing
2
@pipe Mengapa di Bumi yang baik dari Allah ini, Anda PERNAH akan melewatkan data yang tidak dipercaya melalui operasi batch? Jika Anda tidak mempercayainya, Anda TIDAK menjalankannya tanpa pengawasan.
Andrew Henle
6
@AndrewHenle Uhm, ok. Menurut Anda bagaimana setiap server di internet berfungsi? Apakah menurut Anda beberapa pria di stackexchange menjalankan komentar ini melalui basis data dan sistem markup mereka sambil memantau operasi secara manual? Karena input ini adalah data yang tidak dipercaya melalui operasi batch.
pipa
Saya tidak akan merekomendasikan mengekstraksi file yang tidak dipercaya langsung di direktori home. Anda tidak ingin itu menimpa Anda .bashrc dan .config / file lainnya, bukan?
Hugal31