TL;DR
- Jev는 Python·JavaScript·TypeScript 백엔드 저장소의 공격 표면을 예산에 따라 분석하고 의심되는 취약점의 정확한 줄을 제시하며, 저장소당 비용은 약 1센트임.
- 분석 결과는 파일별 의심도 지도와 정확한 줄을 가리키는 취약점 후보 목록으로 구성되며, AI 에이전트에는 수정이 아니라 검증을 지시함.
- 일반 Python 코드가 저장소를 읽고, 고정 질문에 확률로 답하는 분류기 jev가 각 항목을 판단하며 분석에 대형 언어 모델(LLM)은 사용되지 않음.
- 분석은 디렉터리에서 파일, 함수, 줄 순으로 의심 항목만 자세히 살피며, 사용하지 않은 예산은 다음 단계로 넘어가고 의심도가 높은 항목을 먼저 처리함.
- 의도적으로 취약한 PyGoat와 NodeGoat에서 SQL 인젝션,
eval, SSRF 등 후보를 찾았지만, 결과는 취약점의 존재를 입증하지 않으며 함수 간 결함을 놓칠 수 있음.
제공 기능
- Python, JavaScript 또는 TypeScript 저장소와 달러 단위 예산을 입력하면 파일마다 의심도에 따라 색을 표시한 코드베이스 지도와 잠재적 취약점 순위 목록을 얻음.
- 취약점 후보마다 정확한 코드 줄을 가리키며, 사용자 입력이 SQL,
eval, 셸 또는 외부 요청에 도달하는 사례 등을 표시함. - 복사 버튼이나
print_issues.py를 사용해 목록을 AI 에이전트에 전달할 수 있으며, 각 항목을 수정하지 말고 검증하라는 지침이 포함됨. - 설치 없이 브라우저에서 사용해 보기가 가능하며, PyGoat와 NodeGoat의 읽기 전용 결과를 볼 수 있음.
- 대형 언어 모델(LLM)은 사용하지 않음. 일반 Python이 코드를 읽고, 1초 이내에 고정 질문에 확률로 답하는 분류기
jev가 판단을 담당하며 입력 토큰 10억 개당 비용은 약 42달러임.
작동 방식
- 전체 저장소를 대략 살핀 뒤 의심스러운 부분만 확대하는 방식으로 분석함. 각 단계에서
jev가 모든 항목을 평가하고, 의심도가 높은 항목만 다음 단계로 전달함. - 디렉터리 단계에서는 이름만 읽고 테스트, 문서, 마이그레이션 디렉터리를 제외함.
- 파일 단계에서는 임포트와 시그니처를 읽고 노출도를 없음·낮음·중간·높음으로 분류함.
- 함수 단계에서는 코드를 읽고 외부 입력이 위험한 작업에 도달하는지 확인함.
- 줄 단계에서는 취약점이 발생하는 위치로 함수 안의 한 줄을 선택함.
- 최종 순위 목록은 뷰어 또는 복사 기능을 거쳐 에이전트의 검증으로 전달됨.
- 열(Heat)은 항목의 의심도를 나타내는 0~1 값이며,
jev의 확률을 바탕으로 계산함. - 예산은 단계별로 배분되며, 한 단계에서 쓰지 않은 금액은 다음 단계로 넘어감. 의심도가 높은 항목부터 처리하므로 예산이 소진되면 가장 의심도가 낮은 항목이 분석에서 제외됨.
지금까지의 결과
- 의도적으로 취약하게 만든 앱 두 개만 대상으로 시험했으며, 측정일은 2026-10-02임.
- PyGoat — Python / Django, 비용 $0.010; 발견된 상위 항목: SQL 인젝션,
eval,pickle.loads, SSRF. - NodeGoat — JavaScript / Express, 비용 $0.007; 발견된 상위 항목: 요청 본문에 적용된
eval, 오픈 리다이렉트, SSRF, NoSQL$where인젝션.
실행 방법
jev를 사용하려면 TypeSafe API 키가 필요함.- 가상 환경
.venv를 만들고requirements.txt에서 패키지를 설치한 뒤,TYPESAFE_API_KEY환경 변수에 키를 설정함. - 예시 저장소는
https://github.com/adeyosemanputra/pygoat에서 깊이 1로 복제해repos/pygoat에 둠. viewer_server.py를 실행한 뒤http://localhost:7801/heatmap_viewer.html을 열고, 뷰어에서 저장소를 선택하고 예산을 설정한 다음 분석을 실행함. 실행당 최대 예산은 $0.05임.- 셸에서는
attack_surface_scan.py에 저장소 경로와--budget 0.03같은 예산을 전달해 실행할 수 있으며,print_issues.py에 결과 JSON과--top 10을 전달해 상위 10개 항목을 출력할 수 있음. - 각 실행 결과는 날짜, 스캐너 버전, 설정 해시와 함께
examples/<repo>/runs/<run id>.json에 저장되며, 최신 결과는examples/<repo>/scan_result.json에 저장됨. - 에이전트용 명령과 결과 형식은
AGENTS.md에 정리돼 있음.
파일
attack_surface_scan.py— 스캐너.classification_levels.json—jev에 보낼 질문, 범주, 임계값, 예산 배분, 언어별 설정.heatmap_viewer.html및viewer_server.py— 뷰어와 분석 실행을 지원하는 소형 서버.print_issues.py— 에이전트용 이슈 목록 텍스트 출력 도구.examples/— 저장된 실행 결과.
조정 방법
- 질문을 바꾸거나 임계값을 조정하려면
classification_levels.json을 편집함. - 언어를 추가하려면 같은 파일의
languages에 항목을 추가하고, 파일 확장자와 파서가 임포트·함수·클래스에 사용하는 이름을 지정함. - HTTP 경로 같은 분석 단계를 추가하려면
attack_surface_scan.py에extract_<unit>함수를 작성하고,UNIT_EXTRACTORS에 등록한 뒤 JSON에 단계를 추가함.
한계
- 이 도구는 검토할 후보의 순위를 매길 뿐, 취약점이 실제로 존재함을 입증하지 않음.
- 각 함수를 개별적으로 판정하므로 여러 함수에 걸쳐 나타나는 결함은 놓칠 수 있음.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요