CVE-2024-23897 Jenkins Args4j Nedir ? (Anlatım Konusu)

logo.png




Görsel


CVE-2024-23897 Jenkins Args4j Nedir ? (Anlatım Konusu)

Jenkins, popüler bir açık kaynak otomasyon sunucusu, dosya okuma zafiyeti CVE-2024-23897 tarafından etkilendiği tespit edildi. Jenkins, script veya shell ortamlarından etkileşimi kolaylaştırmak için yerleşik bir Komut Satırı Arayüzü (CLI) kullanır ve CLI komut işleme sırasında komut argümanlarını ve seçeneklerini ayrıştırmak için args4j kütüphanesini kullanır. Bu zafiyet, bu kütüphanede mevcuttur ve kimliği doğrulanmamış bir kullanıcının dosya sistemindeki herhangi bir dosyanın ilk birkaç satırını okumasına izin verir. Ayrıca, kimliği doğrulanmış kullanıcılar, tüm dosyaları okuma yeteneğini elde ederek daha da ileri gidebilirler. Yüksek ciddiyeti göz önüne alındığında, Jenkins kurulumlarını güvence altına almak için hızlı önlemlerin gerekliliğini vurgulamak isteriz.

Zafiyet Detayları

Özellik: expandAtFiles
Açıklama: Bu komut ayrıştırıcı özelliği, bir argümanda bir dosya yolunu takiben bir '@' karakterini otomatik olarak dosyanın içeriğiyle değiştirir.
Varsayılan Olarak Etkin: Evet
Etkilenen Sürümler: Jenkins 2.441 ve öncesi, LTS 2.426.2 ve öncesi.

Sömürü Senaryoları

Saldırı Vektörü: Keyfi Dosya Okuma

Açıklama: Saldırganlar, Jenkins denetleyici dosya sistemindeki herhangi bir dosyayı Jenkins denetleyici işlem sürecinin varsayılan karakter kodlamasını kullanarak okuyabilirler.
İzinlerin Etkisi: Genel/Okuma izni olan saldırganlar tüm dosyaları okuyabilirken, Genel/Okuma izni olmayan saldırganlar dosyaların ilk birkaç satırını okuyabilirler. Belirli satır sayısı, mevcut CLI komutlarına bağlıdır.


Saldırı Yüzeyi

Kar amacı gütmeyen güvenlik organizasyonu ShadowServer tarafından 45.000'den fazla güncellenmemiş Jenkins örneği belirlendi.
ShadowServer gösterge tablosu

Ciddiyet: Kritik (Jenkins Danışmanlığına göre: CVSS 10), Yüksek (NVD Değerlendirmesi: CVSS 7.5)

Dosya okumalarının ötesinde: RCE olasılıkları
Şekil 1, "Keyfi Dosya Okuma"dan uzaktan kod yürütme (RCE) sonuçlanabilecek bazı olasılıkları göstermektedir.




Fig1.png

Şekil 1. CVE-2024-23897 için, "Keyfi Dosya Okuma"dan uzaktan kod yürütme sonucu oluşabilecek olasılıkları gösterir.

Son Saldırılar

Analizimiz, çeşitli bölgelerden kaynaklanan birkaç saldırı örneği buldu, saldırıların çoğunluğunun kaynak IP adreslerinin Shadowserver verilerine göre Hollanda'dan geldiğini belirtti. Bu arada, hedeflerin çoğunluğu Güney Afrika'dan, Şekil 3'te gösterildiği gibi.

ev-1.png

Şekil 2. CVE-2024-23897'yi sömüren saldırı girişimlerinin köken ülkeleri (Shadowserver verilerine dayanarak)



ev2-1.png

Şekil 3. CVE-2024-23897'yi sömüren saldırı girişimlerinin hedeflerin dağılımı (Shadowserver verilerine dayanarak)

