PATH içinde olan dizin için neden '-execdir' eylemi güvenli değil?


19

Bulma -execdireylemi kombinasyonunu kullanırken neden güvensizdir -exec?

Aşağıdaki komutu çalıştırdığımda aşağıdaki komut istemini alıyorum:

/path/to/currentDir/$ find . -type f -name 'partOfFileNames*' -execdir rm -- {} +

find: The current directory is included in the PATH environment variable, which is insecure 
in combination with the -execdir action of find.  Please remove the current directory 
from your $PATH (that is, remove "." or leading or trailing colons)

Bu istemin görünmesine ne sebep olabilir?

Yanıtlar:


22

Yanlış programı çalıştırabilirsiniz. Birisi kendi programını çalıştırmanızı sağlayabilir.

-execdirEylem dosya (lar) bulundu içeren dizinden komutu çalıştırır. Ne zaman $PATHgöreli gibi yolları içeren .veya başlamaz şey/ , -execdirbir dosya bulunduğunda bir dizin de çalıştığınız aynı adı taşıyan bir yürütülebilir içerebilecek (veya başka bir dizin kendisine göre çözümlenir) nedeniyle güvensiz koşmak. Bu potansiyel olarak güvenilir olmayan yürütülebilir dosya daha sonra çalıştırılır.

Bu, başka bir kullanıcı tarafından çalıştırmaya çalıştığınız program yerine zarar vermenize veya veri güvenliğini ihlal etmenize neden olabilecek programlarını çalıştırmanıza neden olmak için kasten kullanılabilir. Ya da, daha az sıklıkla, sorun meydana getirmeye çalışan biri olmasa bile, yanlış programın yanlışlıkla çalıştırılmasına neden olabilir.

Senin her şeyin Eğer PATHortam değişkeni mutlak yoludur, bu hata dizin arama ve olsanız bile, ortaya çıkmaz -execdirdan ing olduğu içerdiği PATH. (Bunun işe yarayıp yaramadığını kontrol ettim.) Eğer göreli dizinlerinizin olmadığını düşünüyorsanız $PATHama hala bu hatayı alıyorsanız, lütfen sorunuzu çıktısını içeren ayrıntılarla güncelleyin echo "$PATH".

Somut bir örnek.

Neyin yanlış gidebileceğine bir örnek olarak varsayalım:

  • Alice .onun içindedir, çünkü isimlerinin başına geçmek için uğraşmaksızın, $PATHhangi dizinde olursa olsun programları çalıştırmak istiyor .cd./
  • Alice'in çılgınlığı Havva /home/eve/sharedAlice ile paylaştı .
  • Alice, .cHavva'nın onunla paylaştığı dosyalarda istatistik (satır, kelime, bayt) istiyor .

Alice koşar:

find ~eve/shared -name \*.c -execdir wc {} \;

Ne yazık ki Alice için Havva kendi senaryosunu oluşturdu, adını verdi wc, yürütülebilir ( chmod +x) ayarladı ve gizlice altındaki dizinlerden birine yerleştirdi /home/eve/shared. Havva'nın senaryosu şöyle:

#!/bin/sh
/usr/bin/wc "$@"
do_evil    # Eve replaces this command with whatver evil she wishes to do

Alice, Havva'nın paylaştığı dosyaları çalıştırmak için findbirlikte kullandığında ve Havva'nın özel senaryosuyla aynı dizindeki dosyalara ulaştığında , Havva'nın Alice'in tüm ayrıcalıklarıyla çalışır!-execdirwcwcwc

(Kurnaz olan Eve, wcsenaryosunu sistem için bir sarıcı olarak yaptı wc, bu yüzden Alice bir şeyin yanlış gittiğini bile bilmiyor, yani do_evilçalıştırıldı. )

Bunu nasıl findönler.

findgöreli bir dizin içerdiğinde -execdirişlem yapmayı reddederek bu güvenlik sorununun oluşmasını önler$PATH .

