Dicklesworthstone/ultimate_bug_scanner 사용법 안내
요약
ultimate_bug_scanner (ubs)는 1000개 이상의 버그 패턴을 포착하는 강력한 명령어 기반 도구입니다. 이 스캐너는 다양한 언어(JS/TS, Python, C++, Rust 등)의 리포지토리를 분석하여 Null 포인터 충돌, 누락된 await, 버퍼 오버플로우 등 프로덕션 환경에서 발생하기 쉬운 치명적인 버그들을 자동으로 찾아냅니다. 개발자가 빠르고 정확하게 코드를 검증할 수 있도록 돕는 전문 디버깅 도구입니다.
핵심 포인트
- 1000개 이상의 패턴을 포착하는 강력한 버그 스캐너입니다.
- JS/TS, Python, Rust 등 다국어 지원으로 광범위하게 사용 가능합니다.
- Null 접근, 누락된 await 등 치명적인 프로덕션 버그를 찾아냅니다.
- JSON 형식의 기계가 읽을 수 있는 출력을 제공하여 자동화에 용이합니다.
1000개 이상의 버그 패턴을 포착하는 단 하나의 명령어 (항상 main, 캐시-파괴됨)
curl -fsSL "https://raw.githubusercontent.com/Dicklesworthstone/ultimate_bug_scanner/main/install.sh?$(date +%s)"
| bash -s --
또는 Homebrew를 통해 (macOS/Linux):
brew install dicklesworthstone/tap/ubs
확인 요청 없이 모든 것을 처리하고 싶으신가요? easy-mode로 라이브하며 모든 의존성을 자동 설치하고, 모든 프롬프트를 수락하며, 로컬 코딩 에이전트를 감지하고 그들의 품질 가드레일을 추가 질문 없이 연결하세요:
curl -fsSL "https://raw.githubusercontent.com/Dicklesworthstone/ultimate_bug_scanner/main/install.sh?$(date +%s)" \
| bash -s -- --easy-mode
참고: Windows 사용자는 Git Bash 내에서 설치 스크립트 한 줄을 실행하거나, WSL for Windows를 사용해야 합니다.
에이전트 컨텍스트에서 기계가 읽을 수 있는 출력 사용. stdout = 데이터, stderr = 진단(diagnostics), exit 0 = 성공.
# 현재 리포지토리를 스캔합니다 (JSON)
ubs . --format=json
# 토큰 최적화 출력 (TOON; toon_rust의 인코더가 필요하며 — install.sh 또는 `ubs doctor --fix`로 가져올 수 있습니다; 없으면 ubs는 오류 엔벨로프로 2를 반환합니다)
...
모든 기계 형식은 stdout에 정확히 하나의 문서(또는 하나의 JSONL 스트림)를 출력하며, 다음을 통해 검증됩니다:
ubs --schema
; status
이 ok (요청된 모든 스캐너가 완료됨), partial (스캔은 불완전하지만 사용 가능한 무언가가 반환됨) 또는 error (모듈이 전혀 실행되지 못했고 다른 어떤 스캐너도 결과를 생성하지 못함)이며, 사전 스캔 거부는 exit 2의 오류 엔벨로입니다 (아래
클라이언트가 일치하는 서비스가 실행되고 있지 않으면 일반 스캔으로 폴백(fallback)합니다.
설치 프로그램과 자체 업데이트에는 체크섬 고정된 동반 파일이 포함되어 있으며, 포터블 번들에도 포함됩니다. 수정된 파일을 위한 예열 엔진은 아직 미완성입니다.
서비스 가이드를 참조하세요.
Claude Code, Codex, Cursor 및 기타 AI 코딩 에이전트를 사용하여 그 어느 때보다 빠르게 코딩하고 있습니다. 이전에는 며칠이 걸리던 기능을 몇 분 만에 배포하고 있습니다. 하지만 고통스러운 진실은 이렇습니다:
JavaScript/TypeScript 예시 (Python, Go, Rust, Java, C++, Ruby 등에서도 유사한 패턴이 존재합니다):
// ❌ 치명적인 버그 #1: 발생하기를 기다리는 Null 포인터 충돌
const submitButton = document.getElementById('submit');
submitButton.addEventListener('click', handleSubmit); // 💥 요소가 존재하지 않으면 충돌함
...
이러한 각 버그는 프로덕션 환경에서 디버깅하는 데 3~6시간의 비용이 들 수 있습니다. 유사한 문제는 모든 언어에 만연합니다: 보호되지 않은 null 접근, 누락된 await, eval()로 인한 보안 취약점, strcpy()로 인한 버퍼 오버플로우, .unwrap() 패닉, goroutine 누수... 아마도 이 모든 것을 겪었을 것입니다.
ubs는 동일한 리포지토리 내에서 JavaScript/TypeScript, Python, C/C++, Rust, Go, Java, Ruby, Swift, C#, Elixir를 자동 감지하고 언어별 스캐너로 분산합니다. - 각 스캐너는 modules/ubs-<lang>.sh 아래에 존재하며, 독립적으로 배포되고 일관된 다운스트림 도구링을 위해 --format text|json|jsonl|sarif|toon을 지원합니다. - 모듈은 지연 로드(Lazy download)되며 (PATH → 리포 modules/ → ${XDG_DATA_HOME:-$HOME/.local/share}/ubs/modules에 캐시됨) 실행 전에 검증됩니다. - 모든 언어의 결과는 jq를 통해 하나의 텍스트/JSON/SARIF 보고서로 병합되므로, CI 시스템과 AI 에이전트는 단일 아티팩트만 파싱하면 됩니다.
- 지연 로드된 모든 모듈(및 해당 헬퍼 애셋)은 메타-러너에 고정된 SHA-256 체크섬과 함께 배포됩니다. GitHub에서 가져온 파일은 수정 방지를 위해 실행되기 전에 검증됩니다.
- 캐시는
${XDG_DATA_HOME:-$HOME/.local/share}/ubs/modules아래에 존재합니다.
기본적으로는 use --module-dir를 사용하여 모듈을 재배치할 수 있습니다 (예: CI 워크스페이스 내부). 이렇게 해도 동일한 검증 보장을 유지합니다. 언제든지 ubs doctor를 실행하여 환경을 감사할 수 있습니다. 이 명령어는 curl/wget 사용 가능 여부, 쓰기 가능한 캐시 디렉터리, 그리고 언어별 모듈 무결성을 확인합니다. --fix를 추가하면 누락되거나 손상된 모듈을 사전에 다시 다운로드합니다. 스캐너 실행은 여전히 --update-modules를 존중하지만, 이제 유효하지 않은 체크섬은 검증되지 않은 코드를 실행하는 대신 즉각적인 실패와 함께 해결 지침을 제공합니다. 개발자 Pre-commit Hook: 이 저장소는 모듈이 변경될 때 SHA256SUMS를 자동 업데이트하고 오래된 체크섬의 커밋을 차단하는 .githooks/pre-commit 훅을 포함하고 있습니다. 이를 통해 수동 개입 없이 모든 릴리스가 검증된 체크섬을 갖도록 보장합니다.Minisign 지원: 추가적인 확신을 위해 UBS_MINISIGN_PUBKEY를 설정하여 minisign을 통해 SHA256SUMS에 대한 암호화 서명을 검증할 수 있습니다.
--category=resource-lifecycle는 스캐너의 초점을 Python/Go/Java 리소스 위생(Context Manager, Defer Symmetry, Try-with-resources)에 맞춥니다. UBS는 자동으로 언어 세트를 생명주기 패크가 활성화된 것으로 좁히고 관련 없는 카테고리는 억제합니다.
--comparison=<baseline.json>은 최신 통합 요약을 저장된 실행과 비교(diff)합니다. 차이점(Deltas)은 콘솔 출력, JSON, HTML, 그리고 SARIF 자동화 메타데이터에 제공되어 CI가 회귀를 감지할 수 있게 합니다.--report-json=<file>은 아카이브하거나 팀원/CI와 공유할 수 있는 풍부한 요약(프로젝트, 총계, git 메타데이터, 선택적 비교 블록)을 작성합니다. --html-report=<file>는 총계, 기준선 대비 추세, 언어별 분석이 표시되는 독립적인 HTML 미리보기를 생성하며, PR이나 채팅 업데이트에 첨부하기 이상적입니다.- 모든 공유 가능한 출력물은 UBS가 GitHub 원격(remote)이 있는 git 저장소 내에서 실행될 때 GitHub 영구 링크를 주입합니다. 텍스트 출력은 path:line 참조를 주석 처리하고, stdout JSON에는 모든 발견 샘플에 git.* 메타데이터와 permalink를 추가하며, 병합된 SARIF 실행은 properties.permalink를 포함합니다.
각 결과 위치에서 versionControlProvenance 및 automationDetails와 함께 비교 ID별로 키가 지정됩니다. 퍼머링크는 하위 디렉터리를 스캔할 때도 리포지토리 루트를 기준으로 합니다.
Python – 카테고리 16은 모든 open() 호출을 일치하는 with open(...) 사용 및 명시적 encoding= 매개변수와 연관시키며, 카테고리 19는 modules/helpers/resource_lifecycle_py.py의 새로운 AST 헬퍼를 사용하여 모든 파일, 소켓, 서브프로세스, asyncio 태스크 및 컨텍스트 취소 경로를 순회합니다. 이 헬퍼는 별칭 임포트(alias imports), 컨텍스트 매니저(context managers), 그리고 await된 태스크를 해결하여 diff 카운트(acquire=X, release=Y, context-managed=Z)가 파일별 정확한 불균형을 보여줍니다.Go – 카테고리 5/17은 이제 Go AST 워커(modules/helpers/resource_lifecycle_go.go)를 실행하여 context.With* 호출에서 취소(cancel) 누락, time.NewTicker/NewTimer의 Stop 누락, os.Open/sql.Open의 Close 누락, 그리고 뮤텍스(Lock/Unlock) 대칭성 누락을 감지합니다. 카테고리 9는 또한 요청 쿼리/헤더/폼/프레임워크 값을 응답 헤더로 추적하며, 이들이 CR/LF를 제거하거나 거부하지 않는 경우에 한합니다. http.Redirect, 프레임워크 Redirect 호출 및 Location 헤더로의 리디렉션 대상을 추적하고, 동일 출처(same-origin) 또는 명시적 허용 목록 검증을 통과하지 못하는 요청 기반 역방향 프록시 대상이 httputil.NewSingleHostReverseProxy, ProxyRequest.SetURL, 또는 Director URL 변조로 흐르는 경우를 플래그 지정하며, 요청 데이터가 바인드 매개변수로 전달되지 않는 한 ExecContext/QueryContext, sqlx 스타일 헬퍼 또는 쿼리 빌더 술어(predicates)로 흐르는 요청 기반 SQL 텍스트를 플래그 지정하고, 자격 증명 기반 와일드카드 또는 반사 출처 CORS 응답을 플래그 지정하며, HttpOnly, Secure, 또는 SameSite 보호가 누락된 인증/세션 쿠키를 포착합니다. 발견 사항은 AST/리소스 헬퍼 또는 오염(taint) 패스 위치에서 직접 나오므로,
references 대신 거친 정규식 요약본을 사용합니다.Java / Kotlin – try-with-resources 외부에서 생성된 FileInputStream, 리더/라이터, JDBC 핸들 등과 같은 Category 5 표면(surfaces)은 물론, Category 19는 종료되지 않은 실행기 서비스 및 파일 스트림도 추적합니다. 또한 Category 4는 동일 출처(same-origin) 또는 명시적인 허용 목록 도우미가 먼저 적용되지 않는 한, 서블릿/Spring/Ktor 요청 매개변수, 헤더 및 주석 처리된 매개변수를 응답 헤더(sendRedirect, respondRedirect, Spring의 redirect:, RedirectView, ModelAndView, Location 등)와 리다이렉트 싱크(sinks)에 추적합니다. 요약 텍스트는 매니페스트 고정값(manifest fixtures)과 일치하므로, 회귀가 이 경고들을 삼키면 CI가 실패할 것입니다.
# 1) 기준선 JSON을 캡처합니다 (CI 아티팩트 또는 로컬 기록에 커밋)
ubs --ci --only=python --category=resource-lifecycle \
--report-json .ubs/baseline.json test-suite/python/buggy
...
latest.json에는 이제 Git 메타데이터(리포지토리 URL, 커밋, 블롭_베이스)와 comparison.delta 블록이 포함되며, latest.html은 델타를 요약하는 가벼운 대시보드를 렌더링합니다. SARIF 업로드도 비교 ID를 가져가므로 CI에서 반복 실행 시 자동화 ID별로 그룹화됩니다.
# 현재 디렉토리를 스캔합니다
ubs .
# 특정 디렉토리를 스캔합니다
...
# Git 인식 빠른 스캔 (변경 파일만)
ubs --staged # 커밋을 위해 스테이징된 파일을 스캔합니다
ubs --diff # HEAD 대비 작업 트리 변경 사항을 스캔합니다
...
- UBS는 일반적인 쓰레기(
node_modules, virtualenvs, dist/build/target/vendor, 에디터 캐시 등)를 자동으로 무시합니다. - 발견된 문제가 의도적인 경우 인라인 억제(Inline suppression)가 가능합니다: `eval(
verifier는 일치하는 릴리스에서 SHA256SUMS를 다운로드하고 서명을 검증합니다. 이때 UBS_MINISIGN_PUBKEY가 설정되어 있으면 minisign을 사용하고, 그렇지 않으면 릴리스의 키 없는 Sigstore 번들(SHA256SUMS.sigstore.json, 따라서 배포할 키가 없음)에 대해 cosign verify-blob을 사용합니다. 이는 install.sh를 확인한 후에만 실행됩니다. UBS_VERIFY_WITH=minisign|cosign는 경로를 강제하며, --insecure는 검증을 우회합니다 (권장되지 않음).
직접 실행하기 (설치 없음):
nix run github:Dicklesworthstone/ultimate_bug_scanner
기여자용 개발 셸:
nix develop
풀(Pull) 및 검사:
docker run --rm ghcr.io/dicklesworthstone/ubs-tools ubs --help
호스트 코드 스캔 (위험 인지: 컨테이너에 호스트 파일 시스템 접근 권한 부여):
docker run --rm -v /:/host ghcr.io/dicklesworthstone/ubs-tools bash -c "cd /host/path && ubs ."
참고
현재 이미지는 bash, curl, jq, 그리고 ripgrep만 포함합니다. 따라서 컨테이너 내부에서는 python3, unzip, 또는 ast-grep이 없으므로 AST 헬퍼와 JavaScript/TypeScript 스캔은 사용할 수 없습니다 (정규식 전용 언어는 여전히 스캔 가능).
ultimate_bug_scanner-s2k5.1을 빌드하면 이러한 런타임 종속성이 이미지에 추가됩니다.
- 릴리스 플레이북 (서명된 릴리스를 만드는 방법): docs/release.md
- 공급망 및 검증 모델: docs/security.md
설치 프로그램은 다음을 수행합니다:
- ✅
ubs명령어를 전역으로 설치 - ✅ast-grep설치/확보 (정확한 JS/TS 스캔에 필요; UBS는 고정된 바이너리를 자동 프로비저닝할 수 있음) - ✅ 선택적으로ripgrep설치 (10배 빠른 스캔용) - ✅ 선택적으로jq설치 (모든 언어 스캐너의 JSON/SARIF 병합에 필요) - ✅ 선택적으로typos설치 (문서 및 식별자에 대한 스마트 철자 검사기) - ✅ 선택적으로 toon_rust의toon인코더를--format=toon용으로 설치 (다이제스트 고정 릴리스 바이너리; `cargo install tru
as the fallback) - ✅ 선택적으로 설치
Node.js + typescript
(깊은 TypeScript 타입 추론 분석 활성화) - ✅ 자동 실행
ubs doctor
설치 후, ~/.config/ubs/session.md에 세션 요약 내용을 추가합니다.
-
✅ 준비 상태 사실 캡처 (ripgrep/jq/typos/toon/타입 추론) 및 저장 (
ubs sessions --entries 1) -
✅ git hook 설정 (심각한 버그가 있는 커밋 차단)
-
✅ Claude Code hook 설정 (파일 저장 시 스캔)
-
✅ AGENTS.md에 문서 추가
나중에 설치 프로그램이 발견한 내용을 다시 확인해야 하나요? ubs sessions --entries 1을 실행하여 가장 최근 세션 로그를 보거나(또는 팀원들에게 같은 요약본을 보여줄 수 있습니다).
“일단 작동하게 만드는” 버튼이 필요하신가요? --easy-mode 옵션을 사용하여 설치 프로그램을 실행하세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub AI Coding Assistants의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기