Neden bir çevresel değişken içindeki işlevleri tanımlama yeteneği kendi başına bir güvenlik riski oluşturmaz?


9

Anladığım kadarıyla, genel olarak herhangi birinin çevresel bir değişkende saklanacak bilgileri sağlamasına izin verilmesi güvenli kabul edilir. Kabuk şoku güvenlik açığı burada bir sorundur, çünkü yeni bir bash örneği başlatıldığında ve açıkça kimsenin sunucunuzda istedikleri herhangi bir kodu çalıştırmasını istemediğinizde, çevresel değişken içindeki bir işlev tanımının sonundaki kodun yürütüleceği anlamına gelir. . İşlev tanımlarının kendileri görünüşte bir güvenlik riski değildir ve kodlarının yürütülmesi için açıkça çağrılmaları gerektiğinden izin verilir.

Sorum şu ki, kötü niyetli bir kullanıcı kötü amaçlı kodunu ortak bir komut olarak içeren bir işlevi neden tanımlayamıyor lsve betiğin (veya çalıştırılmakta olan her şeyin) bir noktada bu komutu kullanmasını ummuyor?

Aklımdakilere bir örnek:

$ export ls='() { echo "doing bad things..."; }'
$ bash -c ls
doing bad things...

Yanıtlar:


10

Bu bir güvenlik riskidir. Bu nedenle genellikle başka bir içeriğe geçiş yaparken bunu yapamazsınız (bir sistemin uzaktan kontrolü, kullanıcıları değiştirme vb.).

İstediğiniz ortam değişkenini oluşturma olanağınız varsa, rasgele kod yürütmenin olası birçok yolu vardır.
Örnek $LD_PRELOADolarak alalım. Bu değişkeni ayarlama yeteneğiniz varsa, kitaplık işlevlerini değiştirebilir ve kodunuzu oraya yapıştırabilirsiniz. $DISPLAYDeğişkeni ayarlayabilir ve programın bağlandığı X ekranını, uygulamanın kontrolünü ele geçirmek için yönlendirebilirsiniz.

Bu yüzden sudotüm değişkenlerin ortamını soymak gibi şeyler . sudoyalnızca birkaç değişkene izin verir. Ve bu değişkenlerden onları dezenfekte eder ( $TERMdeğişkenden geçer , ancak olağandışı karakterler içeriyorsa olmaz).


Vay be, her zaman BASH'de yaptığım bazı büyük senaryoların sudo ile başladığında, özellikle yolların etrafında, sudo başlangıcını kontrol etmeme ve engellememe neden olan garip arcane hataları yaşayacağını merak ettim, ama bunun neden olduğunu ve neden olduğunu hiç bilmiyordum bir sorun, iyi bir açıklama için teşekkürler sudo çevresel değişkenleri sıyırma.
Lizardx

3

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.


1
POSIX, taslak 2'de dışa aktarılabilir işlevlere izin verdi ve daha sonra bunlara izin verilmedi. Bu özellik çılgınca.
mikeserv
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.