Gözlemlenen saldırı olaylarının çoğu, kavramsal kanıt (POC) tarayıcılarının kullanımına yol açtı. Ayrıca, RCE açıklarının aktif olarak ticaretinin yapıldığı örneklerle karşılaştık - özellikle, kimliği doğrulanmamış RCE yetenekleri sağlayan CVE-2024-23897 açığının satışıyla ilgili girdiler bulduk (ancak söz konusu açığın sahte veya uydurma olma olasılığı vardır).




Fig4.png

Şekil 4. Bir CVE-2024-23897 açığının satışı

Zafiyet analizi

CVE-2024-23897, HTTP, WebSocket ve Güvenli Kabuk (SSH) üzerinden sömürülebilir, bunlardan ilk ikisi sömürme şansının en yüksek olduğu yöntemlerdir.

Ekran-Alintisi-1.png

Şekil 5. HTTP sömürü akışı

HTTP uç noktası varsayılan olarak iki POST isteği yapmayı gerektirir. İsteklerden biri, komutları ve argümanlarını içeren bir "yük" isteği gönderecekken, ikinci istek, komutları yürütmek ve çıktıyı almak için bir "indirme" isteğidir.

Bu isteklerden herhangi birini aldıktan sonra, aşağıdaki yöntemler sırayla çağrılacaktır:


CliCrumbExecution yöntemi uç noktayı doğrularken, FullDuplexHttpService yöntemi isteği ve yanıtı işler (unutulmamalıdır ki istek yapmak için PlainCLIProtocol kullanılır). Son olarak, CLI Girişinden argümanları ayrıştırmak için kullanılan, zafiyetli args4j kütüphanesini kullanan CmdLineParser yöntemi kullanılır.

11-1.png

Jenkins PlainCLIProtocol

Jenkins PlainCLIprotcol Java sınıfı, çeşitli opkodları ve ardışık çerçeveleri içeren belirli bir ikili biçimi kullanır.



123-1.png

Şekil 7. Opkod eşlemesi; bu değerler, her opkodun Op numarasındaki sıralı konumlarını temsil eder.

Her opkodun, onu istemciden sunucuya (doğru) veya sunucudan istemciye (yanlış) gönderilip gönderilmediğini belirten bir Boolean özelliği olan clientSide adında bir özelliği vardır. Bu opkodlar, CLI protokolünde istemci ve sunucu arasında değiş tokuş edilebilecek farklı türdeki işlemleri tanımlamak için kullanılır.

Jenkins ikili biçimi

Jenkins'in, ardışık çerçevelerden oluşan belirli bir ikili biçimi vardır. Şekil 8, Jenkins ikili biçimini (Alex Williams tarafından sağlanan şekilde) tasvir eder:

Fig8.png

Şekil 8. Jenkins ikili biçimi

Bu protokol için ikili biçim, her iletiyi bir int uzunluğu ve ardından bir byte opkod ile çerçevelemeyi ve son olarak da gerçek veriyi içermeyi içerir.

Genel bir ileti için ikili biçimin ayrıntıları aşağıdaki gibidir:

Uzunluk Alanı (4 byte): Bu, ileti uzunluğunu, uzunluk alanının kendisi ve opkod hariç olarak temsil eder. Büyük uçtan (big-endian) ağ byte sırasında kodlanmış 32 bitlik bir işaretli tamsayı olarak kodlanır.

Opkod Alanı (1 byte): Bu, ileti için işlem kodunu (opkod) temsil eder.

Veri Alanı: Bu, opkoda özgü gerçek veridir.


Zafiyetli Kod

Zafiyetli kod, Args4j kütüphanesinde bulunabilir.


Fig9.png

Şekil 9. Bir argümanda bir dosya yolunu takip eden "@" karakterinin dosyanın içeriğiyle değiştirilmesi

Normal kullanımdaki işlev
Genellikle, Jenkins-cli'deki "@" dosyanın içeriğini belirten bir taşıyıcı belirteci veya kullanıcı adı:parola içeren bir dosyayı belirtmek için kullanılır.


Fig10.png

Şekil 10. Jenkins-cli'deki "@": Normal Kullanım

Jenkins-cli ile kimlik doğrulaması yapılmış bir komut kullanmak aşağıdaki çıktıyı üretecektir:


