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
VLC_CVE-2021-25804_Analysis — Analisi tecnica approfondita di CVE-2021-25804, una vulnerabilità del parser AVI di VLC. Include causa principale, diff delle patch e primitive di sfruttamento per ricercatori di sicurezza. | Kitploit
Strumenti/GitHubGitHub/dshankle/vlc_cve-2021-25804_analysis
Analisi delle VulnerabilitàAnalisi del CodiceExploitAnalisi di BinariPaper e RicercaApprendimento e Formazione
GitHubdshankle/vlc_cve-2021-25804_analysis

VLC_CVE-2021-25804_Analysis

Analisi tecnica approfondita di CVE-2021-25804, una vulnerabilità del parser AVI di VLC. Include causa principale, diff delle patch e primitive di sfruttamento per ricercatori di sicurezza.

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
Vedi Repository
3 anni faNon ancora revisionato

Un file AVI può avere tracce multiple. Ad esempio, una traccia audio e una traccia video.

Per analizzare un numero arbitrario di tracce, VLC deve prima determinare se una determinata traccia è finita e riproducibile. Due variabili vengono impostate con questo scopo. Entrambe chiamate i_track.

La variabile p_sys rappresenta il file AVI ai nostri fini. Quindi la variabile i_track "ufficiale" che verrà utilizzata per fare riferimento alle tracce determinate come finite e riproducibili è p_sys->i_track. Viene inizializzata con una macro qui:

root@kitploit:~
```
TAB_INIT(p_sys->i_track, p_sys->track);
//#define TAB_INIT( count, tab ) do {(count) = 0; (tab) = NULL; } while(0)
```

Nel frattempo, una seconda variabile i_track viene impostata per contare TUTTE le tracce indipendentemente dal fatto che siano finite/riproducibili.

root@kitploit:~
```
i_track = AVI_ChunkCount( p_hdrl, AVIFOURCC_strl, true );
```

La seconda i_track rappresenta tutti i chunk che iniziano con 'strl'. Controlla un ciclo 'for' che imposta la variabile p_sys->i_track solo se supera una serie di controlli:

root@kitploit:~
```
for( unsigned i = 0 ; i < i_track; i++ )
{
    ...

TAB_APPEND( p_sys->i_track, p_sys->track, tk );
//#define TAB_APPEND( count, tab, p ) {TAB_APPEND_CAST( , count, tab, p )}
//TAB_APPEND_CAST( ,p_sys->i_track, p_sys->track, tk)
        //if( (count) > 0 ) (tab) = cast realloc( tab, sizeof( *(tab) ) * ( (count) + 1 ) ); 
        //else  (tab) = cast malloc( sizeof( *(tab) ) );    
        //if( !(tab) ) abort();                       
        //(tab)[count] = (p);                         
        //(count)++; //p_sys->i_track viene incrementato qui
}
```

Durante un ciclo 'for' successivo, la variabile p_sys->i_track viene utilizzata come numero di chunk in una chiamata a AVI_ChunkFind, che restituisce l'n-esimo chunk corrispondente a un dato valore FOURCC, nel nostro caso 'strl':

root@kitploit:~
```
for( unsigned i = 0 ; i < p_sys->i_track; i++ )
{
    avi_track_t         *tk = p_sys->track[i];

    if( tk->fmt.i_cat != AUDIO_ES ||
        tk->idx.i_size < 1 ||
        tk->i_scale != 1 ||
        tk->i_samplesize != 0 )
        continue;
        
    //CVE-2021-25804
    avi_chunk_list_t *p_strl = AVI_ChunkFind( p_hdrl, AVIFOURCC_strl, i, true );
    //successivamente cambiato in: avi_chunk_list_t *p_strl = AVI_ChunkFind( p_hdrl, AVIFOURCC_strl, tk->fmt.i_id, true );

    avi_chunk_strf_t *p_strf = AVI_ChunkFind( p_strl, AVIFOURCC_strf, 0, false );
    if( !p_strf || p_strf->i_cat != AUDIO_ES )
        continue;

    const WAVEFORMATEX *p_wf = p_strf->u.p_wf;
```

Mentre p_sys->i_track conta il numero corretto di tracce completate, non tiene traccia di quale numero di chunk fosse stato impostato. Ciò significa che se esiste un chunk strl non valido prima di quello valido, il primo chunk verrà correttamente ignorato durante l'impostazione dell'oggetto traccia, ma quando viene chiamato ChunkFind, selezionerà comunque il primo chunk non valido.

Dopo la creazione di CVE-2021-25804, il problema è stato risolto cambiando la variabile del numero di chunk in ChunkFind da i a tk->fmt.i_id. tk->fmt.i_id viene impostato appena sopra la chiamata a TAB_APPEND() che abbiamo visto prima:

root@kitploit:~
```
tk->fmt.i_id = i;

if( p_strn && p_strn->p_str )
    tk->fmt.psz_description = FromACP( p_strn->p_str );
//vedi es_format_truncated.c 
tk->p_es = es_out_Add( p_demux->out, &tk->fmt );


TAB_APPEND( p_sys->i_track, p_sys->track, tk );
```

Questo sembra risolvere il problema poiché tk->fmt.i_id è impostato su i e quindi il chunk completato dovrebbe essere quello selezionato da ChunkFind(). Tuttavia, i test rivelano che in realtà il valore di tk->fmt.i_id è impostato su -1 al momento della chiamata incriminata a ChunkFind(). Questo è il valore di inizializzazione impostato durante una chiamata a es_format_Init().

root@kitploit:~
```
void es_format_Init( es_format_t *fmt,
                 int i_cat, vlc_fourcc_t i_codec )
{
    memset(fmt, 0, sizeof (*fmt));
    fmt->i_cat                  = i_cat;
    fmt->i_codec                = i_codec;
    fmt->i_profile              = -1;
    fmt->i_level                = -1;
    fmt->i_id                   = -1;
    fmt->i_priority             = ES_PRIORITY_SELECTABLE_MIN;
    fmt->psz_language           = NULL;
    fmt->psz_description        = NULL;
    fmt->p_extra_languages      = NULL;

    if (fmt->i_cat == VIDEO_ES)
        video_format_Init(&fmt->video, 0);

    fmt->b_packetized           = true;
    fmt->p_extra                = NULL;
}

```

Questa inizializzazione avviene nello stesso ciclo 'for' in cui fmt->i_id viene impostato su i.

root@kitploit:~
```
    for( unsigned i = 0 ; i < i_track; i++ )
{
    ...
     switch( p_strh->i_type )
    {
        case( AVIFOURCC_auds ):
        {
            es_format_Init( &tk->fmt, AUDIO_ES, 0 );
            ...
        }
            ...
    }
    tk->fmt.i_id = i;

    if( p_strn && p_strn->p_str )
        tk->fmt.psz_description = FromACP( p_strn->p_str );

    tk->p_es = es_out_Add( p_demux->out, &tk->fmt );

    TAB_APPEND( p_sys->i_track, p_sys->track, tk );
}

```
Scarica lo strumento