Rust: Hyper kitaplığı aracılığıyla DoS’a açık 2500’e kadar proje

celeron

Global Mod
Global Mod
Rust Hyper kitaplığına dayalı projeler, DoS saldırılarına karşı kolayca savunmasız olabilir. Zayıf nokta işlevdir to_bytes, bir HTTP isteğinin veya yanıtının gövdesini tek bir bayt arabelleğine kopyalamak için kullanılabilir. Şimdiye kadar, geliştiricilerin, saldırganların süreçleri çökertmek için kullanabilecekleri kopyalanan gövdenin uzunluğunu sınırlamaları gerekmiyor.


Yazılım üreticisi JFrog’un güvenlik ekibi, Axum ve Salvo gibi büyük Rust projelerinin bile sorunu gözden kaçırdığını tespit etti. Şu anda Hyper, 68 milyondan fazla indirme ile Rust için en popüler HTTP kitaplığıdır. Topluluk deposucrates.io’ya göre, en büyük Rust tabanlı HTTP istemcileri ve reqwest ve warp sunucuları da dahil olmak üzere şu anda 2595 proje Hyper’a bağımlı.

Zayıf nokta: dikkatsiz programlama


Hyper, Rust’ın HTTP sunucularını ve istemcilerini uygulamak için kullandığı yapı taşıdır. Kitaplık, istekleri yanıtlamak, istek gövdelerini ayrıştırmak ve HTTP yanıtları oluşturmak için yöntemler içerir. Dokümantasyon zaten fonksiyonun ne olduğunu açıklasa da body::to_bytes kopyalanan boyutu kontrol etmeden geliyor, ancak JFrog ekibi birçok geliştiricinin ipucunu görmezden geldiğinden şüpheleniyor. Gövde, alıcının tüm belleğini kaplayacak kadar çok veri içeren tek bir HTTP isteği normalde proxy’ler, CDN’ler veya güvenlik duvarları tarafından durdurulur.


Ancak Hyper ile küçük paketlerle problemden yararlanmak mümkündür. eğer fonksiyon to_bytes birden fazla veri yığınını bekleyerek, okunacak gövdenin uzunluğuna eşit bir vektör oluşturur. Vektörün uzunluğu, saldırganların vektör oluşturulduğunda işlemin çökmesine neden olacak kadar yüksek bir değer belirleyebildiği Content-Length başlığı tarafından belirlenir. HTTP sunucuları genellikle güvenilir olmayan kaynaklardan veri aldığından, böyle bir saldırı düşünülebilir. Bu, Hyper veya buna dayalı çerçeveler kullanan tüm projeler için geçerlidir.

Belgelerde zaten bulunan düzeltme


Uzunluk kısıtlaması olmasına rağmen to_bytes zorunlu değil, ancak son zamanlarda C ile birlikte Linux’un resmi çekirdek dili haline gelen Rust için resmi belgeler, sorunla ilgili uyarıya ek olarak bir çözüm de sunuyor. kontrol etme hakkında content-length yukarıda açıklanan saldırılar kolayca püskürtülebilir. Belgeler aşağıdaki örneği sağlar:


use hyper::{body::HttpBody};

let response = client.request(request).await?;

const MAX_ALLOWED_RESPONSE_SIZE: u64 = 1024;

let response_content_length = match response.body().size_hint().upper() {
Some(v) => v,
None => MAX_ALLOWED_RESPONSE_SIZE + 1 // Just to protect ourselves from a malicious response
};

if response_content_length < MAX_ALLOWED_RESPONSE_SIZE {
let body_bytes = hyper::body::to_bytes(response.into_body()).await?;
println!("body: {:?}", body_bytes);
}


JFrog’un işaret ettiği sorun, Hyper’ın DoS saldırılarına karşı ilk kez savunmasız kalması değil. Zaten 2014 ve 2015’te istek başlıklarının uzunluğuyla ilgili sorunlar vardı. Güvenlik açığıyla ilgili orijinal uyarı ve daha ayrıntılı bir açıklama JFrog’un blogunda bulunabilir.



iX Magazine'den daha fazlası



iX Magazine'den daha fazlası




(psst)



Haberin Sonu