Fig11.png

Şekil 11. Normal kimlik doğrulanmış bir komutun hata çıktısı

"
-auth" anahtarında "password.txt" dosyasını belirtmek için " @ " özelliğini kullanmak aşağıdakini üretir:




Fig12.png

Şekil 12. Jenkins'in "-auth" anahtarını kullanarak kimlik doğrulaması yapılan bir çıkış. Jenkins, kimlik doğrulama kimlik bilgilerini yüklemek için bir dosyanın kullanılmasını önermektedir.

Zafiyet senaryosu

Mevcut Jenkins-cli komutlarına argüman olarak " @ " geçirilmesi, Şekil 13'te gösterilen çıktıya neden olacaktır.

Fig13.png

Şekil 13. Zafiyetin Sömürülmesi

Resimde görüldüğü gibi, "version" komutunun herhangi bir argüman almadığı halde veri hata çıktısında ortaya çıkarılmıştır.

Bilgi sızdırma derecesi, komut argüman desenlerine bağlıdır. Örneğin, argüman listesi girişlerine izin veriyorsa, daha kapsamlı veri sızdırma potansiyeli gösterir:

$ java -jar jenkins-cli.jar -s http://172.17.0[.]1:8080/ -auth admin:pass reload-job @/etc/passwd

Fig14.png

Şekil 14. Tüm dosyayı okuma

Son araştırmalarımızda, birden fazla satır okumak için yaygın olarak kullanılan connect-node komutuna bir alternatif olarak reload-job'u belirledik.

Diğer örnekler arasında delete-job, delete-node, disconnect-node, offline-node ve online-node bulunmaktadır.




Alternatif saldırı vektörü: kimliği doğrulanmamış kullanıcılar

CommandDetails
helpAdds jobs to view
who-am-iReports credential and permissions
restartRestarts Jenkins
shutdownImmediately shuts down Jenkins server
enable-jobEnables a job
Table 1. Alternative attack vector for unauthenticated users

Alternatif Saldırı Vektörleri: Kimliği doğrulanmış kullanıcılar

CommandDetails
add-job-to-viewAdds jobs to view.
buildBuilds a job, and optionally waits until its completion
cancel-quiet-downCancels the effect of the quiet-down command.
clear-queueClears the build queue
connect-nodeReconnects to a node(s)
consoleRetrieves console output of a build.
copy-jobCopies a job.
create-credentials-by-xmlCreates credential via XML
create-credentials-domain-by-xmlCreate credentials domain via XML
create-jobCreates a new job by reading stdin as a configuration XML file
Table 2. Alternative attack vector for authenticated users

Windows üzerinden saldırı isteği

Bu saldırı bağlamında, bir isteğin Windows makinesinden bir Jenkins Linux sunucusuna köken alması durumunda, gözlemlenen kodlama windows-1252 olarak tanımlanır.

Fig15.png

Şekil 15. Windows Saldırı isteği (windows-1252)

Linux üzerinden Saldırı İsteği

Eğer istek bir Linux makinesinden bir Jenkins Linux sunucusuna geliyorsa, bu saldırı bağlamında gözlemlenen kodlama UTF-8'dir.


Fig16.png

Şekil 16. Linux Saldırı İsteği (UTF-8)

WebSocket Üzerinden Saldırı İsteği

WebSocket tabanlı saldırı istekleri, veriler üzerinde maskeleme yapacak, bu da kullanıcı girişinin görünmez olmasına neden olacaktır.



Fig17.png

Şekil 17. WebSocket saldırı isteği

Sonuç

Jenkins, sorunlu komut ayrıştırıcı özelliğini devre dışı bırakarak sürümler 2.442 ve LTS 2.426.3'te CVE-2024-23897'yi yamaladı. Kullanıcılara olası herhangi bir güvenlik olayını önlemek için bu güncellemeyi en kısa sürede uygulamaları şiddetle tavsiye edilir.




Konu Ana Kaynakları


 

ACE Veen

