Security Benchmark Explorer: 구조화된 콘텐츠 덕분에 작동하는 AI 에이전트
요약
본 글은 보안 벤치마크를 탐색하는 AI 에이전트 'Security Benchmark Explorer'를 소개합니다. 이 에이전트는 일반적인 LLM의 의미 검색(semantic search) 능력을 넘어, 구조화된 Sanity 데이터셋을 활용하여 정확한 필터링 및 조회(structured lookups) 기능을 수행합니다. 이를 통해 취약점 탐지 테스트 케이스에 대한 정밀하고 근거 기반의 답변을 제공합니다.
핵심 포인트
- 구조화된 데이터를 이용해 벤치마크를 탐색하는 에이전트 구현 사례입니다.
- 일반 LLM은 알 수 없는, 구조적 지식(난이도, 분류 등)에 접근하여 추론합니다.
- Sanity Context MCP와 GROQ 도구를 활용하여 정확한 조회 기능을 구현했습니다.
- 단순 의미 검색 대신 필터링 기반의 정밀한 데이터 조회가 핵심입니다.
This is a submission for the Sanity Challenge, Path One: Ship an Agent That Queries Real Content
제가 만든 것 (What I Built)
Security Benchmark Explorer는 보안 엔지니어와 AI 연구원이 취약점 탐지 테스트 케이스 54개로 구성된 벤치마크를 탐색하는 데 도움을 주는 AI 에이전트입니다. 이 벤치마크에는 데이터 흐름 추론(data-flow reasoning)과 패턴 매칭(pattern matching)을 구별하도록 설계된 의도적인 오탐지 함정(false-positive traps) 5개가 포함되어 있습니다.
일반적인 LLM은 SQL injection이 무엇인지 알고 있습니다. 하지만 제가 제시한 54개 케이스 중 어떤 것이 취약한지, 어떤 것이 안전한지, 각 케이스가 어떤 난이도 단계에 속하는지, 또는 특정 케이스가 왜 그렇게 분류되었는지는 알지 못합니다. 이러한 지식은 구조화된 Sanity 데이터셋에 존재하며, 에이전트는 이를 Sanity Context MCP를 통해 읽어 들입니다.
이 에이전트는 키워드 검색으로는 할 수 없는 다섯 가지 종류의 질문에 답합니다:
- 정확한 케이스 조회 (Exact case lookup): _
사용자: EVAL-004의 근거를 설명해 주세요.
에이전트: EVAL-004는 난이도가 높은 코드 주입(Code Injection) 사례입니다. 코드는 expression = OPERATIONS[user_input] 다음에 result = eval(expression)을 실행합니다. 공격자가 조회 키를 제어하므로 잠재적으로 실행 가능한 표현식을 선택할 수 있어 취약합니다.
사용자: CMD-004와 CMD-005의 차이점은 무엇인가요?
에이전트: _CMD-004는 `subprocess.run([
저는 Sanity Context를 지식 기반(Knowledge Base)이 아닌 benchmarkCase 데이터셋 소스에 연결했습니다. 이는 의도적인 선택이었습니다. 이 과제의 사용 사례는 **구조화된 조회(structured lookups)**였고, 지식 기반은 산문(prose)에 대한 의미 검색(semantic search)을 수행하기 때문입니다. 제 데이터에는 정확한 일치 필드 값(caseId, category, difficulty, vulnerable)이 있어 유사성 검색이 아닌 정확히 일치하는 필터링이 필요합니다.
Sanity Context MCP 엔드포인트는 GROQ 도구를 에이전트에게 노출합니다. 에이전트는 필터를 사용하여 groq_query를 호출하고, 구조화된 문서를 받아 이를 기반으로 추론을 수행합니다. 절대 추측하지 않으며 — 항상 조회(queries)만 합니다.
엔드포인트의 사용자 지정 지침은 에이전트에게 항상 케이스 ID를 인용하도록, 거짓 양성 질문에 대해서는 5개의 TRAP 케이스를 참조하도록, 가변 이름 편향 발견 건에 대해서는 CMD-004와 TRAP-001을 참조하도록, 그리고 절대로 케이스 ID를 지어내지 않도록 지시합니다.
Sanity 프로젝트 상세 정보
- 프로젝트 ID:
2el69ou3 - 조직 ID:
o9cl071wg - 데이터셋:
production(공개) - 문서 유형:
benchmarkCase - 총 문서 수: 54
- MCP 엔드포인트:
security-benchmark-mcp
공개 데이터셋 URL:
Sanity Content Lake에서 모든 54개 케이스 보기
또한 다음 주소에서 배포된 Studio를 볼 수 있습니다:
[kaggle-security-benchmark-explorer.sanity.studio]
에이전트 세션
저는 AI 코딩 CLI를 사용하지 않고 GitHub Codespaces에서 이 에이전트를 구축했기 때문에, 포함할 에이전트 세션 기록(transcript)이 없습니다. 전체 빌드 기록은 리포지토리의 커밋 로그에서 확인할 수 있습니다.
콘텐츠가 구조화되어 있기 때문에만 작동하는 이유
이는 과제의 핵심 요구 사항이므로 명확히 말씀드리겠습니다.
- "EVAL-004" 키워드 검색은 아무것도 반환하지 않습니다. 해당 케이스 ID는 구조화된 필드에만 존재합니다.
- "hard SQL Injection" 키워드 검색으로는 유용한 결과를 얻을 수 없습니다.
difficulty == "hard"그리고category == "SQL Injection"를 동시에 필터링할 수 없기 때문입니다. - "false positive" 키워드 검색은 아무것도 반환하지 않습니다. 해당 구문은 어떤 문서 텍스트에도 나타나지 않으며, TRAP 케이스는 그들의
caseId패턴을 통해 식별됩니다. - **"몇 개의 취약한 케이스가 있나요?"**와 같은 질문은 부울(boolean) 필드를 계산하는 것만으로 답변할 수 있습니다. 아무리 많은 서술형 텍스트도 이를 뒷받침할 수 없습니다.
에이전트가 작동하는 이유는 데이터가 구조화되어 있기 때문입니다. 동일한 콘텐츠에 대한 키워드 검색은 아무것도 반환하지 않을 것입니다.
다음에 구축하고 싶은 것 (What I'd Build Next)
시간이 더 주어진다면 추가하고 싶은 세 가지 기능:
-
관련 문서 유형으로서의 모델 성능. 각 케이스가 실패한 모델들을 참조할 수 있습니다. 이를 통해 에이전트는 _"어떤 모델들이 TRAP-001을 실패했나요?"_와 같이 두 개의 구조화된 문서 유형에 걸쳐 있는 쿼리에 답변할 수 있게 됩니다.
-
참조로서의 취약점 관계. 케이스 간의
relatedVulnerabilities모델을 구축하여 에이전트가 그래프 순회(graph traversal)를 사용하여 _"SQL-004와 유사한 다른 케이스는 무엇인가요?"_에 답변할 수 있게 합니다. -
앱 SDK 인터페이스. 벤치마크를 필터링 가능한 테이블로 보여주는 Studio 앱을 구축하여, 보안 팀이 채팅 인터페이스 없이도 데이터를 탐색할 수 있도록 합니다.
제작 정보 (Built With)
Sanity Context MCP · Next.js 16 · Vercel AI SDK · Gemini 2.5 Flash · TypeScript · Tailwind CSS
제작자 (Built by)
vernard_sharbney_4c39f22b
sanitychallenge
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기