1 Temmuz 2020 Çarşamba

Apache Tomcat için Kritik Güvenlik Açığı RCE (CVE-2020-9484) - yazma ve istismar


Apache Tomcat için yeni bir uzaktan kod yürütme güvenlik açığı açıklandı.

Bu güvenlik açığından yararlanılabilmesi için bir dizi önkoşul vardır:
·        - PersistentManager etkinleştirilmiş ve FileStore kullanılacak şekilde yapılandırılmış olmalıdır.
·       - PersistenceManager, sessionAttributeValueClassNameFilter = "null" (SecurityManager kullanılmadıkça varsayılan) veya saldırgan tarafından sağlanan nesnenin deserialization saldırısına olanasak sağlayan bir filtre ile yapılandırılmış olmalıdır.
·        -Saldırgan bir dosya yükleyebilir,yüklediği dosyanın adı ve içeriği üzerinde denetime sahip olabilir ve bu dosyanın konumunu bilir.
·       - ClassPath’de Java deserialization saldırısı için kullanılabilecek araçlar olmalıdır.

Etkilenen Versiyonlar

·         -Apache Tomcat 10.x < 10.0.0-M5
·        - Apache Tomcat 9.x < 9.0.35
·        - Apache Tomcat 8.x < 8.5.55
·         -Apache Tomcat 7.x < 7.0.104

Tomcat PersistentManager

Tomcat, oturum yönetimi yapan bileşeni tanımlamak için “Manager” kelimesini kullanır. Oturumlar, istemci istekleri arasındaki durumu korumak için kullanılır ve bunun nasıl yapılacağı hakkında birden fazla karar verilir. Örneğin:
·         -Oturum bilgileri nerede saklanır? Bellekte mi yoksa diskte mi?
·         -Hangi biçimde saklanır? JSON, serilalized object vb.
·        - Oturum kimlikleri nasıl oluşturulur?
·         -Hangi oturum özelliklerini korumak istiyoruz?

Tomcat kullanılabilecek iki uygulama sunar:
·        - org.apache.catalina.session.StandardManager (varsayılan)
·         -org.apache.catalina.session.PersistentManager

StandardManager oturumları hafızada tutar. Tomcat düzgün bir şekilde kapatılırsa, oturumları disk üzerindeki serialized bir nesnede (varsayılan olarak “SESSIONS.ser” olarak adlandırılır) depolar.

PersistentManager de aynı şeyi yapar, fazladan boş oturumları değiştirir. Bir oturum x saniye boyunca boşta kalırsa, diskte değiştirilir.Amaç bellek kullanımının azaltmaktır.

Değiştirilen oturumların nerede ve nasıl saklanmasını istediğinizi belirleyebilirsiniz. Tomcat iki seçenek sunar:

·         FileStore: takas edilen her oturumun, oturum kimliğine göre adıyla bir dosya olarak saklanacağı bir dizin belirtir.
·         JDBCStore: veritabanında, değiştirilen her oturumun ayrı satır olarak depolanacağı bir tablo belirtir.

Yapılandırma

Varsayılan olarak, Tomcat StandardManager etkin olarak çalışır. Yönetici, conf / context.xml dosyasını değiştirerek PersistentManager'ı kullanacak şekilde yapılandırabilir:
<Manager className="org.apache.catalina.session.PersistentManager"
         maxIdleSwap="15"> 
  <Store className="org.apache.catalina.session.FileStore"
         directory="./session/" />
</Manager> 

Context.xml içinde yazılmış bir Manager etiketi yoksa, StandardManager kullanılır.

Exploit

Tomcat bir JSESSIONID cookisi içeren bir HTTP isteği aldığında, yöneticiden bu oturumun mevcut olup olmadığını kontrol etmesini ister. Saldırgan, istekte gönderilen değeri kontrol edebildiğinden, “../../../../../../tmp/12345“ gibi bir şey koyarsa ne olur?
·         -Tomcat, yöneticiden oturum kimliği “../../../../../../tmp/12345” olup olmadığını kontrol etmesini ister.
·         -Önce o oturumun bellekte olup olmadığını kontrol eder.
·         -Bellekte değildir. Ancak şu anda çalışan yönetici bir PersistentManager'dır, bu nedenle oturumun diskte olup olmadığını da kontrol edecektir.
·         -Değerlendirilen "./Session/../../../../../../tmp/12345.session",  konum dizini + sessionid + ".session" 'da kontrol eder.
·        -Dosya varsa, bu dosyanın serisini kaldırır ve oturum bilgilerini ondan ayrıştırır.


Web uygulaması, oturum bilgileri içeren bir kötü amaçlı serialized nesneyle karşılaştığında HTTP 500 hatasını döndürür.

Kırmızı ile işaretlenmiş yukarıdaki görüntüdeki satırda PersistentManager'ın oturumu FileStore'dan yüklemeye çalıştığını görüyoruz. Mavi çizgi deserialize nesneyi gösterir. Hata, deserialization başarılı olduktan sonra nesneyi bir oturum olarak yorumlamaya çalıştığından dolayı atılır. Kötü amaçlı kod bu noktada yürütülür.

Güvenlik açığından yararlanmak için kalan tek şey saldırganın /tmp/12345.session konumuna kötü amaçlı bir serialized nesne koymasıdır.

Sadece bir HTTP isteği ile istismar oluşturulamaz. Ancak tomcat için yazılmış kullanışlı bir PoC vardır, bunun için GitHub sayfasına bakın.  https://github.com/masahiro331/CVE-2020-9484


Sonuç

Bu saldırı yüksek etkiye sahiptir (RCE), ancak yerine getirilmesi gereken koşullar sağlandığında sömürü olasılığı azaltılır.
PersistentManager'ın tomcat yöneticisi tarafından manuel olarak etkinleştirilmesi gerekir.

Saldırgan, kötü amaçlı dosyayı sunucuya yerleştirmek için ayrı bir dosya yükleme güvenlik açığı bulmalıdır.
Classpath’de  Java deserialization saldırısı tarafından kullanılmaya açık olan kütüphaneler olmalıdır.(örn. Gadget'lar)
Tomcat'in birçok versiyonu bu zafiyetten etkilenmektedir.

Çözüm Önerisi

Apache Tomcat bu güvenlik açığını gidermek için resmi olarak yeni bir sürüm yayınladı. Etkilenen kullanıcıların Tomcat'i en kısa sürede etkilenmeyen sürüme yükseltmeleri önerilir.
Yükseltme yapamayan kullanıcılar ve yöneticiler FileStore işlevini geçici olarak devre dışı bırakabilir veya yalnızca belirli niteliklere sahip nesnelerin serialised/deserialised sağlamak için sessionAttributeValueClassNameFilter değerini ayrı ayrı yapılandırabilir.

Referanslar


Share:

Microsoft Exchange Server 2019, 2016 ve 2013 için Güvenlik Güncellemesi

Microsoft Exchange Server’da yeni çıkan zafiyetlere karşı Microsoft yamalar yayınlamıştır. CVE-2021-31195 (Code injection) : Güvenlik açı...

Bu Blogda Ara

Blog Arşivi

Yorumlar

Popülar Postlar