나의 모의 해킹 (Pentesting) 에이전트를 포기하게 만든 버그
요약
자율 모의 해킹 에이전트 Halo를 개발하며 겪은 상태 관리(State management) 오류와 해결 과정을 다룹니다. 캐시 키 설계 시 인게이지먼트 범위를 고려하지 않아 발생한 전역적 블랙리스트 문제를 분석합니다.
핵심 포인트
- 에이전트 시스템에서 캐시 키 설계 시 유효 범위(Scope) 설정의 중요성
- 잘못된 캐싱 로직이 시스템의 조용한 성능 저하(False Negatives)를 유발함
- engagement_id를 추가하여 각 세션별 독립적인 실패 네임스페이스 구축
저는 로컬 LLM (Gemma 4 12B, abliterated, LM Studio를 통해 실행)으로 구동되는 자율 모의 해킹 (Pentesting) 에이전트인 Halo를 구축해 왔습니다. 지난주 저는 이 시스템에서 버그를 발견했는데, 이는 제가 지금까지 겪었던 그 어떤 것보다 에이전트 시스템 (Agentic systems)에서의 상태 관리 (State management)에 대해 더 많은 것을 가르쳐 주었습니다.
증상
저는 HTTP 프로빙 (HTTP probing)에 사용되는 도구인 httpx를 터미널에서 단독으로 테스트하고 있었습니다. 잘 작동했습니다. 하지만 동일한 타겟을 대상으로 전체 에이전트 루프 (Agent loop)를 통해 실행했을 때, 에이전트는 시도조차 거부했습니다. 에러도, 재시도도 없이, 그냥... 건너뛰었습니다.
처음에는 프롬프트 (Prompt) 문제라고 가정했습니다. 아마도 LLM이 도구를 선택하지 않은 것이라고 생각했죠. 하지만 로그를 자세히 살펴보니 더 이상한 것을 발견했습니다. 에이전트의 추론 (Reasoning) 과정에서 해당 도구를 "이전에 실패함"이라고 명시적으로 언급하고 있었던 것입니다. 하지만 해당 도구는 이 타겟에 대해 실행된 적이 전혀 없었습니다.
조사
Halo에는 실패한 도구 실행을 SHA-256 해시를 사용하여 지문 (Fingerprint)으로 기록하는 실패 캐시 (agent_cache.py)가 있습니다. 이는 에이전트가 이미 작동하지 않았던 작업을 재시도하며 사이클을 낭비하지 않도록 하기 위함입니다. 합리적인 설계입니다. 하지만 지문 로직을 추적해 보니, 캐시 키 (Cache key)에 해당 실패가 어떤 인게이지먼트 (Engagement)에서 발생했는지에 대한 개념이 없다는 것을 발견했습니다.
즉, 만약 httpx가 타겟 A에 대해 한 번 실패했다면 (예: 일시적인 네트워크 끊김이나 잘못 설정된 플래그 때문), 그것은 타겟 A뿐만 아니라 완전히 무관한 모든 향후 인게이지먼트의 모든 타겟에 대해 전역적으로 블랙리스트 (Blacklisted) 처리되었습니다.
근본 원인
캐시의 범위가 도구 수준으로만 지정되어 있었습니다: 지문이 tool_name + target으로 구성되어 있었습니다. 원래는 engagement_id + tool_name + target이 되어야 했습니다. 인게이지먼트 범위 지정 (Engagement scoping)이 없었기 때문에, 어디서든 발생한 단 한 번의 잘못된 실행이 모든 곳의 우물을 오염시켰습니다. 에이전트는 신중했던 것이 아니라, 단지 운이 나빴던 도구들에 대해 영구적이고 조용히 포기하고 있었던 것입니다.
이것은 에이전트 시스템 (agentic systems)에서 발생하는 전형적인 상태 관리 (state-management) 함정입니다. 효율성을 위한 캐싱 (caching)은 좋지만, 만약 캐시 키 (cache key)가 해당 데이터의 실제 유효 범위 (scope of validity)와 일치하지 않는다면, 겉으로는 안정적으로 보이지만 내부적으로는 조용히 거짓 음성 (false negatives)을 축적하게 됩니다. 그리고 가장 최악인 점은 이것이 소리 없이 실패한다는 것입니다. 충돌(crash)도 없고, 명백한 증상도 없으며, 그저 시스템이 왜 그런지 알려주지 않은 채 시간이 지날수록 능력이 저하될 뿐입니다.
해결 방법
agent_cache.py와 agent_loop.py의 모든 호출 지점에 engagement_id를 필수 필드로 추가하여 스레딩 (threading)했습니다. 이제 각 인게이지먼트 (engagement)는 자신만의 실패 네임스페이스 (failure namespace)를 갖게 됩니다. 특정 타겟에 대해 실패한 도구는 해당 인게이지먼트 내에서는 여전히 블랙리스트 (blacklisted)로 유지되어 (에이전트가 세션 내에서 재시도하며 시간을 낭비하지 않도록 함), 다음 인게이지먼트에서는 새롭게 시작됩니다.
수정 전:
cache_key = hashlib.sha256(f"{tool_name}:{target}".encode()).hexdigest()
수정 후:
cache_key = hashlib.sha256(f"{engagement_id}:{tool_name}:{target}".encode()).hexdigest()
(단순화된 예시입니다. 실제 구현에서는 실패 유형—타임아웃 (timeout), 권한 거부 (permission denied), 도구 누락 (tool missing), 네트워크 오류 (network error) 등—도 분류하므로, 에이전트가 단순히 재시도 여부뿐만 아니라 언제 재시도할지에 대해 더 스마트한 결정을 내릴 수 있도록 합니다.)
교훈
캐싱, 메모리 (memory), 학습된 선호도 (learned preferences) 등 어떤 종류의 상태 유지형 에이전트 (stateful agent)를 구축하든, 명시적으로 질문하십시오: "이 상태 조각의 실제 유효 범위는 어디까지인가?"
더 효율적이라고 느껴지기 때문에 광범위하게 캐싱하고 싶은 유혹이 들겠지만, 실제 범위를 넘어서 유지되는 캐시는 단순히 노력을 낭비하는 것에 그치지 않고 미래의 결정을 적극적으로 오염시킵니다. 에이전트는 고장 난 것이 아니었습니다. 잘못된 경계 (boundaries)를 가지고 "똑똑하게" 행동하고 있었을 뿐입니다.
Halo는 여전히 진행 중인 프로젝트입니다. 오픈 소스이며, 로컬 우선 (local-first) 방식이고, 추론 루프 (reasoning loop)를 위한 클라우드 의존성이 없습니다. 만약 지속적인 상태 (persistent state)를 가진 에이전트 관련 작업을 하고 계신다면, 여러분은 이러한 범위 설정 (scoping) 문제를 어떻게 처리하셨는지 궁금합니다.
XenoCoreGiger31 / GEMMA-by-GOOGLE
GEMMA-POWERED-BY-GOOGLE-CYBERSECURITY-AUTONOMOUS-AI GEMMA4-12b 모델을 사용하여 Linux 환경을 활용하는 자율형 AI 에이전트입니다. 고도로 Abliterated(거부 메커니즘 제거)되었습니다. 완전 로컬 방식이며 완전 무료입니다. 지속적인 부정적 경험 캐시(NEG-EXPERIENCE-CACHE)를 통해 매 상호작용마다 학습하고 더 똑똑해집니다. 자율적인 정찰-공격 루프(RECON-ATTACK-LOOPS)와 발견 사항에 대한 자동화된 전문 보고서 생성 기능을 갖추고 있습니다.
[


[
GEMMA-by-GOOGLE
GEMMA-POWERED-BY-GOOGLE-CYBERSECURITY-AUTONOMOUS-AI:
세계에서 가장 최첨단 AI 모델 중 하나인 Google의 GEMMA 4-12b 모델을 탑재하여 Linux 환경 내부에서 동작하는 자율형 AI (Autonomous AI) 에이전트입니다. 완전히 검열되지 않았으며 (Uncensored/Abliterated), 완전히 로컬 (LOCAL) 환경에서 실행됩니다. 완전히 무료 (FREE)입니다. 지속적인 부정적 캐시 학습 (PERSISTENT negative cache learning) 및 적응 기능을 갖추고 있습니다. 매 상호작용을 거듭할수록 학습하고 스스로를 제어하며, 더욱 자기 인식적(self aware)이고 지능적으로 변합니다.
자율적인 정찰(Recon), 스캐닝(Scanning) 및 공격 벡터 매핑(Attack vector mapping) — 이 모든 것을 시작하기 위한 단 한 마디: ENGAGE. 공격 루프(Attack-loops), 보고서, 전문적이며 완전히 로컬(Local)에서 작동합니다. 이 에이전트는 빠르며, 자신의 익스플로잇(Exploits), 발견 사항 및 위험 수준을 깔끔하고 정밀하며 전문적인 방식으로 자율적으로 문서화합니다. 마음에 드신다면 별(Star)을 눌러주시거나, 풀 리퀘스트(PR)를 열어 함께 무언가를 만들어 봅시다. 이곳은 아이디어가 살아나고 문제가 해결되는 곳입니다!!
라이선스: MIT 언어:
- en 태그:
- security
- penetration-testing
- autonomous-agent
- mcp
- kali-linux
- llm
- cybersecurity
- red-team 라이브러리 이름: other 파이프라인 태그: text-generation
🔐 HALO Cybersecurity
자율적인 AI 기반 모의 해킹 (Penetration testing) 에이전트 —…
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기