Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
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
codeql-buffer-overflow-variant — Variante synthétique de débordement de tampon de pile CWE-120 de CVE-2020-8597 (pppd EAP) comme cible d'analyse statique CodeQL | Kitploit
Outils/GitHubGitHub/anna-kravets/codeql-buffer-overflow-variant
Analyse StatiqueAnalyse Statique de Code (SAST)Analyse des VulnérabilitésAnalyse de Code
GitHubanna-kravets/codeql-buffer-overflow-variant

codeql-buffer-overflow-variant

Variante synthétique de débordement de tampon de pile CWE-120 de CVE-2020-8597 (pppd EAP) comme cible d'analyse statique CodeQL

Voir le dépôt

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 →
17il y a 1 moisPas encore vérifié
Partager

codeql-buffer-overflow-variant

Un programme C délibérément vulnérable d'environ 170 lignes, utilisé comme cible d'analyse statique CodeQL. Il reproduit la classe de bug de CVE-2020-8597 — le débordement de tampon sur la pile de rhostname dans l'EAP de pppd (CWE-120) — dans un programme qui ne partage aucun nom de fonction, aucune profondeur d'appel, ni aucune structure de dispatch avec pppd.

L'objectif est un test de généralité : une requête CodeQL écrite pour détecter le bug de pppd doit également se déclencher sur ce programme, sans modification. Si c'est le cas, la requête exprime la classe de bug plutôt que la forme du code d'origine.

Ce programme est intentionnellement dangereux et n'existe que pour l'analyse. Ne le déployez pas. Le bug qu'il reproduit est public (CVE-2020-8597, divulgué en 2020).

La classe de bug

Une longueur dérivée d'une entrée attaquante est copiée dans un tampon de taille fixe, sans garde reliant cette longueur à la taille du tampon.

Dans chaque cas, une vérification de bornes est présente — elle échoue simplement à relier les deux quantités qui comptent. Il existe exactement deux façons de se tromper, et le programme contient un exemple de chacune :

  • Bonne valeur, mauvaise borne. La longueur de copie est vérifiée, mais par rapport à la trame reçue au lieu de sizeof(dest). Empêche une lecture hors limites, ne fait rien contre l'écriture hors limites. (handle_hello)
  • Bonne borne, mauvaise valeur. La vérification nomme sizeof(dest) — elle ressemble exactement à une borne de tampon — mais contraint une variable différente de celle utilisée comme longueur de copie. (handle_stat)
  • La seconde est la plus difficile, et c'est ce qu'est la vérification morte de pppd vallen >= len + sizeof(rhostname) : une comparaison qui mentionne la taille de destination tout en contraignant quelque chose qui n'est pas la longueur de copie. Une requête qui demande seulement « une comparaison ici mentionne-t-elle sizeof(dest) ? » est réduite au silence par elle.

    Structure vs. pppd (pourquoi c'est une vraie variante)

    pppd / CVE-2020-8597ce projet
    Sourceread() sur le fd PPPrecvfrom() sur un socket UDP
    Dispatchstruct protent *protocols[] global, correspondance linéaire sur le n° de protocoleconst struct frame_op ops[] local au fichier, correspondance linéaire sur un tag de 1 octet
    Profondeur jusqu'au sinkget_input → (*input) → eap_input → eap_requestdispatch_frame → (*handle) → handle_hello
    Destinationchar rhostname[256]char name[64]
    Mauvaise gardevallen borné par le len du paquetvlen borné par le plen de la trame

    Les deux conservent la propriété qui en fait un flux de données, et non un grep : un appel indirect via une table de pointeurs de fonctions entre la source et le sink.

    HandlerLigneVérification présenteVerdict
    handle_hello()sink à :80vlen > plen - 2 — bonne valeur, mauvaise bornedoit se déclencher
    handle_echo()copie à :106vlen >= sizeof(buf) — les deux correctsdoit rester silencieux — contrôle négatif
    handle_stat()sink à :145hlen >= sizeof(report) — bonne borne, mauvaise valeurdoit se déclencher

    handle_stat est le cas discriminant. Sa vérification nomme sizeof(report), donc une requête qui accepte toute comparaison mentionnant la taille de destination le traite comme protégé et manque le bug. Pour l'attraper, il faut comparer la valeur vérifiée à la valeur utilisée comme longueur de copie — la numérotation globale des valeurs. Supprimez cela de la requête et ce handler devient un faux négatif tandis que tous les autres sites conservent leur verdict.

    Format de trame

    Un datagramme UDP = une trame :

    root@kitploit:~
    [ type : 1 ] [ length : 2, big-endian ] [ value : length bytes ]
    

    type 0x01 → hello, 0x02 → echo, 0x03 → stat. Une trame hello avec une longueur déclarée entre 65 et ~2045 déborde name[64]. Une trame stat transporte à la place deux longueurs d'un octet — une longueur d'en-tête et une longueur de corps — et toute longueur de corps supérieure à 32 déborde report[32], quelle que soit la longueur d'en-tête.

    Compilation

    root@kitploit:~
    make            # gcc -Wall -Wextra -O0 -g -o tlv_server tlv_server.c
    

    Linux/POSIX (sockets BSD). Compile proprement sans avertissement.

    Construire une base de données CodeQL

    CodeQL trace une compilation réelle, donc compilez à partir d'un état propre :

    root@kitploit:~
    make clean
    codeql database create db --language=cpp --command="make"
    # ou, sans l'étape de nettoyage :
    codeql database create db --language=cpp --command="make -B"
    

    Exécutez ensuite la requête de la Partie 3 contre db ; elle doit signaler le memcpy dans handle_hello et celui dans handle_stat, et rester silencieuse sur handle_echo. La requête et ses instructions d'exécution se trouvent dans codeql/.

    Le source change à chaque ajout d'un handler, donc reconstruisez la base de données — CodeQL capture un instantané du code au moment de database create et un db/ existant ne verra pas le nouveau code.

    Télécharger l’outil