Diyorum ki, bash senin / bin / sh olduğunda. Bu bourne kabuğunun bir özelliği değildir ve bahse girerim bu da posix kabuğunun bir özelliği değildir, aslında açıkça yasaklamak isteyebilirler.
Bash, adına rağmen bourne kabuğundan çok korn türevi kabuğundan daha fazladır ve özelliğine sahip tek Korn benzeri kabuktur ve bence pratik erdemleri olmayan kitchensink özelliği. Modern kabukların ortak olduğu bourne kabuğu, posix kabuğu veya ksh88 altkümesi gibi standartlar için bash özelliklerinden kaçınan geliştiriciler, yazılımları açıkken kendilerini iyi uygulamalara ve standart deyimlere adamışlardır. linux ve mac ve şimdi potansiyel olarak savunmasızdır, çünkü istismar yazarları niyetlerine rağmen 'bashisms'i kullanmakta serbesttirler. Geliştirilmiş uyumluluğa göre, diğer bin kabuk kabuk türevlerine göre / bin / sh olarak çağrıldığında, yalnızca / bin / sh giriş kabuğunuz veya etkileşimli kabuk ise, bash bir çekirdek kabuğundan daha çok bourne kabuğu gibi davrandığında,
Sizi mutfak lavabosu özelliği, 2 vaka ile ikna etmeye çalışacağım: yönlendiriciler, ağa bağlı depolama 1. daha büyük env gibi cihazlar yapan, daha fazla bellek, yani daha fazla maliyet, daha az kar, yani, eğer bu bash özelliğini kullanmayı düşünmek için bir neden olsaydı, bunun yerine FPATH ve autoload, ksh88 özelliklerini kullanmamalısınız? çevrede bayt için tüm fonksiyon baytını geçmek yerine? Ayrıştırma ve budama çevre toptancılığı, sadece ^ $ (. *) $ Ve benzerlerini filtrelemek gibi bir değişkeni yanlış parçalayabilecek bir shellscript'e ulaşmadan önce düşünebilirsiniz ...
Bu, benzersiz olanın altını çizer, değişkenin ne olduğu önemli değildir ve komut dosyasının değişkene başvurması veya kullanması gerekmez, yine de savunmasız olabilir.
#!/bin/sh
exec /usr/local/myapp/support/someperlscript.pl
Güneşin altında kalan her şey için, yukarıdaki perl betiği kadar güvenli olmalı, herhangi bir değişkeni kullanmıyorsunuz, nasıl yanlış bir şekilde kullanabilirsiniz? Olarak değiştiriliyor
#!/bin/bash -norc
exec /usr/local/myapp/support/someperlscript.pl
Bu da yardımcı olmaz, bunun ENV veya bunun gibi bir şeyle ilgisi yoktu - herkes yakılır çünkü bash'ın benzersiz olması gerekir. Bash sürüm 2 sorunu var olması, bana kanıtlıyor kimse bu özelliği kullanır , aksi takdirde gerektiğini, çünkü onların uygulamaları için değil etrafında lurked gelmiş bu uzun. Ve daha da kötüsü, temelde bu özellikten kaçınmak yok . İşte size bir örnek: 'su -' ile birisine soracak olursanız, açıklama çevreyi atar, man sayfasını kontrol eder ve sadece% 99.9'u bulur. Ben bu şekilde test ettim, çünkü bu sistemde / bin / sh kökün giriş kabuğu ve / bin / sh bash AMA , bu örnekte deniyorum.bash_profile'ımı sertleştirmek için. Kök için mevcut olanı yeniden adlandırdım (etkin), ancak düşüncem su, daha sonra muhtemelen sudo ise, neyse, bunu değiştirdim:
exec env -i TERM=vt102 LOGNAME=root USER=root HOME=/var/root /bin/ksh -i
Yani, aslında çevreyi tamamen savuruyorum ve minimal bir env kullanıyorum ve sonra mevcut süreç yerine sorunu olmaması gereken bir kabuk çalıştırıyorum. Sonra standart örnek yerine şunu deneyin:
%dock='() { echo -e "\e[2t\c"; echo dockshock;} ; dock' su
Bu, belirli bir işlevi ayrıştırmayla nasıl bir ilgisi olmadığını gösterir ve bir istismar, işleve başvurabilir ve kullanabilir. Kök, vb. rıhtım bakın - ama, ne olmuş yani? Şimdi şunu deneyin:
%TERM='() { echo -e "\e[2t\c"; echo dockshock;} ; TERM' su -
Ve tahmin et ne oldu? Pencere rıhtım içine emilir. Sonrasında böyle görünüyor ..
%TERM='() { echo -e "\e[2t\c"; echo dockshock;} ; TERM' su -
Password:
dockshock
# env
_=/usr/bin/env
HOME=/var/root
LOGNAME=root
TERM=vt102
USER=root
# echo $0
/bin/ksh
#
Bunun için çok fazla! Dışa aktarılan işlevlerin aslında rc komut dosyalarına göre önceliği vardır. Ondan kaçamazsın.