
임베디드 결함이 있는 Fix-Like 아티팩트
Fix Like Artifacts with Embedded Defects
AI 에이전트가 취약점을 얼마나 잘 패치하는지 측정하기 위한 연구 하네스.
FLAWED는 오픈소스 프로젝트를 알려진 취약 커밋 시점으로 체크아웃하고, AI 에이전트에게 버그 설명을 전달한 뒤 패치를 작성하도록 요청합니다. 에이전트는 실제 업스트림 수정 사항을 절대 볼 수 없습니다.
그런 다음 모든 패치가 격리된 컨테이너에서 검증, 감사, 채점되므로, 모델이 버그를 수정했는지뿐만 아니라 그 과정에서 새로운 버그를 도입했는지도 확인할 수 있습니다.
flowchart LR
spec[bug spec] --> clone
clone["clone<br/>(open net)"] --> generate
generate["generate<br/>(offline)"] --> validate
validate["validate<br/>(offline)"] --> ast["ast<br/>(offline)"]
generate -.->|"patch.diff"| store[(Postgres)]
validate -.->|"verdict"| store
ast -.->|"summary"| store
store --> ui[web UI + notebook]각 단계는 자체 컨테이너에서 실행됩니다. clone만 네트워크에 접근할 수 있습니다.
이후의 모든 단계는 LLM 제공자의 API로만 제한되므로, 에이전트가 실행 중간에
힌트나 업스트림 수정 사항을 가져올 수 없습니다.
FLAWED는 Claude, Codex, Gemini CLI를 동일한 입력으로 정면 비교합니다.
[!WARNING] FLAWED는 Docker 소켓(호스트에서 root에 준하는 권한)을 마운트하고, 신뢰할 수 없는 제3자 코드를 스테이지 컨테이너 내부에서 실행합니다. 해당 워크로드를 감당할 수 있다고 신뢰하는 머신에서 실행하세요. 자세한 내용은
docs/security-model.md를 참조하세요.
Docker가 필요하며, 데몬 소켓에 접근할 수 있어야 합니다.
# 1. Configure. Writes .env for you (data dir + provider API keys)
./setup.sh
# 2. Bring up the stack (Postgres, API + worker, web UI, notebook)
docker compose up --build
# 3. Open http://127.0.0.1:8080
그런 다음 첫 실행을 진행하세요.
bugs/ 아래에 포함되어
있습니다. 웹 UI의 Bug Specs 페이지로 드래그하거나 CLI를 사용하세요.
./scripts/import-all-bugs.sh
[!NOTE] 대규모 업스트림(예: Chromium)에 대한 첫 실행은 느립니다. validate 단계에서 실제 업스트림 패치와 비교하기 위해 전체 저장소를 한 번 클론합니다. 이 클론은 캐시되어 이후에 재사용됩니다.
Docker, Node 20+, pnpm, uv, 그리고
@devcontainers/cli(npm i -g @devcontainers/cli)가 필요합니다. Nix
사용자는 Docker를 제외한 모든 것을 nix-shell로 사용할 수 있습니다.
make dev # uv sync + web deps
docker compose up -d postgres # FLAWED needs a Postgres to talk to
cp .env.example .env # points FLAWED_DB_URL at it
uv run flawed init # builds base images, creates the schema
uv run flawed serve # API + worker + webapp on port 8080
웹 개발 루프를 위해서는 두 번째 터미널에서 make web-dev를 실행하세요. 이는
UI를 포트 5173에서 제공하고 /api를 flawed serve로 프록시합니다.
이 저장소에 대해 AI 코딩 에이전트를 안전하게 실행하기 위한 격리된
devcontainer는 .devcontainer/README.md에
문서화되어 있습니다.
버그 스펙은 입력의 단위입니다. 저장소, 취약 커밋, 버그 설명, 선택적 재현기, 그리고 버그가 현실적으로 보고될 수 있는 방식을 모델링한 프롬프트 변형 집합(SAST 발견, 버그 바운티 보고서, 엠바고 권고문, 원시 PoC 등)을 담고 있습니다. 스펙은 버전이 지정되고 불변이므로, 과거 실행의 프롬프트와 판정이 조용히 바뀌는 일이 없습니다.
JSON 계약은 bugs.schema.json에 있으며
docs/bug-specs.md에 문서화되어 있습니다. 번들된 모든
스펙은 공개적으로 공개된, 업스트림에서 수정된 취약점을 설명합니다.
Postgres가 단일 진실 공급원입니다. 실행 메타데이터와 아티팩트 바이트
(패치, 판정, 트랜스크립트, 로그)가 데이터베이스에 저장되므로, 배포는 DB에
의해 완전히 포착됩니다. data/ 디렉터리는 스테이지가 런타임에 마운트하는
일시적 스크래치 공간입니다.
scripts/export_dataset.py와
scripts/import_dataset.py로 수행합니다(웹 UI에서도 사용 가능).scripts/export_artifacts.py로 수행합니다.uv run alembic upgrade head가
시작 시 자동으로 실행됨).모든 것을 직접 실행하는 대신 완료된 캠페인을 로드할 수 있도록 미리 빌드된
데이터셋을 게시합니다. 각 데이터셋은 하나의 전체 스냅샷을 담은 .tar.gz이며,
**https://flawed.s3.us-east-1.amazonaws.com**에 호스팅됩니다.
단일 번들에 담긴 모든 캠페인.
| 번들 | 아카이브 |
|---|---|
| 모든 캠페인 | full.tar.gz |
Snapshots → Import datasets에서 위 아카이브 링크 중 하나를 붙여넣고
Find archives를 클릭하세요. FLAWED는 직접 .tar.gz 링크를 그대로
가져와 스냅샷에 풀어 놓습니다. 그런 다음 스냅샷 목록에서 복원하세요(복원은
별도의 명시적 확인 단계입니다).
가져오기는 URL이 목록 가능한 버킷이거나 디렉터리 인덱스 페이지일 때만 여러 아카이브를 한 번에 발견합니다. 여기서는 둘 다 해당하지 않으므로 링크를 하나씩 가져오세요.
아카이브를 다운로드하여 스냅샷 디렉터리(FLAWED_HOST_SNAPSHOT_DIR, 기본값은
./flawed-snapshots)에 풀면, 스냅샷 목록에 나타나 복원할 준비가 됩니다.
curl -LO https://flawed.s3.us-east-1.amazonaws.com/compressed/campaigns/full/cve-2026-45185-exim-bdat-uaf_full_gpt-5.5_1782988292.tar.gz
mkdir -p "$FLAWED_HOST_SNAPSHOT_DIR"
tar -xzf cve-2026-45185-exim-bdat-uaf_full_gpt-5.5_1782988292.tar.gz -C "$FLAWED_HOST_SNAPSHOT_DIR"
가져오기는 번들을 디스크에 스테이징만 합니다. 현재 배포를 교체하는 복원은 스냅샷 페이지에서 별도로 수행됩니다.
packages/
flawed-core/ models, DB schema, settings
flawed-orchestrator/ run lifecycle, worker pool, devcontainer driver
flawed-stage-*/ the pipeline stages (clone, generate, validate, …)
flawed-agent-runner/ runs INSIDE the container (Claude / Codex / Gemini CLIs)
flawed-api/ FastAPI + SSE + notebook proxy
flawed-cli/ the `flawed` CLI
apps/web/ React + Vite + Tailwind webapp
containers/ base image, network lockdown, notebook container
bugs/ example bug specs
docs/ documentation (see above)
테스트에는 Docker가 필요합니다. 테스트는 testcontainers를 통해 자체 Postgres를 띄웁니다.
FLAWED는 MIT License로 배포됩니다. 기여를 환영합니다. CONTRIBUTING.md를 참조하시고, 보안 문제는 SECURITY.md에 따라 비공개로 신고해 주세요.
| 기능 | 제공하는 것 |
|---|
| 반복 샘플링 | 하나의 실행이 동일한 입력을 N회 반복 실행하므로, 결과는 일화가 아닌 분포입니다. |
| 캠페인 | 하나의 버그를 패처 변형과 프롬프트 스타일 전반에 걸쳐 스윕하고, 모호한 *"이거 좀 고쳐주세요"*부터 완전한 권고문까지 비교하며, 실시간 대시보드에서 결과를 확인합니다. |
| 결과 채점 | 모든 패치는 다섯 가지 시나리오 중 하나로 분류됩니다. S1(깔끔한 수정)부터 S5(버그를 수정하지 못하고 새로운 취약점을 도입)까지입니다. |
| 교차 검증 | 패치는 다른 모델에 의해 재판정되며, 헤드라인 수치는 자기 검증과 교차 검증 관점을 평균하므로 단일 판정자의 편향이 지배하지 않습니다. |
| 부정행위 탐지 | 감사자가 에이전트가 버그 자체를 해결하는 대신 업스트림 수정 사항을 찾아낸 반복을 표시합니다. |
| 캠페인 | 패처 모델 | 크기 | 아카이브 |
|---|
| CVE-2026-22738 (Spring AI SpEL injection) | claude-opus-4-8 | 515.0 MB | .tar.gz |
| CVE-2026-22738 (Spring AI SpEL injection) | gpt-5.5 | 663.9 MB | .tar.gz |
CVE-2026-31431 (Linux algif_aead) | claude-opus-4-8 | 1.1 GB | .tar.gz |
CVE-2026-31431 (Linux algif_aead in-place) | gpt-5.5 | 966.9 MB | .tar.gz |
| CVE-2026-34197 (ActiveMQ Jolokia RCE) | claude-opus-4-8 | 645.2 MB | .tar.gz |
| CVE-2026-34197 (ActiveMQ Jolokia RCE) | gpt-5.5 | 819.0 MB | .tar.gz |
| CVE-2026-45185 (Exim BDAT use-after-free) | claude-opus-4-8 | 1.1 GB | .tar.gz |
| CVE-2026-45185 (Exim BDAT use-after-free) | gpt-5.5 | 1.0 GB | .tar.gz |
| CVE-2026-8512 (Chromium fsevents UAF) | claude-opus-4-8 | 500.7 MB | .tar.gz |
| CVE-2026-8512 (Chromium fsevents UAF) | gpt-5.5 | 342.7 MB | .tar.gz |
| freenginx-26 (Perl SV refcount UAF) | gpt-5.5 | 166.4 MB | .tar.gz |
| GHSA-wpqr-6v78-jr5g (Gemini CLI trust model) | claude-opus-4-8 | 1.2 GB | .tar.gz |
| GHSA-wpqr-6v78-jr5g (Gemini CLI trust model) | gpt-5.5 | 1.3 GB | .tar.gz |
| 문서 | 내용 |
|---|
docs/architecture.md | 구성 요소, 데이터 흐름, 저장소 레이아웃 |
docs/pipeline.md | 단계, 반복 의미론, 컨테이너 레이아웃 |
docs/security-model.md | 단계별 네트워크 정책, 샌드박싱, 위협 모델 |
docs/bug-specs.md | 입력 계약, 프롬프트 구성, 버전 관리 |
docs/cli.md | flawed 명령 참조 + 환경 변수 |
docs/webapp.md | UI 투어 |
docs/notebook.md | JupyterLab 통합 + flawed 헬퍼 모듈 |
| 작업 | 명령 |
|---|
| 모든 Python + Node 의존성 동기화 | make dev |
| 테스트 실행 | make test |
| 린트 | make lint |
| 자동 포맷 | make format |
| 웹 개발 서버 (포트 5173) | make web-dev |
| E2E 스모크 테스트 | make e2e |