CVE-2022-4993
Açıklama
Perl için HTML::FormHandler 0.410000 öncesi sürümler, _apply_actions ve add_error fonksiyonlarının istek verilerinden oluşturulan hata mesajı metnini bir Locale::Maketext köşeli parantez notasyonu şablonu olarak kullanması nedeniyle, saldırgan tarafından seçilen yöntem yönlendirmesine (method dispatch) ve kaynak tükenmesine izin verir. add_error, ilk argümanını dil tutucusuna Locale::Maketext mesaj anahtarı olarak iletir ve varsayılan tutucunun sözlüğü `_AUTO` ayarına sahiptir; bu nedenle sözlük girişi olmayan bir dize, aranmak yerine bir köşeli parantez notasyonu şablonu olarak derlenir. Bir köşeli parantez grubunda ilk belirteç, dil tutucusu üzerinde çağrılan bir yöntemi adlandırır ve kalan belirteçler bu yöntemin argümanlarıdır. Kütüphanenin yazmadığı üç tür metin bu konuma ulaşabilir. _apply_actions, uyarı metnini `$error_message` içinde saklayan bir `$SIG{__WARN__}` işleyicisi kurar ve yakalanan bir uyarı başarılı bir işlemden sonra da kalıcı olur; böylece sayısal dönüşüm taşıyan bir alan, `Argument "[sprintf,%50000000d,0]" isn't numeric` ifadesini şablona dönüştürür; uyarı gönderilen değeri olduğu gibi tırnak içine aldığı için grup düzgün biçimlendirilir ve yönlendirilir. `$error_message ||= $tobj->validate($new_value)` işlemi, bir tip kısıtlamasının kendi hata mesajını alır ve bu mesaj reddedilen değeri köşeli parantez ve virgül formunda kısmi bir dumper aracılığıyla sunar (Moose yüklenebildiğinde Devel::PartialDump, her zaman Type::Tiny'nin kendi dumper'ı); dolayısıyla `apply => [ Str ]` özelliğine sahip bir alana birden fazla kez gönderilen ve dizi olarak gelen bir parametre verildiğinde, kendi başına hiçbir köşeli parantez karakteri taşımayan bir istekten `Reference ["a","b"] did not pass type constraint "Str"` şablonu elde edilir. Bir zorlama (coercion) veya dönüşüm istisnası da aynı şekilde buraya ulaşır. Bunların ötesinde, mesajı alan değerini içeren bir doğrulayıcı, bu değeri doğrudan şablona yerleştirir ve add_error mesaj listesini önce bir arrayref olan ilk argümanın içeriğiyle değiştirir (`@message = @{$message[0]} if ref $message[0] eq 'ARRAY'`); böylece dizi olarak gelen bir değer, yine aynı istekten gelen argüman yuvalarını doldurur. `[0]` gibi hatalı biçimlendirilmiş bir grup, derlemenin çökmesine neden olur ve HTML::FormHandler::I18N::maketext ile add_error bunun her birini bir die olarak yeniden fırlatır, böylece process() hata verir. sprintf adlandıran düzgün biçimlendirilmiş bir grup, saldırgan tarafından seçilen bir alan genişliği ile CORE::sprintf'e ulaşır. Güvenilmeyen bir alana tip kısıtlaması veya dönüşüm uygulayan ya da doğrulayıcısı güvenilmeyen bir alan değerini add_error'a ileten herhangi bir çağırıcı, process() dışına yönetilmeyen bir istisna fırlatmaya veya tek bir istekte rastgele miktarda bellek tahsis etmeye zorlanabilir ve dil tutucu alt sınıfı yan etkili genel yöntemler tanımlayan bir uygulama, bu yöntemlerin saldırgan tarafından seçilen argümanlarla çağrılabilir hale gelmesine neden olur. Dökümlenen tip kısıtlama mesajı istisna ile sınırlıdır çünkü her iki dumper da sayısal olmayan öğeleri tırnak içine alır, böylece yöntem yuvası asla saldırgan tarafından seçilen bir isim olmaz. Yerleşik mesajlar, değerin bir argüman yuvasında kaldığı ve orada etkisiz olduğu sabit şablonlar iletir ve yerleşik alan türleri açık mesaj geri çağırmaları ekler, bu nedenle bunların hiçbiri etkilenmez.
Nasıl düzeltilir
- HTML-FormHandler0.410000 ya da sonraki bir sürüm
Etkilenen ürünler
| Ürün | Etkilenen sürümler | Düzeltildiği sürüm |
|---|---|---|
| HTML-FormHandler | v < 0.410000 | 0.410000 |
Sürümünüzü kontrol edin
Ürünü seçin ve kullandığınız sürümü yazın; sürümün etkilenen aralıkta olup olmadığını görün.
Attack Surface Management
Alan adlarınıza bağlı varlıkları, bu varlıklarda çalışan teknolojileri ve bilinen zafiyetleri tek listede görün.