find özel duruma bağlı olarak iki tanılama mesajı sunar.

  • İçindeyse ., $PATH(gördüğünüz gibi) diyor ki:

    find: The current directory is included in the PATH environment variable, which is insecure in combination with the -execdir action of find. Please remove the current directory from your $PATH (that is, remove "." or leading or trailing colons)

    Muhtemelen .dava için özel bir mesajı vardır , çünkü özellikle yaygındır.

  • Dışında bir göreli yol ise ., --say fooiçinde --appears $PATHve çalıştırmak findile -execdir, diyor:

    find: The relative path `foo' is included in the PATH environment variable, which is insecure in combination with the -execdir action of find. Please remove that entry from $PATH

Hiç göreceli yollara sahip olmamak daha iyidir $PATH.

Dizini otomatik olarak değiştiren bir yardımcı program kullanıldığında, .veya diğer göreli yollara sahip olma riski $PATHözellikle artar, bu nedenle bu durumda findkullanmanıza izin vermez -execdir.

Ancak, göreceli yollara, özellikle .de sizin $PATHiçinizde doğası gereği risklidir ve yine de en iyi şekilde önlenir. Yukarıdaki örnekte yer alan kurgusal durumu ele alalım. Yerine çalışan varsayalım findAlice basitçe cdiçin s ~eve/shared/blahve çalışır wc *.c. Eğer blahEve içeren wcsenaryoyu, do_evilAlice olarak çalışır.


2
Bunu daha önce duyup duymadığınızı bilmiyorum, çok iyi bir öğretmen
yapacaksınız

5
@heemayl internette yararlı şeyler yazan herkes zaten öğretmen :-)
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

5

Burada çok ayrıntılı bir bilgi var . Başka bir mükemmel referans burada . İlk referanstan alıntı yapmak için:

-Execdir seçeneği, GNU find'da sunulan daha modern bir seçenektir -exec'in daha güvenli bir sürümünü yaratma girişimidir. İki önemli geliştirmeyle -exec ile aynı anlamsallığa sahiptir:

Her zaman dosyaya mutlak yol sağlar (-exec durumunda dosyanın göreceli yolunu kullanmak gerçekten tehlikelidir).

Mutlak yol sağlamanın yanı sıra PATH değişkenini de güvenlik açısından kontrol eder (eğer PATH env değişkeninde nokta varsa, çalıştırılabilir dosyayı yanlış dizinden alabilirsiniz)

İkinci referanstan:

'-Execdir' eylemi, geçerli dizin $ PATH ortam değişkenine dahil edilirse herhangi bir şey yapmayı reddeder. Bu '-execdir', dosyaları bulduğu dizinde programları çalıştırdığı için gereklidir - genel olarak, böyle bir dizin güvenilmeyen kullanıcılar tarafından yazılabilir olabilir. Benzer nedenlerle, '-execdir' çalıştırılacak komutun adında '{}' ifadesinin görünmesine izin vermez.


"PATH env değişkeninde nokta varsa, çalıştırılabilir dosyayı yanlış dizinden alabilirsiniz" neden yanıtınızı genişletebilir misiniz ? hangi yanlış dizin ? Ve bunu güvenli hale getirmek için neden yapmalıyız ? Thanks
αғsнιη

Umarım güncellenmiş
Ron

3

Ana sorun, PATHiçinde göreli klasörler bulunan sistem değişkeninin değeridir , bu nedenle güvenlik nedeniyle findkomut ikili dosyaları çalıştırmanıza izin vermez, çünkü potansiyel olarak yanlış programları çalıştırabilir.


Örneğin, aldığınız uyarıya göre PATH'nizde şu anki direktifiniz varsa:

Geçerli dizin PATH ortam değişkenine dahil edilir.

ve komutunu çalıştırırsın:

find . -type f -name 'partOfFileNames*' -execdir rm -- {} +

durumda (yerel komut dosyası olacak rmiçeren yürütülebilir bayraklarıyla) rm -fr /onun içinde, çünkü yerine beklenen infaz etme, tüm dosyalarınızı kaldırabilirsiniz /bin/rmsen idam ettirmekle, rmbu yüzden muhtemelen ne istediğini değil, simdiki dan.


Bir yan not olarak, bu hata ile başarısız olduğunda Travis CI'de ( GH # 2811 ) bilinen bir sorundur :

find: "./node_modules/.bin" göreli yolu, find komutunun -execdir eylemiyle kombinasyon halinde güvenli olmayan PATH ortam değişkenine dahil edilir. Lütfen bu girişi $ PATH adresinden kaldırın

Dolayısıyla çözüm, etkilenen girişi PATH değişkeninden kaldırmaktır, örn.

PATH=`echo $PATH | sed -e 's/:\.\/node_modules\/\.bin//'`

drogus tarafından önerildiği gibi . Bu hatanın ilerlemesi GH # 4862'den takip edilebilir .


İşte Bash sürümü geçici çözümü:

PATH=${PATH//:\.\/node_modules\/\.bin/}

Örnek kullanım (filtrelenen PATHbelirli bir komuta geçme):

env PATH=${PATH//:\.\/node_modules\/\.bin/} find . -type f

İşte sevmediğiniz sedher şeyi kaldırmak gibi görünüyor find: askubuntu.com/questions/621132/…
Ciro Santilli 新疆 改造 中心 法轮功 六四

3

xargsve bash -c cdgeçici çözüm

Tamam pes ediyorum:

find . -type f |
  xargs -I '{}' bash -c 'cd "$(dirname "{}")" && pwd && echo "$(basename "{}")"'

sed geçici çözüm

Önceki geçici çözümden biraz daha az hoş:

PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" find . -execdir echo '{}' \;

Bir testcase:

[ "$(printf '/a/b::c/d:/e/f\n' | sed -E 's/(^|:)[^\/][^:]*//g')" = '/a/b:/e/f' ] || echo fail

İçin rename: Özellikle, ayrıca bazı Perl regex-fu ile çalışabilirsiniz /programming/16541582/finding-multiple-files-recursively-and-renaming-in-linux/54163971#54163971

RTFS umut kırma

findDüşüncelerini görmezden gelmenin bir yolu olduğunu umanlar için, bunu bir kaynakla ezmeme izin verin:

Bundan yola çıkarak yol kontrolünü kapatmanın bir yolu olmadığını görüyoruz.

Kontrol ettiği kural şudur: eğer PATHboşsa veya başlamazsa başarısız olur /.

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.