Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2025-50361 — Informe y PoC de desbordamiento de búfer global en SmallBASIC anterior a 02364eff880ba62afac67bcceebafade2b40d21f | Kitploit
Herramientas/GitHubGitHub/ch1keen/cve-2025-50361
Análisis EstáticoAnálisis de VulnerabilidadesAnálisis de CódigoExplotaciónAprendizaje y EducaciónExplotación de Binarios
GitHubch1keen/cve-2025-50361

CVE-2025-50361

Informe y PoC de desbordamiento de búfer global en SmallBASIC anterior a 02364eff880ba62afac67bcceebafade2b40d21f

Ver Repositorio
3hace 1 añoAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

Desbordamiento de Búfer Global en SmallBASIC

SmallBASIC es un intérprete del lenguaje BASIC rápido y fácil de aprender, ideal para cálculos cotidianos, scripts y prototipos. SmallBASIC incluye funciones trigonométricas, matriciales y de álgebra, un IDE integrado, una potente biblioteca de cadenas, comandos del sistema, sonido y gráficos, junto con una sintaxis de programación estructurada.

  • Versión afectada: Antes del commit 02364eff880ba62afac67bcceebafade2b40d21f (Committed el 2025.06.06).
  • Versión corregida: Commit 02364eff880ba62afac67bcceebafade2b40d21f. Ver el commit

Causa Raíz

En la línea 277 de src/platform/sdl/main.cpp, se llama a strcpy para copiar argv a la variable global opt_command, que está definida en src/common/smbas.h. La variable global es un arreglo de tamaño fijo, según la macro OPT_CMD_CZ definida en el mismo archivo.

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;
    }

Según src/common/smbas.h, OPT_CMD_CZ está definido como 1024.

root@kitploit:~
#define OPT_CMD_CZ 1024

A diferencia de la función strlcpy, strcpy no comprueba cuántos bytes se van a copiar. Por lo tanto, se pueden copiar más de 1024 bytes al arreglo opt_command. Dado que el argumento de la línea de comandos puede tener más de 1024 bytes, la entrada puede sobrescribir otros objetos. Esto puede hacer que el programa sbasicg tenga comportamientos inesperados.

Ten en cuenta que la longitud máxima de la cadena que se puede usar en el símbolo del sistema en Windows es de 8191 caracteres. En Linux, la longitud depende de ARG_MAX y 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

Desencadenante (Prueba de Concepto)

Construye el proyecto SmallBASIC, luego ejecuta

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

Esto provoca un Desbordamiento de Búfer Global al analizar el argumento de la línea de comandos implementado en la función main. A continuación se muestra la salida de Address 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

Impacto

El impacto de la vulnerabilidad no está claro. Pero un Desbordamiento de Búfer Global puede sobrescribir otras variables globales, lo que puede llevar a sobrescribir banderas y configuraciones del programa.

El Parche

La vulnerabilidad se corrigió reemplazando casi todos los strcpy por strlcpy, incluyendo el problema que reporté.

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

Ver el commit para ver el parche detallado.

Cronología de Divulgación

  • 2025.05.18: Informe de vulnerabilidad enviado al mantenedor ([email protected]).
  • 2025.05.18: Reportado a MITRE.
  • 2025.06.06: El mantenedor publicó el parche.
  • 2025.07.09: Divulgación pública.
  • 2025.08.13: MITRE asignó CVE-2025-50361.
Descargar herramienta