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