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.
Ş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.
Şekil 2. CVE-2024-23897'yi sömüren saldırı girişimlerinin köken ülkeleri (Shadowserver verilerine dayanarak)
Ş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).
Ş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.
Ş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.
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.
Ş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:
Ş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.
Ş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ıarola içeren bir dosyayı belirtmek için kullanılır.
Ş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:
Ş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:
Ş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.
Ş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 adminass reload-job @/etc/passwd
Ş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
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.
args4j/args4j/src/org/kohsuke/args4j at master · kohsuke/args4j
args4j. Contribute to kohsuke/args4j development by creating an account on GitHub.
github.com
Ş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ıarola içeren bir dosyayı belirtmek için kullanılır.
Ş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:
Ş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:
Ş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.
Ş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 adminass reload-job @/etc/passwd
Ş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
Command | Details |
---|---|
help | Adds jobs to view |
who-am-i | Reports credential and permissions |
restart | Restarts Jenkins |
shutdown | Immediately shuts down Jenkins server |
enable-job | Enables a job |
Alternatif Saldırı Vektörleri: Kimliği doğrulanmış kullanıcılar
Command | Details |
---|---|
add-job-to-view | Adds jobs to view. |
build | Builds a job, and optionally waits until its completion |
cancel-quiet-down | Cancels the effect of the quiet-down command. |
clear-queue | Clears the build queue |
connect-node | Reconnects to a node(s) |
console | Retrieves console output of a build. |
copy-job | Copies a job. |
create-credentials-by-xml | Creates credential via XML |
create-credentials-domain-by-xml | Create credentials domain via XML |
create-job | Creates a new job by reading stdin as a configuration XML file |
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.
Ş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.
Ş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.
Ş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ı
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.
Ş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.
Ş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.
Ş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ı
NVD - CVE-2024-23897
nvd.nist.gov
args4j/args4j/src/org/kohsuke/args4j at master · kohsuke/args4j
args4j. Contribute to kohsuke/args4j development by creating an account on GitHub.
github.com
World map · General statistics · The Shadowserver Foundation
dashboard.shadowserver.org
Jenkins Security Advisory 2024-01-24
Jenkins – an open source automation server which enables developers around the world to reliably build, test, and deploy their software
www.jenkins.io
jenkins/cli/src/main/java/hudson/cli at master · jenkinsci/jenkins
Jenkins automation server. Contribute to jenkinsci/jenkins development by creating an account on GitHub.
github.com
jenkins/core/src/main/java/hudson/cli/ReloadJobCommand.java at master · jenkinsci/jenkins
Jenkins automation server. Contribute to jenkinsci/jenkins development by creating an account on GitHub.
github.com
jenkins/core/src/main/java/hudson/cli/CreateNodeCommand.java at master · jenkinsci/jenkins
Jenkins automation server. Contribute to jenkinsci/jenkins development by creating an account on GitHub.
github.com