Bu soruyu ilk kez yayınladığımdan beri web'leri biraz araştırıyorum.
Hatanın orijinal keşfedicisine göre, CVE-2014-6271 yamasından önce bash aşağıdaki gibi bir işlevi içe aktardı:
foo=() {
code
}
eşittir işaretini bir boşlukla değiştirerek ve yorumlayarak ... fonksiyon tanımının ötesinde yorum yapmak mümkün olmuştur.
Yama , SVO-2014-6271 için parse_and_execute () işlevi özel bir modu kişiye fonksiyon tanımına sınır değerlendirilmesi, ve bunun ötesinde.
Bununla birlikte, bu iş parçacığında açıklandığı gibi , CVE-2014-7169 güvenlik açığı testinin özel hazırlanmış ortam değişkeni 1) ayrıştırıcıyı ölümle karıştırmak için tasarlanmıştır 2) arabellekte not bırakın 3) orijinal bash komutunun ne yaptığını tamamen değiştirin tamponda bulunan artıkları birleştirir.
Ortam değişkenini incelemek için:
X='() { (a)=>\'
- Ayrıştırıcı analiz edecektir
() { (a)=>\
. \
Dizenin bir parçası olduğunu unutmayın ; Bu edilir değil arka tek tırnak kaçan.
() {
- Ayrıştırıcı bunu bir işlev tanımı olarak tanımlar.
(a)=
- Bu ayrıştırıcıyı ölümle karıştırır.
>\
- Ayrıştırıcı, son iki karakteri arabellekte oturuyor.
>\[NEWLINE]
sh
Komut çalıştırılmadan önceki bir noktada , ara belleğe bir satırsonu yerleştirilir.
>\[NEWLINE]echo date
- Ne zaman
sh
çağrılırsa (muhtemelen bu durumda bash için bir sembolik bağlantıdır), komut argümanlarını echo date
tamponda bulunan karakterlere ekler .
>echo date
- Yeni satır kaçtığından, bash arabelleği ayrıştırır ve
>echo date
bu da aynı etkiye sahiptir date > echo
. Adlı bir dosya echo
oluşturulur ve date
komutun stdout'u ona yönlendirilir.
; cat echo
- İkinci komut sadece yeni oluşturulan dosyanın içeriğini görüntüler.