Uzman üye
4 Şub 2023
1,100
554
Belirsiz
logo.png




Görsel


CVE-2024-23897 Jenkins Args4j Nedir ? (Anlatım Konusu)

Jenkins, popüler bir açık kaynak otomasyon sunucusu, dosya okuma zafiyeti CVE-2024-23897 tarafından etkilendiği tespit edildi. Jenkins, script veya shell ortamlarından etkileşimi kolaylaştırmak için yerleşik bir Komut Satırı Arayüzü (CLI) kullanır ve CLI komut işleme sırasında komut argümanlarını ve seçeneklerini ayrıştırmak için args4j kütüphanesini kullanır. Bu zafiyet, bu kütüphanede mevcuttur ve kimliği doğrulanmamış bir kullanıcının dosya sistemindeki herhangi bir dosyanın ilk birkaç satırını okumasına izin verir. Ayrıca, kimliği doğrulanmış kullanıcılar, tüm dosyaları okuma yeteneğini elde ederek daha da ileri gidebilirler. Yüksek ciddiyeti göz önüne alındığında, Jenkins kurulumlarını güvence altına almak için hızlı önlemlerin gerekliliğini vurgulamak isteriz.

Zafiyet Detayları

Özellik: expandAtFiles
Açıklama: Bu komut ayrıştırıcı özelliği, bir argümanda bir dosya yolunu takiben bir '@' karakterini otomatik olarak dosyanın içeriğiyle değiştirir.
Varsayılan Olarak Etkin: Evet
Etkilenen Sürümler: Jenkins 2.441 ve öncesi, LTS 2.426.2 ve öncesi.

Sömürü Senaryoları

Saldırı Vektörü: Keyfi Dosya Okuma

Açıklama: Saldırganlar, Jenkins denetleyici dosya sistemindeki herhangi bir dosyayı Jenkins denetleyici işlem sürecinin varsayılan karakter kodlamasını kullanarak okuyabilirler.
İzinlerin Etkisi: Genel/Okuma izni olan saldırganlar tüm dosyaları okuyabilirken, Genel/Okuma izni olmayan saldırganlar dosyaların ilk birkaç satırını okuyabilirler. Belirli satır sayısı, mevcut CLI komutlarına bağlıdır.


Saldırı Yüzeyi

Kar amacı gütmeyen güvenlik organizasyonu ShadowServer tarafından 45.000'den fazla güncellenmemiş Jenkins örneği belirlendi.
ShadowServer gösterge tablosu

Ciddiyet: Kritik (Jenkins Danışmanlığına göre: CVSS 10), Yüksek (NVD Değerlendirmesi: CVSS 7.5)

Dosya okumalarının ötesinde: RCE olasılıkları
Şekil 1, "Keyfi Dosya Okuma"dan uzaktan kod yürütme (RCE) sonuçlanabilecek bazı olasılıkları göstermektedir.




Fig1.png

Şekil 1. CVE-2024-23897 için, "Keyfi Dosya Okuma"dan uzaktan kod yürütme sonucu oluşabilecek olasılıkları gösterir.

Son Saldırılar

Analizimiz, çeşitli bölgelerden kaynaklanan birkaç saldırı örneği buldu, saldırıların çoğunluğunun kaynak IP adreslerinin Shadowserver verilerine göre Hollanda'dan geldiğini belirtti. Bu arada, hedeflerin çoğunluğu Güney Afrika'dan, Şekil 3'te gösterildiği gibi.

ev-1.png

Şekil 2. CVE-2024-23897'yi sömüren saldırı girişimlerinin köken ülkeleri (Shadowserver verilerine dayanarak)



ev2-1.png

Şekil 3. CVE-2024-23897'yi sömüren saldırı girişimlerinin hedeflerin dağılımı (Shadowserver verilerine dayanarak)

