
폐쇄 루프 취약점 해결: 탐지 -> 익스플로잇 재현 -> 패치 생성 -> 증명 하네스로 검증. 실제 예시: Langflow CVE-2026-33017
폐쇄 루프 취약점 교정 파이프라인: 탐지 → 익스플로잇 재현 → 패치 생성 → 증명 하네스에 대한 패치 검증 — 이 모든 과정을 거친 후에야 수정이 신뢰됩니다.
대부분의 "AI가 당신의 CVE를 고쳐준다"는 데모는 패치를 생성하는 데서 멈춥니다. kavach-loop는 취약한 소프트웨어의 실제 실행 중인 인스턴스에 대해 두 가지를 증명하기 전까지는 패치를 신뢰하지 않습니다: (1) 원래의 익스플로잇이 더 이상 작동하지 않는다는 것, 그리고 (2) 애플리케이션이 여전히 정상적으로 동작한다는 것. 작업 예제는 실제 심각한 CVE입니다.
⚠️ 범위 및 안전성: 네트워크에 접촉하는 모든 모듈은 localhost(
127.0.0.1/::1)에 하드 고정되어 있으며 다른 대상은 거부합니다. 익스플로잇 코드는 직접 실행하는 일회용 컨테이너에 대해 패치가 작동함을 증명하기 위해 존재하는 것이지, 무언가를 공격하기 위한 것이 아닙니다. 번들로 제공되는 대상에 대해서만 실행하십시오.
Langflow ≤ 1.8.2의 인증되지 않은 원격 코드 실행 — GHSA-vwmf-pq79-vjvx / NVD. POST /api/v1/build_public_tmp/{flow_id}/flow는 인증 없이 공개 플로우를 빌드합니다; 공격자가 제공한 노드 code는 샌드박스 없이 exec()에 도달하며, 라우트 핸들러에서 싱크까지 6단계 호출 체인을 거칩니다.
flowchart LR
T["exploit_repro/<br/>disposable Langflow 1.8.2<br/>container (localhost only)"]
D["detection/<br/>Semgrep rule over<br/>live-extracted source"]
E["exploit_repro/exploit.py<br/>PoC: confirm RCE is real"]
P["patch_gen/<br/>LLM unified diff,<br/>applied to a real copy"]
V["proof_harness/verify.py<br/>exploit blocked? + app<br/>still works? → one verdict"]
T --> D --> E --> P --> V
V -->|fused confidence score| OUT["trusted / rejected"]
| 단계 | 모듈 | 실제로 수행하는 작업 |
|---|---|---|
| 탐지 | detection/detect.py + rules/unauthenticated-exec-sink.yaml | 대상 컨테이너에서 실시간으로 가져온 소스에 대해 실제 Semgrep 검사를 실행합니다. 이 규칙은 안정적으로 탐지 가능한 전제 조건(인증되지 않은 경로가 공격자가 구성한 입력을 다운스트림 호출로 전달하는 것)을 정직하게 표시하며, 전체 6단계 오염(taint) 분석은 아니라는 점을 confidence: LOW로 명시하므로 모든 탐지 결과는 여전히 확인이 필요합니다. |
| 재현 | exploit_repro/exploit.py | RCE가 실제로 발동하는지 확인하는 localhost 전용 PoC로, 정적 분석 추측이 아닌 실제 버그를 패치하고 있음을 보장합니다. |
| 패치 | patch_gen/generate.py | 실행 중인 컨테이너에서 취약한 함수의 실제 현재 소스를 가져오고, 1~2개의 참조 수정 패턴을 검색한 뒤, LLM에 통합 diff를 요청하고, 이를 두 번째 일회용 컨테이너에 적용한 후 재시작하여 패치된 코드가 다시 로드되도록 합니다. |
| 검증 | proof_harness/verify.py + test_functionality.py | 두 가지 검사를 하나의 판정으로 결합합니다: PoC가 이제 실패해야 하며, 동시에 Langflow의 정상적인 인증된 REST API(health, version, whoami, flow CRUD)가 여전히 통과해야 합니다. 앱을 망가뜨려 익스플로잇을 차단하는 패치는 거부됩니다. |
정직함이 핵심입니다: 탐지 규칙은 자신이 무엇을 증명하고 무엇을 증명하지 못하는지 정확히 문서화하며, 검증기는 익스플로잇이 중단되었다는 이유만으로 패치를 좋다고 판정하지 않습니다.
pip install -r requirements.txt # requests, pytest, openai, semgrep
export OPENAI_API_KEY=... # for patch_gen
cd exploit_repro/langflow-cve-2026-33017
docker compose up -d # vulnerable target on 127.0.0.1:7860
curl -s http://127.0.0.1:7860/health
cd ../..
python detection/detect.py # static-analysis finding
python exploit_repro/exploit.py # confirm the RCE (localhost only)
python patch_gen/generate.py # generate + apply + verify a patch
pytest proof_harness/ # functionality smoke tests
중지 및 초기화: docker compose down -v.
개별 단계(탐지, 익스플로잇 재현, 패치 생성, 증명 하네스)는 구현되어 실제 대상에 대해 실행됩니다. main.py는 얇은 오케스트레이션 골격으로, 현재 단계들은 위에 표시된 대로 직접 구동됩니다. 이들을 단일 main() 호출로 연결하는 것이 다음 단계입니다.
Kavach(कवच)는 산스크리트어로 "갑옷"을 뜻합니다. 루프가 곧 갑옷입니다. 공격을 받고 견딤이 입증되기 전까지는 아무것도 출시되지 않습니다.