Argo: 코드베이스의 보안 취약점을 분석하는 LLM 기반 SAST 도구
요약
Argo는 LLM 기반의 SAST(Static Application Security Testing) 도구로, 기존 규칙 기반 분석기의 한계를 넘어 인간 감사자처럼 소스 코드에서 보안 취약점을 찾아냅니다. 이 도구는 로컬 모델을 사용하여 무료로 작동하며, 발견된 취약점에 대해 패치 제안 및 재현 가능한 증거를 제공하여 높은 신뢰도를 자랑합니다.
핵심 포인트
- LLM 네이티브 SAST 방식으로 소스 코드의 보안 취약점을 분석합니다.
- 규칙 기반 방식과 달리 로직/권한 관련 버그를 잡아내며, 패치 제안 및 검증까지 가능합니다.
- 로컬 모델(Ollama 등)을 지정하여 실행할 경우 비용 없이 사용할 수 있습니다.
- 발견된 모든 취약점에 대해 재현 가능한 증거와 반박 시도를 통해 신뢰성을 높였습니다.
Argus Panoptes, 모든 것을 보는 감시자 — 당신의 코드를 수백 개의 눈으로 관찰합니다.
실시간 발견 사례: gigioneggiando.github.io/argo · Wiki · Discussions · Changelog
단순한 벤치마크 점수가 아닙니다. 실제 오픈 소스 프로젝트에서 발생한 풀 리퀘스트(pull requests), 공개된 어드바이저리(advisories), 그리고 실질적인 CVE(Common Vulnerabilities and Exposures)를 다룹니다.
15개 프로젝트 감사 및 공개 · 53개의 공개 PR · 53개 이미 해결됨 · 3개의 할당된 CVE · **93%*의 실제 세계 정확도
| Project | Stars | Severity | Result |
|---|---|---|---|
| ds4 — antirez, Redis의 원작자 | 21k★ | Critical | Pre-auth double-free, 수정됨 |
| ... |
- 독립적인 유지보수자(independent maintainer) 판정이 내려진 134개의 발견 사례를 기준으로 측정되었습니다. 이 수치에는 아직 분류 중인 발견 사례, 이미 알려진 문제의 중복 건, 그리고 범위를 벗어난 거절 사례는 포함되지 않았습니다. 왜냐하면 이들 중 어느 것도 근본적인 보안 주장이 정확했는지 여부를 반영하지 않기 때문입니다. 124건은 진본으로 확인되었고, 10건은 오탐지(false positives)로 기각되었습니다.
Argo는 LLM을 분석가처럼 구동하여 소스 코드에서 보안 취약점을 찾아냅니다. 이는 규칙에 그래프를 대조하는 방식이 아니라 인간 감사자가 코드를 읽는 방식과 유사합니다. 어떤 코드베이스든 — 로컬 폴더, 비공개 리포지토리, 또는 공개 리포지토리에 — 지정하면 검토 가능한 취약점 보고서를 생성합니다. 유료 백엔드 대신 로컬 모델(Ollama, LM Studio)을 지정하여 실행할 경우 무료로 작동합니다.
위치 및 특징. Argo는 LLM 네이티브 SAST (Static Application Security Testing) 도구입니다. 이는 규칙 기반 정적 분석기(CodeQL, Semgrep)의 보완재이자 대안입니다. 작성해야 할 것이 전혀 없으며(쿼리나 규칙 팩 불필요), 패턴 매칭으로 놓치는 로직/권한 관련 버그를 잡아냅니다. 다만, 포괄적이기보다는 확률적이라는 단점이 있습니다(design-decisions 참조). 기본적으로 소스 기반 정적 분석을 수행하며, 선택적인 ASan/런타임 검증은 격리되고 외부 통신이 차단된 복사본에서만 실행되며, 선택적인 실시간 검증은 별도의 권한 게이트와 범위 잠금(scope-locked)을 거칩니다. 이는 퍼저(fuzzer)나 심볼릭 실행기(symbolic executor)가 아닙니다.
버그 바운티 분류는 전체 도구가 아닌 한 가지 전문화된 모드일 뿐입니다. (Two modes 참조)
발견하고 증명한다— 선택적 복구(opt-in remediation)는 발견된 취약점마다 패치를 제안하고 이를 격리된 사본에서 컴파일하여 검증합니다. 선택적 런타임/실시간 검증 및 ASan PoC 생성은 단순한 주장이 아닌, 실제 재현 가능한 충돌 추적(crash trace)이나 HTTP 증거를 통해 취약점을 보고합니다.당신에게 거짓말을 하도록 만들어지지 않았다— 두 번째 모델은 모든 발견된 취약점을 반박하려고 시도하며, 이는 프로젝트 자체의 문서와 커밋 기록과 교차 확인되고, 독립적인 세션 하나가 당신에게 전달되기 전에 각 생존 사례를 소스에서 재추론합니다. 불확실한 것은 플래그가 지정되며, 절대 조용히 누락되지 않습니다.구문뿐만 아니라 의도를 읽는다— recon은 감사(audit)가 시작되기 전에 코드가 지켜야 하는 보안 불변성(security invariants)을 추출하여, 패턴 추측이 비즈니스 로직을 버그로 오인하는 대신 폐쇄형 검증(closed-ended verification)으로 사냥을 바꿉니다.위협 기반— 선택적 웹 OSINT(CVEs, 권고 사항, 기록)가 모든 감사를 지원합니다.다중 백엔드, 완전 무료 포함— Claude Code, Codex, Gemini 또는 로컬 오픈 소스 모델(Qwen, DeepSeek via Ollama/LM Studio)을 사용할 수 있습니다. 동일한 파이프라인에 비용 선택만 다릅니다.심문 채팅(Interrogation chat)—
코드가 무엇을 해야 하는지를 먼저 파악한 다음, 무엇이 잘못되었는지 찾아내고, 소프트웨어와 위협을 분류하며, 단 하나의 감사 프롬프트를 작성하기 전에 스스로 정보를 습득합니다. 또한 첫 번째 검토에서 놓친 부분에 대해 각 영역을 재감사하고, 살아남기 전에 모든 발견 사항을 능동적으로 깨뜨리려고 시도합니다. 진정으로 불확실한 발견 사항은 그렇게 말하며 — 구체적인 열린 질문이 첨부된 채로 유지되며, 단지 완전해 보이기 위해 "확인됨"이라고 강제로 라벨링하지 않습니다. 대화 도중에 스스로의 오탐지(false positive)를 수정하고 미탐지(false negative)를 인정하는 실제 편집되지 않은 기록을 확인해 보세요.
이 모든 과정이 Argo가 무오류(infallible)라는 것을 의미하지는 않습니다 — 이는 확률론적 도구이며, 이 문서 전반에 걸쳐 그렇게 명시합니다 (design-decisions.md 참조). 큐레이션된 데모가 아닌 실제 수정되지 않은 오픈 소스 코드를 대상으로 작동하는 모습을 확인하세요: 실시간 발견 사항(live findings).
Argo는 동일한 다단계 엔진 위에서 두 가지 모드로 실행됩니다:
일반 코드 감사 (기본값) |
버그 바운티 분류 (Bug-bounty triage) |
|
|---|---|---|
입력 |
폴더 또는 저장소 — 간략 설명 없음 |
프로그램 개요(program brief) (--brief) + 링크 + 저장소 |
범위 |
소스 코드만, 코드로부터 합성됨 (제로 토큰 입력) | 개요에서 파싱됨 (자산, RoE, 제외 항목) |
용도 |
사용자 자신의 / 비공개 / 개인 코드, OSS 검토, CTF, 연구 | 안전한 항구(safe harbor)가 적용된 범위 지정 프로그램 |
추가 기능 |
— | 제출 초안, 범위 필터링, 교차 실행 재제출 추적 |
자신의 코드를 감사하는 것이 일반적인 경우입니다: --brief를 생략하고, --repo를 로컬 폴더에 지정하면 됩니다. 이 저장소는 읽기 전용으로 마운트되며 어딘가에 푸시되지 않습니다 (로컬/OSS 모델은 소스를 완전히 장치 내에 유지하며; 클라우드 백엔드는 분석을 위해 API로 보냅니다). 버그 바운티 모드는 여기에 프로그램별 스캐폴딩(scaffolding)을 추가합니다.
Argo는 승인된 보안 검토를 위한 것입니다 — 사용자 자신의 코드, 안전한 항구가 적용된 버그 바운티 프로그램, CTF 또는 연구입니다. 오케스트레이터에서 다음 세 가지 제약 조건이 강제되며, 프롬프트에 맡겨지지 않습니다:
절대 자동 제출하지 않음. 파이프라인은 초안(drafts) 단계에서 멈추며; 제출은 항상 인간의 행동입니다.기본적으로 실시간 호스트와 접촉하지 않음, 심지어 source_and_live 모드에서도 마찬가지입니다.
targets — 분석은 정적(static)으로 소스 코드에 대해 수행되며, 라이브 검증 단계는 프로그램 규칙 내에서 직접 실행할 수 있는 텍스트 계획으로 생성됩니다 (DoS 금지, 스캐닝 금지). 유일한 옵트인 예외는 게이티드된 argo live 스테이지(stage)입니다 (기본값 off, --i-have-authorization 필요): 승인된 참여의 경우, 발견 사항을 확인하기 위해 경계가 설정되고(bounded), 범위 내에만(in-scope-only) 읽기 전용이며, 제한적이고, 감사 로그가 기록되는 요청을 수행합니다. 모든 요청은 등록된 범위 내 자산(in-scope asset)에 잠겨 있으며 (범위 외/알 수 없는 호스트는 강하게 차단됩니다). 가드레일 §2c 참조. 읽기 전용 레포지토리 세션마다: 파이프라인은 아무것도 패치하지 않습니다.
또한, 범위 내에서 금지된 기술(예: "DoS 금지")은 생성되는 모든 프롬프트에 전달되며, 만약 이들이 누락되면 프롬프트 렌더링이 실패합니다 (모델이 이를 의역할 경우 원문 그대로 재삽입됨 — 가드레일 참조).
argo/
cli.py
models.py # 범위 및 발견 사항을 위한 pydantic 모델
...
일반적인 코드 감사를 위해서는 이 모든 것이 필요하지 않습니다 — 단지 argo pipeline --repo ./your-code만 필요합니다 (두 가지 모드 참조). 아래 입력값들은 프로그램 개요(program brief)가 범위와 규칙을 정의하는 버그 바운티 모드에 적용됩니다.
프로그램마다 세 가지 별개의 항목이 세 개의 다른 위치에 들어갑니다.
프로그램 설명(Program description) -> --brief로 전달되는 텍스트 파일입니다. 플랫폼의 전체 프로그램 페이지를 붙여넣으세요 (범위, 규칙, 보상, 제외 사항, "DoS 금지"). 유용한 링크(Useful links) (사이트, 문서, 보안 페이지, 권고 이력) -> 한 줄에 하나씩, --links로 전달되는 텍스트 파일입니다. 이것들은 코드가 아닙니다. 코드 저장소(Code repository) (예: 공식 GitHub) -> 링크가 아니라 분석할 코드베이스이며, --repo로 전달됩니다.
기억하기 쉬운 방법: 에이전트가 이해하기 위해 읽어야 하는 것이라면 (사이트, 문서, 권고 사항) -> links.txt입니다.
만약 그것이 분석해야 하는 것(코드)이라면 -> --repo입니다.
예시. 프로그램 폴더:
brief.md
ACME CMS — 버그 바운티 프로그램
범위: app.acme.com, api.acme.com, acme/acme-cms 레포지토리
범위 외: *.staging.acme.com, 서드파티 플러그인
...
links.txt
...
실행:
Stage 2는 scope에서 링크를 가져와 모든 사용자 지정 프롬프트의 맨 위에 주입하여, 프롬프트가 처음부터 문서를 읽고 권고 사항을 확인할 위치를 알도록 합니다. 전체 scope.json 형식과 모든 필드: docs/architecture.md.
argo pipeline --brief ... --links ... --repo ... # 1-5, 제출 전에 중지
argo pipeline --brief ... --repo ... --verify # + 보고하기 전 deep-verify
argo pipeline --brief ... --repo ... --verify --asan-poc # + C/C++ 생존자에 대한 실제 ASan 충돌 추적
...
자신 또는 사설 로컬 코드를 감사하십니까? --brief를 생략하고 --repo를 로컬 폴더에 지정하십시오 (git 저장소일 필요가 없으며, 어디에도 푸시되지 않습니다). Argo는 해당 폴더에서 최소한의 소스만으로 구성된(source-only) 범위를 합성하여 이를 감사합니다. 클라우드 백엔드(Claude / Codex / Gemini)는 소스를 해당 제공업체의 API로 전송하여 분석하며 — 오직 로컬/OSS 모델(--codex-oss)만이 모든 것을 **완전히 온디바이스(on-device)**에 유지합니다.
백엔드를 선택하십시오 (기본값 headless = Claude Code):
argo pipeline ... --runner codex # Codex CLI / OpenAI
argo pipeline ... --runner codex --codex-oss --codex-local-provider ollama --codex-model qwen2.5-coder:32b
argo pipeline ... --runner gemini # Gemini CLI / Google
저비용 모드:
argo pipeline ... --runner mock # 더미(fixtures)를 사용하여 전체 접착제(glue)를 테스트하며, 토큰 사용량 0
argo pipeline ... --dry-run # ingest+recon을 실행하고 생성된 프롬프트를 보여준 후, 중지함
모든 명령어와 모든 플래그는 더 많은 예시와 함께 다음에서 확인할 수 있습니다: docs/cli-reference.md.
빌드 과정이 필요 없는 웹 인터페이스(프로그램을 붙여넣고, 저장소를 지정하고, argo가 실시간으로 실행되는 것을 지켜보고, 결과를 읽은 후 분석과 채팅하는 기능)는 webapp/에 포함되어 있으며 API를 통해 서비스됩니다:
python -m argo.cli serve --open # 시작하고 http://127.0.0.1:8000을 엽니다
기본적으로 무료 mock 러너로 설정되어 있으며, 고급 패널에서 실제 실행(예산 사용)으로 전환할 수 있습니다. docs/ui.md 및 docs/api.md를 참조하십시오.
각 단계는 이전 단계의 출력을 읽고 자체적인 결과를 작성합니다 — 상세한 데이터 흐름과 AgentRunner 추상화는 docs/architecture.md를 참조하세요.
| 단계 | 기능 |
|---|---|
| 0 연구 (선택 사항) | 웹 OSINT — CVE, 권고 사항, 프로젝트 이력 등을 수집하여 감사 시작 전 정찰(recon)을 수행합니다. |
| 1 데이터 수집 (Ingest) | 간략한 설명을 scope.json으로 구문 분석하고, 저장소를 읽기 전용으로 복제합니다. |
| 2 정찰 및 합성 (Recon + synthesis) | 소프트웨어를 분류하고 보안 불변성(security invariants)과 기준선에 맞는 참조를 추출하며, 사용자 지정 감사 프롬프트를 작성합니다. |
| 3 감사 (Audit) | 프롬프트별 에이전트 세션에서 발견 사항을 방출하며; 완전성 비평가(completeness-critic) 재검토는 첫 번째 검토에서 놓친 것을 포착합니다. |
| SCA (선택 사항) | 알려진 권고 사항과 연결된 의존성 고정 버전(dependency-pinned versions)에 플래그를 지정합니다. |
| 두 번째 의견 (Second opinion, 선택 가능) | N개의 독립적인 블라인드 정찰 및 감사 패스를 수행하고, 검증 전에 병합합니다. |
| 4 검증 (Validate) | 중복 제거 후 적대적 검증(adversarial validation)을 수행합니다 — 새로운 세션이 각 생존 항목을 반박하려고 시도합니다. 다운그레이드-삭제 금지: 증명 가능한 모순만 삭제됩니다. |
| 상호 확인 (Corroborate, 선택 사항) | 생존 항목들을 프로젝트 자체 문서 및 VCS 이력과 교차 확인하여 |
5 보고서 | REPORT.md, 확인된 심각도 순으로 정렬되며, 확정된 취약점당 초안 제출이 하나씩 추가됩니다.
동일한 파이프라인에 교체 가능한 엔진을 선택하세요: --runner headless
(Claude Code) ·
--runner codex
(Codex CLI → OpenAI, 또는 로컬 오픈소스 모델인 Qwen/DeepSeek과 같은 모델을 위한 --codex-oss --codex-local-provider ollama|lmstudio를 사용하세요. 이는 완전히 무료이며 장치에서 실행됩니다.) · --runner gemini
(Gemini CLI → Google, Claude와 같이 단계별로 프로/플래시/플래시-라이트의 계층적 구조를 가집니다.) · --runner mock
(무료 더미 데이터). 백엔드와 계정은 속도 제한이나 일시적인 오류에 따라 투명하게 연결되므로, 장시간 실행 시 중단되는 대신 스스로 복구됩니다. 전체 단계별 모델 기본값, 복원력/폴백 설계, 그리고 교차 모델 연구는 docs/backends.md를 참조하세요.
실행이 중단되어도(충돌, Ctrl+C, 속도 제한) 손실되지 않습니다. 모든 단계가 출력을 원자적으로 기록하므로 argo resume RUN_ID
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub AI Tools의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기