Gözlemlenen saldırı olaylarının çoğu, kavramsal kanıt (POC) tarayıcılarının kullanımına yol açtı. Ayrıca, RCE açıklarının aktif olarak ticaretinin yapıldığı örneklerle karşılaştık - özellikle, kimliği doğrulanmamış RCE yetenekleri sağlayan CVE-2024-23897 açığının satışıyla ilgili girdiler bulduk (ancak söz konusu açığın sahte veya uydurma olma olasılığı vardır).




Fig4.png

Şekil 4. Bir CVE-2024-23897 açığının satışı

Zafiyet analizi

CVE-2024-23897, HTTP, WebSocket ve Güvenli Kabuk (SSH) üzerinden sömürülebilir, bunlardan ilk ikisi sömürme şansının en yüksek olduğu yöntemlerdir.

Ekran-Alintisi-1.png

Şekil 5. HTTP sömürü akışı

HTTP uç noktası varsayılan olarak iki POST isteği yapmayı gerektirir. İsteklerden biri, komutları ve argümanlarını içeren bir "yük" isteği gönderecekken, ikinci istek, komutları yürütmek ve çıktıyı almak için bir "indirme" isteğidir.

Bu isteklerden herhangi birini aldıktan sonra, aşağıdaki yöntemler sırayla çağrılacaktır:


CliCrumbExecution yöntemi uç noktayı doğrularken, FullDuplexHttpService yöntemi isteği ve yanıtı işler (unutulmamalıdır ki istek yapmak için PlainCLIProtocol kullanılır). Son olarak, CLI Girişinden argümanları ayrıştırmak için kullanılan, zafiyetli args4j kütüphanesini kullanan CmdLineParser yöntemi kullanılır.

11-1.png

Jenkins PlainCLIProtocol

Jenkins PlainCLIprotcol Java sınıfı, çeşitli opkodları ve ardışık çerçeveleri içeren belirli bir ikili biçimi kullanır.



123-1.png

Şekil 7. Opkod eşlemesi; bu değerler, her opkodun Op numarasındaki sıralı konumlarını temsil eder.

Her opkodun, onu istemciden sunucuya (doğru) veya sunucudan istemciye (yanlış) gönderilip gönderilmediğini belirten bir Boolean özelliği olan clientSide adında bir özelliği vardır. Bu opkodlar, CLI protokolünde istemci ve sunucu arasında değiş tokuş edilebilecek farklı türdeki işlemleri tanımlamak için kullanılır.

Jenkins ikili biçimi

Jenkins'in, ardışık çerçevelerden oluşan belirli bir ikili biçimi vardır. Şekil 8, Jenkins ikili biçimini (Alex Williams tarafından sağlanan şekilde) tasvir eder:

Fig8.png

Şekil 8. Jenkins ikili biçimi

Bu protokol için ikili biçim, her iletiyi bir int uzunluğu ve ardından bir byte opkod ile çerçevelemeyi ve son olarak da gerçek veriyi içermeyi içerir.

Genel bir ileti için ikili biçimin ayrıntıları aşağıdaki gibidir:

Uzunluk Alanı (4 byte): Bu, ileti uzunluğunu, uzunluk alanının kendisi ve opkod hariç olarak temsil eder. Büyük uçtan (big-endian) ağ byte sırasında kodlanmış 32 bitlik bir işaretli tamsayı olarak kodlanır.

Opkod Alanı (1 byte): Bu, ileti için işlem kodunu (opkod) temsil eder.

Veri Alanı: Bu, opkoda özgü gerçek veridir.


Zafiyetli Kod

Zafiyetli kod, Args4j kütüphanesinde bulunabilir.


Fig9.png

Şekil 9. Bir argümanda bir dosya yolunu takip eden "@" karakterinin dosyanın içeriğiyle değiştirilmesi

Normal kullanımdaki işlev
Genellikle, Jenkins-cli'deki "@" dosyanın içeriğini belirten bir taşıyıcı belirteci veya kullanıcı adı:parola içeren bir dosyayı belirtmek için kullanılır.


Fig10.png

Şekil 10. Jenkins-cli'deki "@": Normal Kullanım

Jenkins-cli ile kimlik doğrulaması yapılmış bir komut kullanmak aşağıdaki çıktıyı üretecektir:


