Status
May 27, 2026 · View on GitHub
이 문서는 "현재 구현 상태"를 솔직하게 기록합니다.
v3.0.0-rc1 현재 기준 (2026-05-27, AEG + controlled weaponization 방향)
- SCOUT의 1순위 제품 라인은 AEG-first firmware-to-exploit evidence engine이다. Compliance/Audit/CRA는 AEG evidence를 신뢰·납품·감사 가능하게 만드는 보조 출력이다.
- 내부 레드팀이 실제로 활용할 제품이 목표이므로 PoV에서 멈추지 않고 controlled weaponization readiness와 execution/approval ledger까지 문서화한다. 단, 공개 repo에는 working weaponized payload를 두지 않고 private package/plugin/vault와 scope/evidence gate로 분리한다.
- 현재 registry 기준 stage 수는 49개이며
docs/index.md는 registry 기준 count로 동기화한다. docs/controlled_weaponization_layer.md가 SCOUT-W의 scope guard, target profiler, precondition solver, private package lint/vault registry, gated private execution wrapper, primitive adapter, reliability harness, cleanup manager, evidence/approval ledger, private package contract, promotion level을 정의한다.- AEG readiness는 checked-in R7000 CVE-2017-5521 real known-vulnerable/patched pair proof와
docs/pov/aeg_platform_readiness.json을 기준으로 판단한다.
v2.8.0 업데이트 (2026-05-18, Exploit Pattern RAG)
data/exploit_references/: channel-aware exploit pattern KB 추가. 현재config_derived_cmd_injection패턴은 Web/API -> Config -> delayed daemon parse -> shell command sink 흐름을 메타데이터/추론 문서/참조 PoC 형태로 보존한다.exploit_autopoc: 후보 family, channel, sink, trigger model 기반 scored retriever 추가. 선택된 pattern은 LLM prompt에 "복사할 코드"가 아니라 adaptation tactic으로 주입된다.- RAG prompt는
ADAPTATION PLAN을 강제하고, reference endpoint/credential/magic constant 재사용 금지 및vulnerability_triggerlab PoV semantics를 명시한다. - Contamination guard는 reference PoC의 target-specific endpoint가 생성 코드에 누출되면 fallback/validation reason으로 차단한다.
- E2E: ER605 artifact subset에서 config-derived command injection 후보가
rag_references=["config_derived_cmd_injection"]로 기록됨.
v2.7.3 업데이트 (2026-05-18, Universal Chaining + outbound response-chain quality)
exploitability_dossier: ER605 글에서 배운 분석 프로세스를 제품/프로토콜 특화가 아니라 일반outbound_protocol_response_parser후보 감지로 재정렬. upstream-service marker, response field, parser sink, client-ish binary 기반으로lab_network_redirection/protocol_response/parser_field/leak_before_control_boundarychannel을 산출.exploit_state_machine: dossier family 보존 및 outbound response-parser 후보를classify_outbound_response_chain_qualityPlan IR로 lowering.exploit_autopoc: duplicate candidate ID 선택 방지, protocol-aware Plan IR fallback.poc_templates: exploit-first lab-bounded outbound protocol response PoV template으로 전환. 짧은 benign packet만 configured lab target에 보내며 observed response/readback이 있을 때만vulnerability_trigger성공으로 인정. overlong field/ROP/command/crypto key recovery/spoofing server는 생성하지 않음.exploit_runner: Plan IR 기반transition_evidence[]유지.- 문서:
docs/er605_poc_quality.md,docs/exploit_dag_contract.md,HANDOFF_UNIVERSAL_CHAINING.md, README/README.ko/CHANGELOG 갱신. - 검증: targeted regression, ER605 artifact E2E subset, full
PYTHONPATH=src pytest -q, gnosis lint/sync/strict build.
Phase 2A run.py 분해 현황
Phase 2A run.py decomposition: 4,476 → 4,140 lines (normalize/stage_executor/report_assembler/handoff_writer 추출 완료). 나머지 분해는 후속 작업.
현재 구현됨
- SCOUT CLI:
./scout analyze,./scout stages(래퍼 권장) - 동일 기능은
python3 -m aiedge analyze,python3 -m aiedge stages로 직접 실행 가능 - Benchmark fidelity layer (
benchmark_eval.py): archived bundle 기준 metric 수집, manifest legacy/canonical field 호환 해석, analyst-readiness 판정 - Benchmark triage scripts:
scripts/reevaluate_benchmark_results.py(기존 benchmark 재평가),scripts/rerun_benchmark_stages.py(legacy bundle normalize + stage subset rerun) - Fresh fidelity validation: 새 archive contract는
benchmark-results/tier2-single-fidelitysingle-sample run에서 digest/report verifier 동시 통과로 확인됨 - Stage evidence store(run_dir): StageFactory stage는
stages/<name>/stage.json기반 artifact hashing을 사용하고, findings는run_findings()가stages/findings/*.json을 직접 생성 analyze/analyze-8mb에--rootfs <DIR>지원 (사전 추출 rootfs 직접 ingest)firmware_profilestage:stages/firmware_profile/stage.json과stages/firmware_profile/firmware_profile.json생성이 확인됨- ELF 교차검증(
arch_guess,elf_hints)으로 OS/arch 오탐 완화
- Inventory stage는 "죽지 않고"
inventory.json/string_hits.json/binary_analysis.json을 남김 - extraction/inventory 품질 게이트(coverage threshold) 반영:
- sparse 결과는
quality.status=insufficient로 표시되고partial로 강등될 수 있음
- sparse 결과는
firmware_handoff.json자동 생성 (analyze + stages)- TUI/뷰어 진입 가이드는
./scout tui단축키(ti/tw/to) 및./scout serve를 기준으로 정렬되어 최신 상태입니다. - SquashFS 재귀 추출: BFS 큐 기반, 깊이 제한 4, 오프셋 기반 매직 스캔(벤더 래퍼 대응). 이중/다중 SquashFS 자동 추출 가능.
- 심링크 containment: 추출된 심링크가
run_dir밖으로 resolve되면 rootfs 후보에서 제외._rel_to_run_dir,_probe_is_dir,_probe_exists,_resolve_or_record,is_dir_safe,is_file_safe모두 적용. _BINARY_BRIDGE_TOKENS탐지 카테고리:sprintf/snprintf/strcat/strcpy등이system/popenexec 싱크 근처에 있으면 커맨드 인젝션 브릿지로 플래그. inventory 교차검증(bridge_sink_cooccurrence) 포함.web_ui스테이지: HTML/JS 보안 패턴 스캐너.stages/web_ui/web_ui.json산출. JS 9개 패턴 + HTML 4개 패턴 + API 스펙 파일 탐지.- LLM Provider 추상화:
llm_driver.py(LLMDriver Protocol, CodexCLIDriver,resolve_driver()). 3개 호출사이트(llm_synthesis, exploit_autopoc, llm_codex) 통합.AIEDGE_LLM_DRIVERenv var로 provider 선택, ModelTier ("haiku"|"sonnet"|"opus") 지원. - LLM trace capture (
llm_driver.py):stages/<stage>/llm_trace/*.json에 prompt/output/attempt/usage 메타데이터 기록 - 바이너리 하드닝: 순수 Python ELF 파서로 NX/PIE/RELRO/Canary/Stripped 수집. inventory
binary_analysis.json에hardening_summary포함. findings 점수에 하드닝 기반 보정 적용 (fully hardened: x0.7, no protection: x1.15). - 3-Tier 에뮬레이션: FirmAE Docker 이미지(Tier 1) + QEMU user-mode 서비스 프로빙(Tier 2, lighttpd/busybox/dnsmasq/sshd) + rootfs 검사 fallback(Tier 3).
docker/scout-emulation/Dockerfile 포함.AIEDGE_EMULATION_IMAGE,AIEDGE_FIRMAE_ROOTenv var. - 엔디안 인식 아키텍처 감지: MIPS/ARM 빅/리틀엔디안 정확 구분 (
mips_be,mips_le,arm_be,arm_le). - 취약점 유형별 PoC 템플릿:
poc_templates.py레지스트리 4종 (cmd_injection, path_traversal, auth_bypass, info_disclosure) + tcp_banner fallback.poc_skeletons/디렉토리에 standalone PoC 파일. - exploit_runner 실제 PCAP 캡처: tcpdump 가용 시 실제 패킷 캡처 (기존 placeholder fallback 유지).
- PoC 재현성 검증:
poc_validation에서 readback_hash 일관성 확인으로 재현성 보장. - LLM 트리아지 스테이지: findings →
llm_triage→ llm_synthesis 순서로 실행. 모델 티어 자동 선택 (<=10: haiku,11-50: sonnet,>50또는 chain-backed: opus). 하드닝/attack_surface 보안 컨텍스트 포함 프롬프트.haikunonzero exit 시sonnetfallback, parse repair pass,--no-llm에서 graceful skip. adversarial_triage/fp_verification: parse failure를 조용히 무시하지 않고 repair 시도 후 fail-closedpartial/unverified로 반영attribution: extraction stage manifest 자체보다 inventory roots 실제 존재 여부를 우선 사용하여 degraded 오탐 완화graph: runtime communication graph가 비어도fallback_reference_graph와 blocked reason code를 남겨 empty vs explained-blocked를 구분- Terminator 양방향 피드백 루프:
terminator_feedback.py가firmware_handoff.json에feedback_request섹션 추가. Terminator 판정(confirmed boost, false_positive suppress)이duplicate_gate에 반영.AIEDGE_FEEDBACK_DIRenv var. - IPC 감지 파이프라인: Unix socket, D-Bus, SHM, named pipe 감지. ELF
.rodata/.dynstrIPC 심볼 추출.ipc_channel그래프 노드 + IPC 엣지 5종 (ipc_unix_socket,ipc_dbus,ipc_shm,ipc_pipe,ipc_exec_chain). IPC 리스크 스코어링. - Source→Sink 경로 추적:
stages/surfaces/source_sink_graph.json생성. 네트워크 엔드포인트 → 서비스 컴포넌트 → exec sink 바이너리 경로 매핑. - Credential 자동 매핑:
stages/findings/credential_mapping.json생성. SSH 키, 비밀번호 해시, API 토큰 → auth surface 매핑. 위험도 분류(high/medium/low). - Verifier reason code 개선:
dynamic_validation에서isolation_verified/boot_verified생성,poc_validation에서repro_3_of_3생성. VERIFIED 판정 경로 활성화. - 인터랙티브 웹 뷰어: 글래스모피즘 다크 테마, 순수 JS force-directed 그래프, IPC Map/Source→Sink/Credential Map 패널. 파이프라인 진행률 바, 접이식 카드, 다크/라이트 토글.
- SBOM 생성 (
sbom.py): CycloneDX 1.6 포맷 SBOM 자동 생성. opkg/dpkg 패키지 DB, 바이너리 버전 문자열, SO 라이브러리 버전, 커널 버전에서 컴포넌트 탐지. CPE 2.3 식별자 자동 구성.stages/sbom/sbom.json,stages/sbom/cpe_index.json산출. - CVE 스캐닝 (
cve_scan.py): NVD API 2.0 CVE 매칭. Rate-limited (API key 유/무에 따라 10/50 req/min). SHA-256 기반 캐시 (per-run + cross-runAIEDGE_NVD_CACHE_DIR). Critical/High CVE → finding 후보 자동 생성.AIEDGE_NVD_API_KEYenv var. - X.509 인증서 분석 (
cert_analysis.py): PEM/DER 인증서 스캔. 만료, 약한 키(<2048 RSA), 약한 서명(SHA-1, MD5), 자체서명, 개인키 노출 감지. - Init 서비스 감사 (
init_analysis.py): SysV, systemd, BusyBox inittab, OpenWrt procd, xinetd/inetd 파싱. telnet(HIGH), FTP/TFTP(MEDIUM), UPnP/SNMP(MEDIUM) 위험 서비스 플래그. - 파일 퍼미션 감사 (
fs_permissions.py): world-writable, SUID/SGID, 민감 파일(shadow, 개인키) 과도한 권한 감지. - MCP 서버 (
mcp_server.py): JSON-RPC 2.0 over stdio, 12개 도구 노출../scout mcp --project-id <run_id>. Claude Code/Desktop 등 MCP 호환 AI 에이전트에서 SCOUT 구동 가능. - LLM 드라이버 확장:
ClaudeAPIDriver(Claude API 직접 호출,ANTHROPIC_API_KEY) +ClaudeCodeCLIDriver+GeminiCLIDriver(로컬 CLI/OAuth) +OllamaDriver(로컬 LLM,AIEDGE_OLLAMA_URL).AIEDGE_LLM_DRIVER=codex|claude|claude-code|gemini|ollama. 비용 추적 (llm_cost.py,AIEDGE_LLM_BUDGET_USD). - CVE Reachability 분석 (
reachability.py): communication graph BFS로 공격 표면에서 CVE 컴포넌트까지 도달성 판정. directly_reachable(≤2 hop), potentially_reachable(3+), unreachable. - 펌웨어 비교 (
firmware_diff.py): 두 run 간 파일시스템 diff(추가/삭제/수정/퍼미션), 바이너리 hardening diff, config 보안 diff. - GDB RSP 클라이언트 (
emulation_gdb.py): 순수 stdlib GDB Remote Serial Protocol 클라이언트. QEMU-gstub에 연결하여 레지스터/메모리 읽기, 브레이크포인트, 백트레이스. - Ghidra headless 연동 (
ghidra_bridge.py,ghidra_analysis.py): 선택적 Ghidra 디컴파일/xref/데이터플로우 분석. SHA-256 캐시. 미설치 시 graceful skip.AIEDGE_GHIDRA_HOME,AIEDGE_GHIDRA_MAX_BINARIES. - AFL++ 퍼징 파이프라인:
fuzz_target.py(스코어링 0-100),fuzz_harness.py(딕셔너리/시드/하네스),fuzz_campaign.py(AFL++ Docker QEMU mode),fuzz_triage.py(크래시 분류/exploitability). 미설치 시 graceful skip.AIEDGE_AFLPP_IMAGE,AIEDGE_FUZZ_BUDGET_S. - SARIF 2.1.0 Export (
sarif_export.py): Findings를 OASIS SARIF 2.1.0 포맷으로 자동 변환. GitHub Code Scanning, VS Code SARIF Viewer 호환.stages/findings/sarif.json산출. 파이프라인 완료 시 자동 생성. - SLSA L2 Provenance (
provenance.py): in-toto v0.1 attestation 자동 생성. firmware_handoff, analyst_digest, verified_chain을 subject로 포함.provenance.intoto.jsonl산출. 파이프라인 완료 시 자동 생성. - Executive Report 생성 (
report_export.py): Markdown executive report 자동 생성. 파이프라인 요약, 상위 리스크, SBOM/CVE 테이블, 공격 표면, 크레덴셜 findings. 파이프라인 완료 시report/executive_report.md자동 생성. - 웹 뷰어 UX 대폭 개선: 싱글 패널 뷰(사이드바 클릭 → 해당 패널만 표시), KPI 바(Critical/High/Components/CVEs/Endpoints 상시 표시), SBOM/CVE/Reachability/Security Assessment 4개 패널 추가, 페이지네이션(SBOM 30/page, CVE 20/page), 그래프 Python 사전 레이아웃(150 노드 균형 선택, 호버 시 연결 정보 표시), viewer.html 1.5MB→567KB 경량화.
- 공유 유틸리티 (
path_safety.py):assert_under_dir,rel_to_run_dir,sha256_file,sha256_text공유 모듈. - 파이프라인 29 → 34개 스테이지 (v2.1):
ghidra_analysis,sbom,cve_scan,reachability,fuzzing추가. - 파이프라인 34 → 42개 스테이지 (v2.2):
enhanced_source,semantic_classification,taint_propagation,fp_verification,adversarial_triage,poc_refinement,chain_construction추가.
v2.6.0 업그레이드 (2026-04-13, Phase 2B)
전략 로드맵 Phase 2B 완료. 성능 (DAG 병렬화), analyst copilot UX (reasoning trail / MCP override), confidence calibration 3축 구현. 6개 atomic commit으로 단일 세션 병렬 실행 후 PR #6로 rebase merge.
DAG 병렬화 PoC (PR #10)
stage_dag.py(신규): 42개 stage 수동 dependency dict (STAGE_DEPS) + Kahntopo_levels()결정론적 알파벳 정렬 +validate_deps()경고 집계.findings제외 (integrated step),exploit_gate포함 (inline factory). 현재 42-stage 기준 15 level / max-width 7run_stages_parallel()instage.py: ThreadPoolExecutor level-wise submit, skip-on-failed-dep semantics,fail_fast=True/False모드.run_stages()무수정--experimental-parallel [N]CLI 플래그 (analyze+stagessubparser), 기본 4 workers- ProgressTracker out-of-order 모드: 내부
_completion_counter로 parallel 완료 순서 렌더링
Reasoning trail 전면 도입 (PR #11 + PR #13)
reasoning_trail.py(신규):ReasoningEntrydataclass (stage/step/verdict/rationale/delta/timestamp/llm_model/raw_response_excerpt).raw_response_excerpt200-char cap은__post_init__에서 강제 (call site가 우회 불가)- adversarial_triage.py: debate loop에서 advocate/critic/decision 엔트리 기록 (기존
triage_outcome유지) - fp_verification.py: sanitizer/non-propagating/sysfile 패턴 hit + LLM
<pattern>_detected/llm_verdict기록 (기존fp_verdict/fp_rationale유지) - findings.py: additive
reasoning_trail필드 (PR #7a 패턴, schema bump 없음) +reasoning_trail_countsummary - SARIF export:
properties.scout_reasoning_trail노출 - Viewer 3개 surface: 임베디드 HTML 뷰어 collapsible
<details>+ 애널리스트 markdown numbered subsection + TUIrender_finding_detail_with_trail()(AIEDGE_TUI_ASCII 호환)
MCP analyst tools (PR #12)
- 4개 신규 도구:
scout_get_finding_reasoning(trail 조회),scout_inject_hint(분석가 hint 추가),scout_override_verdict(verdict 강제),scout_filter_by_category(category 필터) terminator_feedback.py확장:add_analyst_hint/get_analyst_hints/set_verdict_override.fcntl.flock쓰기 안전,assert_under_dir경로 강제, 기존verdicts리스트 스키마 보존- Analyst hint 루프:
adversarial_triage._build_analyst_hint_prefix()가AIEDGE_FEEDBACK_DIR의 hint를 advocate 프롬프트에 priority-정렬 prefix. opt-in 기본 무동작
Detection vs Priority 분리 (PR #15)
scoring.py(신규):PriorityInputsfrozen dataclass +compute_priority_score()(weights: detection 50% / EPSS 25% / reach 15% / CVSS 10%, backport -0.20) +priority_bucket()(critical/high/medium/low)cve_scan.py:1140-1170리팩토링:confidence는STATIC_CODE_VERIFIED_CAP=0.55에서 엄격 유지. EPSS / reachability / backport / CVSS는priority_score로 이동._REACHABILITY_MULTIPLIERS,_EPSS_BOOST_*,_epss_confidence_adjustment()고아 internal 삭제findings.py: additivepriority_score+priority_inputs+priority_bucket_counts(CVE finding은 cve_scan에서 선주입, 나머지는confidence기반 default)sarif_export.py:scout_priority_score+scout_priority_inputsproperties bag 추가quality_metrics.py:count_findings_by_priority+PRIORITY_BUCKET_LABELS(기존 per-confidence helper 유지)docs/scoring_calibration.md(신규): 두 score 계약 + before/after 예시- 리뷰어 비판 직접 응답: "EPSS-additive confidence가 ranking heuristic으로 보인다"
Extraction 실패 analyst guidance (PR #14)
_build_extraction_guidance()inextraction.py: 4개 early-return 실패 경로 (firmware missing, invalid rootfs, no binwalk, timeout) + 성공 외 경로 모두에 entropy / vendor_decrypt /--rootfs/ binwalk variants / 이슈 템플릿 가이드 주입_emit_extraction_guidance()inrun.py: stderr 출력 (quiet 모드 존중) + run dir 로그docs/runbook.md#extraction-failure섹션 (symptoms/causes/remediation 표)
검증
| 지표 | v2.5.0 | v2.6.0 |
|---|---|---|
| pytest | 865 | 1027 (+162) |
| pyright errors | 0 | 0 (baseline 유지) |
| ruff | clean | clean |
| CI checks | 5/5 green | 5/5 green |
신규 테스트 분포: reasoning_trail 20 / extraction_guidance 18 / mcp_analyst_tools 33 / stage_dag 14 / run_stages_parallel 14 / scoring 19 / reasoning_trail_viewer 44
R7000 smoke (PR #15): 3 findings, 모두 priority_score + priority_inputs 보유, cve_confidence_above_0.55_cap = 0 (detection cap 엄격 적용 확인), priority_bucket_counts = {critical: 0, high: 0, medium: 3, low: 0}
설계 불변식 유지
findings.pyadditive only (PR #7a 패턴:category,reasoning_trail,priority_score,priority_inputs). Report schema version bump 없음. 7 downstream consumer 무수정- Sequential
run_stages()bit-identical StageContextfrozen 유지 (thread-safe sharing)assert_under_dir()모든 file write 경로- v2.5.0의 LLM driver contract (system_prompt / temperature / 5-stage parser) 그대로
- 200-char
raw_response_excerptcap은__post_init__에서 강제
v2.6.1 close-out (2026-04-17)
R7000 post-merge 실펌웨어 검증 도중 발견된 2개 shipped 버그를 post-release로 수정. 둘 다 additive-only, schema bump 없음, 기존 consumer 무수정.
버그 #1 — synthesis 레벨 reasoning_trail 상속 누락 (commit 7b36274):
- top-level synthesis finding
web.exec_sink_overlap이 자기 밑에서 debate된 per-alert trail을 상속받지 못했음 findings.json에서reasoning_trail_count: 0/3(top-level), 그러나stages/adversarial_triage/triaged_findings.json에는 100/100 trail 존재- 수정:
_inherit_synthesis_reasoning_trail()헬퍼 — matched downstream evidence lineage를 읽어 top-level synthesis finding에reasoning_trail을 상속. run-relative binary path를 우선 매칭하고, 불일치 시 binary SHA-256을 보조 사용.findings/synthesis_matchsummary entry + 대표 downstream evidence의 deterministic top-K trail 샘플을 부착하며, 매칭 불가 시 기존 aggregatesynthesis_inheritfallback 유지 - 테스트:
TestSynthesisReasoningTrailInheritance5 cases
버그 #2 — SBOM inventory 스키마 불일치 (commit 8e0bb82):
_collect_so_files_from_inventory가 pre-v2.xinventory.file_list키를 읽음 (현재 스키마는roots+entriesint만 노출)_detect_from_binary_analysis가 엔트리당string_hits리스트를 기대 (현재 스키마는matched_symbols만 노출)- 결과: vendor 스톡 펌웨어에서 sbom 0 components. OpenWrt는 opkg status 한 군데로 100+ components가 나와서 버그가 가려져 있었음
- 수정:
_collect_so_files_from_inventory(inventory, run_dir)→inventory.roots를 직접 walk해서.so*glob_detect_from_binary_analysis(..., run_dir=)→ 엔트리에string_hits가 없으면_extract_ascii_runs(zero-depstrings대체)로 바이너리 앞 256KB 읽어 printable run 추출 후 기존_BINARY_PATTERNS정규식 적용binary_analysis.json리더가 현재hits키 + legacybinaries/entries모두 인식- pre-v2.x
file_list/string_hits경로는 legacy fallback으로 유지
- 검증: R7000 run에
SbomStage만 재실행 → 0 → 4 components (curl 7.36.0바이너리 직접 읽기,openssl 1.0.0/libz 1/libpthread 0so_filename walking) - 테스트:
tests/test_sbom_schema_fix.py14 cases (_extract_ascii_runs4 / so_files 5 / binary_analysis 4 / SbomStage integration 1)
전체 회귀 (두 수정 누적):
| 지표 | v2.6.0 shipped | post-release |
|---|---|---|
| pytest | 1027 | 1047 (+20: synthesis 5 + sbom 14 + 기타 1) |
| pyright | 0 errors | 0 |
| ruff | clean | clean |
| check_doc_consistency | 0 violations | 0 |
태그: 위 후속 수정과 2C.3~2C.6 foundation hardening은 v2.6.1로 roll-up 완료.
post-v2.6.1 fuzzing stage 수정 (2026-04-19)
v2.6.1 이후 외부 기여(@NightStalkers-160th) PR 2건을 머지. 둘 다 AFL++ fuzzing stage 경계의 실제 운영 실패를 좁은 범위로 수정. CHANGELOG는 [Unreleased] Fixed에 보관, 다음 point release에서 roll-up 예정.
PR #7 — Docker fuzzing 산출물 ownership 수정 (merge c919390):
- 증상: AFL++ Docker 컨테이너가 root 소유로
stages/fuzzing/*/afl_output/default/생성 → SCOUT_collect_stats가fuzzer_stats를 읽을 때PermissionError: [Errno 13]발생 → fuzzing stagefailed - 수정: docker_cmd에
--user $(os.getuid()):$(os.getgid())추가 (2줄 diff) - 검증: OpenWrt Archer C7 v5 run (
2026-04-13_1014_sha256-bf9eeb5af38a) — 이전에 정확히 이 에러로failed상태였던 run을 재실행,default/소유자가 root:root → rootk1m:rootk1m으로 변경되며 PermissionError 소멸
PR #8 — AFL++ 0-execution campaign을 partial로 정직 보고 (merge 4e7ee05):
- 증상: AFL++가 fork server handshake 실패 / QEMU arch mismatch / docker non-zero exit 등으로 target을 한 번도 실행 못 해도
fuzzing: ok로 보고됨 - 수정:
_append_campaign_execution_limitations(limitations, docker_rc, docker_err, stats)— docker exit code / forkserver handshake / arch mismatch / zero-exec 4가지 실패 신호를 limitation 문자열로 기록_campaign_completed(result)—stats.execs_done > 0일 때만True반환.targets_completed카운터는 이 게이트 통과분만 증가- 한 파일에서 helper 분리 + 2개 호출지점 수정
- 테스트:
tests/test_fuzz_campaign.py4 cases (no-exec / arch mismatch / campaign_completed gate / stage-level partial status) - 검증: 같은 OpenWrt Archer C7 v5 run에서 AFL++가
Fork server handshake failed로 abort 한 MIPS-32 dnsmasq target —limitations = [docker_exit_1, forkserver_handshake_failed, no_fuzzer_executions]3개 모두 기록됨,targets_attempted=1 / targets_completed=0, stage status =partial
회귀:
| 지표 | v2.6.1 | post-merge |
|---|---|---|
| pytest | 1047 | 1051+ (+4 fuzz_campaign) |
| pyright | 0 errors | 0 |
| ruff | clean | clean |
| check_doc_consistency | 0 violations | 0 |
실펌웨어 증거: aiedge-runs/2026-04-13_1014_sha256-bf9eeb5af38a/stages/fuzzing/에서 pre-/post-merge 쌍 유지 (status failed→partial, limitations [PermissionError]→[docker_exit_1, forkserver_handshake_failed, no_fuzzer_executions]).
v2.5.0 업그레이드 (2026-04-13)
전략 로드맵 Phase 1 구현. 학술 논문 30+편, 경쟁 도구 12개(Theori Xint, FirmAgent, FIRMHIVE 등), Theori Xint 심층 분석 기반.
LLM 구조 개선
llm_prompts.py(신규):STRUCTURED_JSON_SYSTEM등 7개 system prompt + temperature 상수 중앙 관리- LLMDriver Protocol 확장:
system_prompt,temperature파라미터 추가. 4개 드라이버(Codex/Claude API/Claude Code/Ollama) 모두 지원 - 5-stage JSON 파서: preamble 제거 → fence 추출 → raw → brace-counting → common error fix.
required_keys스키마 검증 - adversarial_triage / taint_propagation / semantic_classifier: 모든 LLM 호출에 system_prompt + temperature 적용
- semantic_classifier 배치 축소: 50 → 15개 함수/배치
Sink 커버리지 확대
_SINK_SYMBOLS: 11 → 28개 (memcpy, strcat, printf, syslog, scanf, dlopen 등)_FORMAT_STRING_SINKS+_is_format_string_variable(): variable-controlled format string 탐지
EPSS 통합
- cve_scan.py: FIRST.org EPSS API 배치 조회, per-run + cross-run 캐시
- 신뢰도 조정: EPSS ≥ 0.10 → +0.10, ≥ 0.01 → +0.05, < 0.001 → -0.05
버그 수정
- CVE scan signature-only 경로: 조기 return 제거, 공통 후처리 파이프라인 사용
- CVE scan
comp변수 버그: match별 component_metadata 보존, leaked 루프 변수 참조 제거 - LLM 실패 분류: parse_failures vs llm_call_failures 분리 집계 (adversarial_triage, fp_verification)
CI/CD & 문서
- GitHub Action:
.github/actions/scout-scan/(composite, SARIF + Security 탭 업로드) - CRA 매핑:
docs/compliance_mapping/cra_annex_i.md(EU CRA Annex I 12개 요구사항) - 전략 로드맵:
docs/strategic_roadmap_2026.md(3-Phase plan)
R7000 검증 (2026-04-13)
| 지표 | v2.4.1 (이전) | v2.5.0 (현재) |
|---|---|---|
| adversarial_triage parse_failures | 100/100 | 0/100 |
| fp_verification unverified | 97/100 | 0/100 |
| fp_verification true_positives | 1 | 57 |
| cve_scan EPSS enriched | 0/23 | 23/23 |
- 런:
aiedge-runs/2026-04-12_1320_sha256-b28bf08e9d2c(codex 드라이버, R7000 31MB) - adversarial debate: 100 debated → 99 downgraded(FP) + 1 maintained(TP)
v2.4.1 패치 (2026-04-11)
- Confidence 보정:
decompiled_colocated0.60→0.45 (high-risk 0.50). Terminator 피드백: symbol co-occurrence와 증거 수준 동일. - addr_diff 제거: P-code taint에서 주소 근접 매칭 → callee name 매칭으로 변경. 컴파일러 최적화에 robust.
- Interprocedural taint (Strategy 4): xref call graph 기반 cross-function source→sink 탐지. 1-hop 제한.
- 검증: RT-AX88U에서
fread→vsprintfinterprocedural trace 1건 신규 발견.
v2.4.0 업그레이드 (2026-04-11)
- Ghidra P-code taint 분석:
pcode_taint.py— 3-strategy (P-code SSA dataflow → P-code colocated → decompiled body). 함수 수준 source→sink 검증. - 4-tier confidence caps:
PCODE_VERIFIED_CAP = 0.75추가로 4-tier 완성. SYMBOL_COOCCURRENCE(0.40) < STATIC_CODE_VERIFIED(0.55) < STATIC_ONLY(0.60) < PCODE_VERIFIED(0.75). - 소스 룰 확장: SQL injection, format string, path traversal, SSRF 4개 패밀리 + 9개 regex 패턴.
- CGI 핸들러 탐지: Ghidra string_refs에서
do_*_cgi함수명 추출 → source endpoint 등록. - INPUT_APIS 확장:
cJSON_Parse,json_tokener_parse,xmlParseMemory추가. - SBOM 백포트 감지: opkg 패치 리비전 파싱, CVE 매칭 시 confidence -0.30.
- Handoff 스키마:
firmware_handoff.json에 adversarial triage 스키마 레퍼런스 추가. - 검증: ASUS RT-AX88U 재분석 — 5건 신규 decompiled_colocated traces, confidence 0.40→0.60 (+50%).
v2.3.0 업그레이드 (2026-04-11)
- Adversarial triage 병렬화:
ThreadPoolExecutor기반 finding 단위 병렬 실행 (6h→50min).AIEDGE_ADV_PARALLELenv var (기본 8). - Codex 모델 설정:
AIEDGE_CODEX_MODELenv var 추가 (기본gpt-5.3-codex). - ClaudeCodeCLIDriver: Claude Code CLI OAuth 세션 기반 LLM 드라이버 추가.
- 실시간 CLI 진행률:
ProgressTracker모듈로 파이프라인 스테이지별 진행 표시. - benchmark_eval.py: analyst readiness 평가, bundle verifier, metrics 수집.
- TUI 리브랜딩: AIEdge → SCOUT, 색상 cyan → magenta, viewer indigo/purple 팔레트.
- Apache 2.0 라이선스: MIT에서 전환.
- LLM JSON 파싱 통합:
parse_json_from_llm_output()3-stage fallback으로 7개 중복 구현 대체. - Tier 2 LLM 벤치마크: 36 firmware, 2430 findings debated, 99.3% LLM-adjudicated FPR reduction, 18 maintained true findings.
- 파이프라인 41 → 42 stages:
csource_identification추가.
v2.0 업그레이드 (2026-03-27)
신규 스테이지 (34 → 41)
enhanced_source(enhanced_source.py):.dynstrINPUT_APIS 스캔 (14개 API). LLM 미사용, 비용 $0.semantic_classification(semantic_classifier.py): 3-pass 함수 분류기 (static → haiku → sonnet). 보안 관련 함수 자동 분류.taint_propagation(taint_propagation.py): LLM 기반 inter-procedural taint 분석. 함수 레벨 캐시로 중복 호출 방지.fp_verification(fp_verification.py): 3-패턴 FP 제거 (sanitizer/non-propagating/sysfile). LLM 미사용, 비용 $0.adversarial_triage(adversarial_triage.py): Advocate/Critic LLM 토론을 통한 FPR 감소.poc_refinement(poc_refinement.py): 퍼징 시드 기반 반복적 PoC 생성 (최대 5회 시도).chain_construction(chain_constructor.py): 익스플로잇 체인 조립 (same-binary + IPC cross-binary).
CLI 모듈화
__main__.py분리: ~4,500줄 → 7개 모듈 (~660줄 진입점).cli_common.py: 공유 유틸리티, 상수, 헬퍼 함수cli_serve.py:serve서브커맨드 (웹 리포트 뷰어)cli_tui_data.py: TUI 데이터 로딩 및 처리cli_tui_render.py: TUI 렌더링 및 표시 로직cli_tui.py: TUI 서브커맨드 오케스트레이션cli_parser.py: 인자 파서 구축 (_build_parser())
신규 스크립트
scripts/benchmark_firmae.sh: SCOUT vs FirmAE 벤치마크 비교 실행.scripts/benchmark_firmae.sharchive contract 변경:--cleanup가 flattened JSON snapshot이 아니라 verifier-friendly run replica archive를 보존한 뒤 원본 run_dir 삭제scripts/unpack_firmae_dataset.sh: FirmAE 데이터셋 분류 및 언패커.
신규 문서
docs/upgrade_plan_v2.md: v2.0 전체 업그레이드 계획 및 부록.docs/roadmap_llm_agent_integration.md: LLM 통합 로드맵 및 전략.
이전 개선 (2026-03 초)
Phase 1: 버그 수정
- Exploit stage import 격리 (
run.py): 5개 exploit stage를 단일 try/except에서 개별 try/except ImportError 블록으로 분리. 각 stage 실패가 독립적으로 limitation에 기록됨. GhidraAnalysisStage() 직접 호출 버그 수정 (make_ghidra_analysis_stage factory 사용). - Duplicate gate 파일 잠금 (
duplicate_gate.py): read-modify-write 사이클에fcntl.flock()advisory lock 추가. 동시 실행 시 데이터 손실 방지. - LLM driver 미인식 이름 경고 (
llm_driver.py):AIEDGE_LLM_DRIVER에 미인식 값이 설정될 경우 stderr 경고 출력.
Phase 2: 증거 체인 무결성
- Findings stage SHA-256 매니페스트 (
run.py):_write_findings_manifest()가stages/findings/stage.json에 SHA-256 해시 포함 매니페스트 생성. Handoff 번들에서 하드코딩된"status": "ok"제거. - Firmware handoff 유효성 검증 (
schema.py+run.py):validate_handoff()가firmware_handoff.json기록 전 필수 키를 검증. - 파이프라인 후 실패 기록 (
run.py): SARIF, executive report, SLSA provenance 실패가 limitation으로 기록됨 (기존: 무시). SLSA 실패 시gate_passed=False설정.
Phase 3: 리포트 중복 제거
_finalize_report()헬퍼 추출 (run.py): 예산 소진/정상 종료 경로 간 ~35줄 중복 제거.- Extraction schema 통일 (
run.py): 3개 extraction summary 코드 경로가 동일한 12-key 스키마 생성.
Phase 4: CI/CD
- GitHub Actions CI (
.github/workflows/ci.yml): pytest (Python 3.10-3.12), ruff lint, pyright typecheck 자동화. - Ruff linting 설정 (
pyproject.toml) + Pyright standard mode (pyrightconfig.json).
Phase 5: 레지스트리 정리
- firmware_lineage, fuzzing stage: 기존에 등록만 되고 인스턴스화되지 않던 stage를 전체 파이프라인에 포함.
Known Issues (중요)
-
Legacy Tier 2 archive는 현재 contract의 공식 baseline이 아님:
benchmark-results/legacy/tier2-llm-v2는 historical reference용이며, archived bundle verifier 기준으로는 incomplete/misaligned evidence가 남아 있음 -
old Tier 2 bundle을 normalize + static rerun하면 digest verifier는 상당 부분 회복되지만, 일부
reportverifier 실패는 이미 archive에 포함되지 않은 extraction evidence refs 때문에 코드만으로 복구되지 않음 -
fresh full Tier 2 rerun 전까지 analyst-ready aggregate 수치는 single-sample fidelity 검증 외에는 확정 수치로 간주하면 안 됨
-
샌드박스/호스트 정책에 따라
serve --once가 포트 바인딩 권한 문제로 실패할 수 있음 (Operation not permitted). -
다층 벤더 포맷은 재귀 SquashFS로 많이 개선되었으나, 암호화된 포맷이나 특수 커스텀 헤더는 여전히 수동 추출 필요.
- 현재는
--rootfs우회가 보완 경로이며, 포맷 전용 extractor 체인 확장은 계속 필요.
- 현재는
-
바이너리 보안 속성(NX/PIE/RELRO/Canary)이 순수 Python
.dynstr파싱으로 수집되며 findings 점수에 반영. FORTIFY_SOURCE 탐지 포함. 디컴파일/CFG 기반 정밀 분석은 Ghidra 연동으로 보완. -
Ghidra 분석:
run.py자동 실행에 optional로 포함 (Ghidra 미설치 시 graceful skip).--stages ghidra_analysis로도 수동 실행 가능. -
AFL++ 퍼징: 전체 파이프라인에 포함됨 (Docker + AFL++ 미설치 시 graceful skip).
--stages fuzzing으로도 수동 실행 가능. -
Reachability에서 CVE 컴포넌트명과 graph 노드 ID 형식 불일치(
curlvscomponent:curl)로 일부no_graph_data발생. 매칭 로직 개선 필요.
다음 우선순위
Important
Phase 2C/2D/3 실행 계획은 gnosis wiki에 통합 관리됩니다: gnosis/wiki/projects/scout-phase-2c-2d-plan.md. 세션이 바뀌거나 담당자가 교체돼도 동일 품질의 결과가 나오도록 SSOT 표, dependency DAG, operator checklist, 각 작업 항목의 entry/exit criteria, 검증 명령, 롤백 계획이 전부 거기에 있습니다. 아래 "다음 우선순위" 목록은 Phase 2C 착수 전의 레거시 백로그이며, 계획 문서의 Phase 2C 작업이 이들을 흡수/재배치합니다.
Phase 2C 요약 (6-8주, foundation hardening):
- 2C.1 SBOM 재측정 파일럿 5 펌웨어 (3일) — 근거 보고서:
docs/sbom_schema_fix_impact.md(4/6샘플 변화, 결론: 2C.6 전체 재측정 필수) - 2C.2 Synthesis inherit finding-level 재작성 (matched downstream lineage / deterministic top-K / aggregate fallback, 3일)
- 2C.3
finding.evidence_tier필드 rollout (1주) — branch 구현 기준 additive taxonomy landed:evidence_tier+tier_counts, SARIFscout_evidence_tier, MCP tier filter (docs/evidence_tier_contract.md) - 2C.4 Stage contract tests 42 스테이지 (2-3주) — lightweight validator landed and smoke-verified on representative firmware;
scripts/validate_stage_outputs.py+src/aiedge/stage_contracts.py+tests/test_stage_contracts.py+docs/stage_contracts.md - 2C.5 병렬 실행 hardening + wall-clock 실측 (1주) — execution provenance landed and verified via
manifest.execution_mode/max_workers,verified_chain.execution, and legacy-compatible verifier checks;docs/parallel_execution.md - 2C.6 1,123 펌웨어 corpus 전체 재측정 (1-2주) — 완료. 최종 baseline refresh는
docs/carry_over_benchmark_v2.6.md및benchmark-results/2c6-fresh-full-final/aggregate.json에 기록: success 1110 / partial 4 / fatal 9. archive-only rerun은 invalid로 폐기했고, fresh rerun 4파동(v2/resume/r3/r4)을 합쳐 best-view corpus를 재구성함 - 2C.7 Docs/marketing 규율 + v2.6.1 태그 (1주) — 완료. Tier 1 fresh baseline, confidence semantic break, LLM driver degradation, analyst copilot 3분리, release/governance 문구를 정리하고
v2.6.1태그/릴리즈를 발행함
2C.6 fresh corpus refresh는 1123-target 기준 1110 success / 4 partial / 9 fatal로 마감됐다. 성공 run은
extraction=ok/inventory=sufficient가 1110건 전부 일치하고, nonzero findings는 1110/1110, nonzero CVE는 1089/1110이다. 다만 이 rerun은 여전히 baseline refresh이지, 곧바로 "가치가 증명됐다"는 뜻은 아니다. review-facing 숫자는 extraction success / inventory sufficiency / SBOM delta / pair-labeled recall-FP / tier ROC를 분리해서 읽어야 하고, reviewer-facing precision/recall/ROC는 pair-labeled eval lane에서 별도로 확정한다.
Reviewer eval lane local-7 완료: 7 local pairs / 14 runs, recall 0.142857 / false-positive rate 0.142857 (
benchmark-results/pair-eval/pair_eval_summary.json). R7000은 target CVE를 vulnerable/patched 모두에서 유지했고, 나머지 6쌍은 vulnerable miss + patched clean으로 나왔다.
2C.7 이후 권장 실행 순서 (Pivot 2026-04-19 반영):
Important
Direction Pivot 2026-04-19: reviewer eval lane 분석 (recall 0.142857 / degenerate ROC / dedicated rerun 정체) + SCOUT 정체성 갈림길 검토 결과, Phase 2D 직진 보류 + Phase 2C+ (detection 보강 4-6주) insert + 갈래 A (Compliance/Audit) 1순위 재포지셔닝이 채택되었습니다. 본격 SSOT 재배치는 gnosis 계획 문서를 참조하세요.
- [B-2] E2E demo 확정 —
docs/r7000_e2e_demo.md를 실측 artifact 기준으로 마감하고 reviewer walkthrough를 고정 - [D] results overview 마감 — corpus baseline, pair eval, calibration, E2E demo를 한 문서에서 cross-link하고 reviewer 공유용 요약본으로 고정
- Phase 2C+ 진입 — 5개 detection 보강 항목 (4-6주)
- Phase 3'.1 (산업별 보고서) 즉시 시작 — Phase 2C+와 완전 병렬, EU CRA 2026/09 보고 의무 5개월 timing
- Phase 2D 진입 Exit Gate 통과 후 Phase 2D' 착수 (capability layer, scope 좁힘)
Phase 2C+ 요약 (4-6주, detection 보강 — Pivot 2026-04-19 insert):
- 2C+.1 LATTE Code Slicing (
taint_propagation.py) — landed PR #9 (opt-in viaAIEDGE_LATTE_SLICING=1) - 2C+.2 LARA URI/키 시맨틱 소스 식별 (
enhanced_source.py) — landed PR #9; follow-upascii_stringswire-through 적용됨 (CHANGELOG [Unreleased] Fixed) - 2C+.3 Sink 28→50+ 확장 + format string variable 검출 강화 — landed PR #9
- 2C+.4 Vendor 포맷별 extraction chain 확장 (5종) — pending (유일한 미완)
- 2C+.5 finding diversity gate + dedicated rerun timeout 진단 — landed PR #9
권장 실행 순서: 2C+.5 (측정 도구 먼저) → 2C+.3 (sink) → 2C+.1 (LATTE) → 2C+.2 (LARA) → 2C+.4 (vendor extraction)
Phase 2D 진입 Exit Gate (5개 임계값 모두 통과 시 진입):
- pair eval recall ≥ 0.40 (summary-reuse baseline 0.142857 / 1차 측정 Codex 6h LATTE-off + LARA misconnected 14/14 = 0.142857)
- evidence_tier ≥ 2개 tier nonzero TP (현재
symbol_only만) - finding diversity index < 0.5 (summary-reuse baseline 1.0 / 1차 측정 1.0, 공식
PAIR_EVAL_DIVERSITYgate FAIL) - dedicated reviewer rerun: 1개 driver(claude 또는 codex) success — 통과 (Codex 6h LATTE-off 14/14 완주, 2026-04-19 ~ 2026-04-20)
- pair corpus size ≥ 10 (현재 7, 2C+.4로 확장 예정)
Exit Gate 1차 측정 (Codex baseline, 2026-04-19→20): 11h 1min wall-clock, 14/14 rows success, avg 93min/run. 공식 scripts/release_gate.sh 결과 RELEASE_GOVERNANCE=FAIL (PAIR_EVAL_DIVERSITY + QUALITY_POLICY + CONTRACT_FINAL 3개 sub-gate FAIL). 이 run은 AIEDGE_LATTE_SLICING 미설정 + 2C+.2 LARA ascii_strings 단락 상태였으므로 2C+ 핵심 detection 축이 비활성.
Exit Gate 2차 측정 공식 봉인 (Codex LATTE-on, 2026-04-20): benchmark-results/pair-eval-dedicated-local7-codex-6h-r2-latte-on/ 14/14 완주 (13:33 KST, 12h 45min wall-clock). AIEDGE_LATTE_SLICING=1 + LARA ascii_strings follow-up fix 모두 반영된 상태. 결과:
scripts/score_pair_corpus.py --pairs benchmarks/pair-eval/pairs.json→{"pairs": 7, "recall": 0.142857, "fpr": 0.142857}— summary-reuse baseline과 소수점 이하까지 완전 동일pair_eval_findings.csv14개 row 전부aiedge.findings.web.exec_sink_overlap단일 ID (finding_diversity_index = 1.000)scripts/release_gate.sh→RELEASE_GOVERNANCE=FAIL(PAIR_EVAL_DIVERSITY / QUALITY_POLICY / CONTRACT_FINAL sub-gate FAIL)
Phase 2D' Entry Gate 5개 scorecard 최종:
- Gate 1 recall ≥ 0.40 → 0.143 FAIL
- Gate 2 tier variation ≥ 2 nonzero TP tiers → 1 FAIL
- Gate 3 finding diversity < 0.5 → 1.000 FAIL
- Gate 4 dedicated rerun ≥ 1/N success → 14/14 PASS
- Gate 5 pair corpus size ≥ 10 → 7 FAIL
시나리오 C 공식 봉인: Pivot 2026-04-19의 "변동 없음 → 2C+ 전략 재검토" 시나리오 채택 확정. Option D (Phase 2D' deferred, 갈래 A 올인)로 로드맵 이동. 근본 원인은 findings.py의 primary-finding 선택이 synthesis-stage 합성 finding (web.exec_sink_overlap) 하나만 선택한다는 점 — LARA source 확장(0→21-86 hits/run)과 LATTE slicing은 evidence를 풍부하게 만들지만 finding ID 다양성에는 기여하지 못함. 이 전체 분석은 docs/v2.7.0_release_plan.md + wiki/projects/scout-direction-pivot-2026-04.md + wiki/projects/scout-cra-audit-saas-scope.md에 기록됨. Claude LATTE-on lane은 Claude Pro/Max 플랜의 5h rolling usage quota 소진("You've hit your limit · resets 5am (Asia/Seoul)")으로 llm_call_failures=100/100 발생 후 폐기 (driver-level noise, 재측정 결과와 무관).
v2.7.0 tag 발행 조건 충족: 공식 scorecard가 release note에 인용 가능한 상태. 후속 v2.7.1은 2C+.4 vendor extraction chain 확장 (DIR-859 / RT-AC68U / WRT1900ACS / DIR-878 + 1종 → corpus 7→10+) + 3'.1 B-5 release tag로 bundle 예정.
v2.7.1 post-release update (2026-04-22, Phase 2C+.4 corpus expansion + B-5 release tag): v2.7.1 released 2026-04-22 — Phase 2C+.4 vendor extraction 5종 완결 (DIR-859 / DIR-878 / RT-AC68U / WRT1900AC v2 / EA6700) + Phase 3'.1 step B-5 release tag packaging. 공식 release note: GitHub / 측정 이력: docs/v2.7.1_release_plan.md. 12-pair --no-llm FINAL 측정 (WRT1900AC v2 ok 전환 후) 결과:
- Gate 1 Recall: 0.1429 → 0.1667 (+17% rel) — 여전히 FAIL (임계 0.40 미달)
- Gate 2 Tier variation: 1 (
symbol_only만) — FAIL 유지 (1차 측정에서 WRT partial의analysis_incomplete가unknowntier 채움으로 일시 PASS 보였으나 2400s rerun 후 TP 소멸, baseline 회귀) - Gate 3 Finding diversity: 1.000 → 0.917 — FAIL (24 row 중 22
web.exec_sink_overlap+ 2analysis_incompletefrom DIR-878 partial) - Gate 4 Dedicated rerun: 14/14 + 12/12
--no-llm— PASS 유지 - Gate 5 Corpus size: 7 → 12 — ❌ → ✅ PASS (manifest 등록만으로 통과)
FINAL scorecard: 5/5 중 2/5 PASS (Gate 4 + Gate 5). v2.7.0의 1/5 → v2.7.1 2/5, +1 순증가는 Corpus에서 옴. 공식 수치는 benchmark-results/pair-eval-12pair-mixed/ 및 docs/v2.7.1_release_plan.md. 교훈: partial extraction artifact가 Gate 2 수치를 왜곡할 수 있음 — ok 측정이 figure of record. Pivot Option D (갈래 A 1순위, 갈래 B external)는 변경 없음 — v2.7.1은 시나리오 C의 정량적 정련이지 re-pivot 아님. Gate 1/2/3의 구조적 한계 (findings.py single-synthesis-finding selection)는 외부 detection-engine 트랙 유지.
Phase 2D' 요약 (4-6주, capability layer — scope 좁힘):
- 2D.1 reasoning_trail + MCP 실전 루프 검증
- 2D.2 Multi-agent exploit chain
- 2D.4a Vul-RAG (CVE 시맨틱 매칭만)
2D.3 LLM 퍼즈 하네스 자동 생성→ external track2D.4b LLM4Decompile / GhidraMCP→ external track
Phase 3' 요약 (재배치 2026-04-19, 갈래 A 우선):
- 3'.1 산업별 보고서 (FDA Section 524B / EU CRA Annex I / ISO 21434 / UN R155) — 승격 1순위, Phase 2C.7만 의존, 즉시 착수 가능
- 3'.2 CRA-compatible audit SaaS (전 SCOUT Cloud API, scope 좁힘)
- 3'.3 LFwC 10,913 벤치마크
- 3'.4 펌웨어 portfolio 관리
- 3'.5 CVE-Bench 자동 평가
3.1 Big Sleep 자율 에이전트→ external track3.6 Foundation Model 파일럿→ external track
레거시 백로그 (Phase 2C 작업에 흡수/재배치됨):
- 새 benchmark contract로 Tier 2 full fresh rerun 수행 (legacy snapshot과 분리된 공식 analyst-readiness baseline 생성)
- report verifier의 remaining dangling
evidence_refsassembly 경로 정리 - Reachability 컴포넌트-노드 ID 매칭 로직 개선 (CPE 이름 → graph 노드 ID 정규화)
- 벤더 포맷 전용 extraction chain 확장 (QNAP/Synology/ASUS 계열 깊은 중첩 포맷)
- Ghidra dataflow 결과를 source-sink 그래프와 findings confidence에 통합
퍼징 크래시를 exploit_autopoc PoC seed로 자동 연계-- v2.0poc_refinement스테이지로 해결- Public benchmark corpus 확장 (현재 seed fixture → 실제 공개 펌웨어 corpus)
- 남은
_assert_under_dir()로컬 복사본을path_safety.pyimport로 통합 (26파일) - Semantic classification 결과를 taint propagation 초기 seed로 활용하는 피드백 루프 강화
- Adversarial triage 라운드 수/모델 티어 자동 조정 (finding 수 기반)