Güvenilmeyen bir tar dosyasını nasıl güvenle çıkartırım?


30

Tar dosyasının ayıklanabilmesini istiyorum, böylece ayıklanan tüm dosyalar belirli bir önek dizini altına yerleştirilir. Tar dosyalarının dışarıdaki dizinlere yazma denemesi, ayıklamanın başarısız olmasına neden olmalıdır.

Tahmin edebileceğiniz gibi, bu güvenilir olmayan bir tar dosyasını güvenle açabilmem için.

Bunu GNU ile nasıl yapabilirim tar?

Ben geldim:

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

ama bunun yeterince paranoyak olduğundan emin değilim.


2
Yeterince paranoyak değil. Geçmişte yarattığı sembolik bağlarla yükselen bazı kötü tarballlar yaptım. Chroot (".") Yürütmek ve ayrıcalıklar bırakmak böylece setuid-root olan kendi katran yapma bitti.
Joshua,

8
@Joshua, çok yaygın olarak test edilmiş bir yardımcı programı daha güvenli hale getirmek için sizin çözümünüzü kendi sürümünüzü oluşturmak ve ona kök ayrıcalıklarını vermek oldu?
Monica'ya Zarar Vermeyi Durdurun

4
@OrangeDog: int main (int argc, char ** argv) {chroot (".") || çıkış (1); setuid (getuid ()); denetimi kolaydır.
Joshua,

2
Ayrıca -tseçeneği kullanarak tar dosyasının içinde ne olduğunu kontrol etmek isteyebilirsiniz .
Thomas

Yanıtlar:


40

Paranoyaya hiç ihtiyacın yok. GNU tar- ve aslında son 30 yılda üretilen iyi yazılmış herhangi birtar program - tarball'a eğik çizgiyle başlayan veya ..varsayılan olarak öğeler içeren dosyaları çıkarmayı reddedecektir .

tarPotansiyel olarak kötü niyetli tarball'ları çıkarmak için modern programları zorlama yolundan çıkmak zorundasınız : Hem GNU hem de BSD bu korumayı devre dışı bırakma seçeneğine tarihtiyaç duyuyor -P. GNU tar el kitabındaki Mutlak Dosya İsimleri bölümüne bakın .

-PBayrak POSIX tarafından belirtilmemişse, ¹ olsa da, böylece diğer tarprogramlar bu başa çıkma yöntemleri farklı olabilir. Örneğin, Schily Tools'un starprogramı bu korumaları kullanır -/ve -..devre dışı bırakır.

Saf bir tarkomuta eklemeyi düşünebileceğiniz tek şey -C, güvenli bir geçici dizindeki şeyleri çıkarmaya zorlayan bir bayraktır, o yüzden cdönce oraya gitmenize gerek yoktur .


Asitler :

  1. Teknik olarak, tarPOSIX tarafından artık belirtilmemiştir. Onlar Kullandığımız gerektiğini Unix bilgisayar dünyaya anlatmaya çalıştım paxyerine şimdi tarve cpioancak bilgisayar dünyanın büyük ölçüde onları görmezden geldi.

    Burada POSIX belirtiminin paxönde gelen eğik çizgileri veya gömülü ..öğeleri nasıl işlemesi gerektiğini söylemediğine dikkat etmek önemlidir . Bir standart olmayan var --insecureiçin bayrak BSDpax gömülü karşı bastırmak korumaları için ..yol öğelerinden, ancak lider eğik çizgiler karşı görünüşte hiçbir varsayılan koruma yoktur; BSD paxkılavuz sayfası dolaylı olarak -smutlak yol riski ile başa çıkmak için ikame kurallarının yazılmasını önerir .

    Bu, fiili bir standart aktif kullanımda kalmaya devam ederken gerçekleşen şeydir, jüri standardı ise büyük ölçüde göz ardı edilir.


7
pax - portable archive interchangeAwww, ne kadar sevimli, POSIX muhtemelen en yaygın kullanılan arşiv biçiminin yerini alacağını düşünüyor: P
kedi

1
@ cat Varsayılan arşiv formatı oldukça yaygın olarak desteklenen bir tar varyantıdır (AIUI'nin cpio formatını da desteklemesi gerekir). Pax , bu tür arşivlerle uğraşmak için komut arayüzünü değiştirme girişimidir , zira tar'ın komut argümanının işlenmesi ilginçtir.
Random832

Rastgele yan not: “de jour” un yani “de jure” un tersine Fransızca sözcük olduğundan eminim.
Fon Monica'nın Davası

7
@QPaysTaxes öyle değil. de jüri Latin ve şu anki durumla zıt, yani fiili olanı. Fransızca dilbilgisi kurallarına uymak için de jour du jour olmalıdır.
Başbakan

1
Bu talihsiz bir sahte konyak örneğidir. Fransız "du jour" (günün "), burada" de jüri "(" kanunun ") Latince'ye çok benziyor / benziyor / burada" de facto "(" gerçeğin ") karşıtı. Kişi, pax'ın yeni standartların ne kadar sıklıkla önerildiğini ortaya çıkarmak için "ayın standardı" veya "standart du jour" olduğunu iddia edebilirken, geniş bir kullanıcı kitlesi sadece kendileri için uygun olanlarla kalıyor (fiili standart), Bunu bilmek (mecazi olarak) yarın görmemeleri için yeni bir standart olacağını.
Monty Harder

19

GNU katran ile, basitçe

tar -xvf untrusted_file.tar

boş bir dizinde. GNU tar /, --absolute-namesseçenek ile açıkça aksi belirtilmediği sürece, çıkartırken otomatik olarak lider üye adlarını soyar . GNU tar ayrıca, ../bir dosyanın kullanımının üst düzey dizinin dışına çıkarılmasına neden olacağını ve bunun yerine üst düzey dizinin içine bu dosyaları koyduğunu algılar ; örneğin, bir bileşen üst düzey dizinin üst kısmındaki yerine üst düzey dizindeki foo/../../bar/quxgibi ayıklanır. . GNU tar da örneğin toplevel dizini dışında işaret sembolik bağlantıları ilgilenir ve neden olmaz toplevel dizinine dışında ayıklanmasını.bar/quxbar/quxfoo -> ../..foo/barbar

Bunun sadece GNU katranının (yeterince yeni sürümleri için) (diğer bazı uygulamaların yanı sıra, örneğin * BSD katran ve BusyBox katran) için geçerli olduğunu unutmayın. Diğer bazı uygulamaların böyle bir koruması yoktur.

Sembolik bağlar nedeniyle, kullandığınız korumalar yeterli olmaz: arşiv, ağacın dışındaki bir dizine işaret eden ve o dizindeki dosyaları ayıklayan sembolik bir bağlantı içerebilir. Bu sorunu tamamen üye isimlerine göre çözmenin bir yolu yok, sembolik bağların hedefini incelemelisiniz.

Zaten sembolik bağlar içeren bir dizine çıkıyorsanız, garantinin artık geçerli olmayabileceğini unutmayın.


6

Birkaç noktaya değinmek için diğer cevaplar:

  1. İlk önce, çıkartmadan önce dosyada ne olduğuna bakın:

    tar -tvf untrusted_tar_file.tar
    

    İçeride güvenmediğiniz veya çıkarmak istemediğiniz bir şey varsa, tarball'ı çıkarmayın.

  2. İkinci olarak, tarball'ı, tarball'ı çıkardığınız bir dizine yalnızca yazma erişimi olan kök olmayan bir kullanıcı olarak çıkarın. Örneğin, tarball'ı root olmayan kullanıcının ana dizini içinden çıkartın.

4
1. Bu toplu işlemler için pratik değildir. 2. Özel bir kurulum yapmıyorsanız, belirli konumlar tüm kullanıcılar tarafından, özellikle / tmp /
pipe

pipet bir de bir dizin ve yeni bir kullanıcı yapabilir ve sadece o kullanıcının sadece o dizine erişimi olabilir, sonra komutu çalıştırın. Giriş dizini çok seviyorum, teşekkür ederim.
kedi,

2
@pipe Neden Tanrı'nın iyiliği Toprak, would you HİÇ geçmesi güvenilmeyen bir parti operasyonu üzerinden veri? Eğer güven yoksa, sen YAPMAYIN başıboş çalıştırın.
Andrew Henle,

6
@AndrewHenle Uhm, tamam. İnternetteki her sunucunun nasıl çalıştığını düşünüyorsunuz? Operasyonu elle takip ederken stackexchange'teki bazı adamların bu yorumu veritabanı ve biçimlendirme sistemi üzerinden yürüttüğünü düşünüyor musunuz? Çünkü bu girdi toplu işlem yoluyla güvenilmeyen veridir.
pipo

Güvenilmeyen bir dosyayı doğrudan bir giriş dizinine çıkartmanızı tavsiye etmem. .Bashrc ve diğer .config / files dosyalarının üzerine yazmak istemezsiniz, değil mi?
Hugal31
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.