Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
VLC_CVE-2021-25804_Analysis | Kitploit
Outils/GitHubGitHub/dshankle/vlc_cve-2021-25804_analysis
Analyse des VulnérabilitésAnalyse de CodeExploitationAnalyse de BinairesArticles et RechercheApprentissage et Éducation
GitHubdshankle/vlc_cve-2021-25804_analysis

VLC_CVE-2021-25804_Analysis

Voir le dépôt
il y a 3 ansPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

Un fichier AVI peut contenir plusieurs pistes. Par exemple, une piste audio et une piste vidéo.

Afin d’analyser un nombre arbitraire de pistes, VLC doit d’abord déterminer si une piste donnée est terminée et jouable. Deux variables sont définies dans ce but, toutes deux nommées i_track.

La variable p_sys représente le fichier AVI pour nos besoins. Ainsi, la variable i_track « officielle », qui sera utilisée pour référencer les pistes déterminées comme terminées et jouables, est p_sys->i_track. Elle est initialisée avec une macro ici :

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

Parallèlement, une seconde variable i_track est créée pour compter TOUTES les pistes, qu’elles soient ou non terminées/jouables.

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

La seconde variable i_track représente tous les chunks commençant par 'strl'. Elle contrôle une boucle 'for' qui ne définit la variable p_sys->i_track que si elle réussit une série de vérifications :

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 incremented here
}
```

Au cours d’une boucle 'for' suivante, la variable p_sys->i_track est utilisée comme numéro de chunk dans un appel à AVI_ChunkFind, qui renvoie le n-ième chunk correspondant à une valeur de chunk FOURCC donnée, dans notre cas '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 );
    //subsequently changed to: 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;
```

Bien que p_sys->i_track compte le nombre correct de pistes terminées, elle ne garde pas la trace du numéro de chunk correspondant. Cela signifie que s’il y a un chunk strl invalide avant le chunk strl valide, le premier chunk sera correctement ignoré lors de la création de l’objet piste, mais lorsque ChunkFind est appelé, il sélectionnera quand même le premier chunk, invalide.

Après la création de CVE-2021-25804, le problème a été corrigé en changeant la variable du numéro de chunk de ChunkFind de i à tk->fmt.i_id. tk->fmt.i_id est d’abord défini juste au-dessus de l’appel TAB_APPEND() que nous avons examiné plus tôt :

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

if( p_strn && p_strn->p_str )
    tk->fmt.psz_description = FromACP( p_strn->p_str );
//see 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 );
```

Cela semble corriger le problème, car tk->fmt.i_id est défini à i et le chunk terminé devrait donc être celui sélectionné par ChunkFind(). Cependant, les tests révèlent qu’en réalité, la valeur de tk->fmt.i_id est définie à -1 au moment de l’appel fautif à ChunkFind(). Il s’agit de la valeur d’initialisation définie lors d’un appel à 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;
}

```

Cette initialisation se produit dans la même boucle 'for' que celle où fmt->i_id est défini à 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 );
}

```
Télécharger l’outil