Fig11.png

Şekil 11. Normal kimlik doğrulanmış bir komutun hata çıktısı

"
-auth" anahtarında "password.txt" dosyasını belirtmek için " @ " özelliğini kullanmak aşağıdakini üretir:




Fig12.png

Şekil 12. Jenkins'in "-auth" anahtarını kullanarak kimlik doğrulaması yapılan bir çıkış. Jenkins, kimlik doğrulama kimlik bilgilerini yüklemek için bir dosyanın kullanılmasını önermektedir.

Zafiyet senaryosu

Mevcut Jenkins-cli komutlarına argüman olarak " @ " geçirilmesi, Şekil 13'te gösterilen çıktıya neden olacaktır.

Fig13.png

Şekil 13. Zafiyetin Sömürülmesi

Resimde görüldüğü gibi, "version" komutunun herhangi bir argüman almadığı halde veri hata çıktısında ortaya çıkarılmıştır.

Bilgi sızdırma derecesi, komut argüman desenlerine bağlıdır. Örneğin, argüman listesi girişlerine izin veriyorsa, daha kapsamlı veri sızdırma potansiyeli gösterir:

$ java -jar jenkins-cli.jar -s http://172.17.0[.]1:8080/ -auth admin:pass reload-job @/etc/passwd

Fig14.png

Şekil 14. Tüm dosyayı okuma

Son araştırmalarımızda, birden fazla satır okumak için yaygın olarak kullanılan connect-node komutuna bir alternatif olarak reload-job'u belirledik.

Diğer örnekler arasında delete-job, delete-node, disconnect-node, offline-node ve online-node bulunmaktadır.




Alternatif saldırı vektörü: kimliği doğrulanmamış kullanıcılar

CommandDetails
helpAdds jobs to view
who-am-iReports credential and permissions
restartRestarts Jenkins
shutdownImmediately shuts down Jenkins server
enable-jobEnables a job
Table 1. Alternative attack vector for unauthenticated users

Alternatif Saldırı Vektörleri: Kimliği doğrulanmış kullanıcılar

CommandDetails
add-job-to-viewAdds jobs to view.
buildBuilds a job, and optionally waits until its completion
cancel-quiet-downCancels the effect of the quiet-down command.
clear-queueClears the build queue
connect-nodeReconnects to a node(s)
consoleRetrieves console output of a build.
copy-jobCopies a job.
create-credentials-by-xmlCreates credential via XML
create-credentials-domain-by-xmlCreate credentials domain via XML
create-jobCreates a new job by reading stdin as a configuration XML file
Table 2. Alternative attack vector for authenticated users

Windows üzerinden saldırı isteği

Bu saldırı bağlamında, bir isteğin Windows makinesinden bir Jenkins Linux sunucusuna köken alması durumunda, gözlemlenen kodlama windows-1252 olarak tanımlanır.

Fig15.png

Şekil 15. Windows Saldırı isteği (windows-1252)

Linux üzerinden Saldırı İsteği

Eğer istek bir Linux makinesinden bir Jenkins Linux sunucusuna geliyorsa, bu saldırı bağlamında gözlemlenen kodlama UTF-8'dir.


Fig16.png

Şekil 16. Linux Saldırı İsteği (UTF-8)

WebSocket Üzerinden Saldırı İsteği

WebSocket tabanlı saldırı istekleri, veriler üzerinde maskeleme yapacak, bu da kullanıcı girişinin görünmez olmasına neden olacaktır.



Fig17.png

Şekil 17. WebSocket saldırı isteği

Sonuç

Jenkins, sorunlu komut ayrıştırıcı özelliğini devre dışı bırakarak sürümler 2.442 ve LTS 2.426.3'te CVE-2024-23897'yi yamaladı. Kullanıcılara olası herhangi bir güvenlik olayını önlemek için bu güncellemeyi en kısa sürede uygulamaları şiddetle tavsiye edilir.




Konu Ana Kaynakları


çok güzel konu elinize sağlık
 
Ü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.