본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 29. 07:59

정규 표현식(Regex)을 넘어: AI 에이전트 취약점 탐지 규칙 구축하기

요약

AI 에이전트의 프롬프트 인젝션 취약점을 탐지하기 위한 AgentGuard 구축 과정을 다룹니다. 단순 정규 표현식(Regex) 기반 탐지의 한계를 지적하며, AST(추상 구문 트리)를 활용한 의미론적 분석과 오염 흐름(Taint Flow) 추적의 필요성을 설명합니다.

핵심 포인트

  • 프롬프트 인젝션은 단일 시그니처가 없는 데이터 흐름의 문제임
  • 정규 표현식은 f-string 패턴 등 기초적인 탐지에는 효과적임
  • AST 기반 분석을 통해 변수 할당 및 데이터 전파를 추적해야 함
  • 소스(Source)에서 싱크(Sink)까지의 오염 경로 식별이 핵심임
  • 비밀 정보 접근과 네트워크 유출 간의 상관관계 탐지가 중요함

정규 표현식(Regex)을 넘어: AI 에이전트 취약점 탐지 규칙 구축하기

제가 AgentGuard를 구축하기 시작했을 때, 첫 번째 질문은 이것이었습니다: 소스 코드에서 프롬프트 인젝션 (Prompt Injection) 취약점을 어떻게 탐지할 것인가?

전통적인 취약점(SQL 인젝션, XSS)과 달리, 프롬프트 인젝션은 단일한 시그니처(Signature)를 가지지 않습니다. 이는 신뢰할 수 없는 데이터가 LLM 컨텍스트(Context)로 흘러 들어가는 패턴입니다. 취약점은 함수 호출 자체에 있는 것이 아니라, 데이터가 구성되는 방식에 있습니다.

정규 표현식(Regex) 기반의 기초

모든 SAST(정적 분석 보안 테스트) 도구는 패턴 매칭에서 시작합니다. AgentGuard의 첫 번째 레이어는 정규 표현식 (Regex) 기반 규칙입니다:

# ASI01: Prompt Injection
FSTRING_INJECTION = re.compile(
    r'(?:prompt|system|message|instruction)\s*[:=]\s*f["\'].*\{.*\}',
...

이 규칙은 가장 흔한 패턴, 즉 사용자 입력을 LLM 프롬프트에 직접 임베딩하는 f-string을 잡아냅니다. 투박하지만 효과적입니다. 50개의 오픈 소스 에이전트 코드베이스를 스캔한 결과, 이 단 하나의 규칙만으로 127개의 사례를 찾아냈습니다.

정규 표현식(Regex)의 문제점

정규 표현식에는 한계가 있습니다. 다음을 고려해 보십시오:

# 패턴 A: 명백함
prompt = f"You are a helper. {user_input}"

...

패턴 A는 탐지하기 매우 쉽습니다. 패턴 B는 .format()의 의미론(Semantics)을 이해해야 합니다. 패턴 C는 딕셔너리(Dictionary) 및 리스트(List) 구성을 통한 데이터 흐름(Data Flow)을 추적해야 합니다.

이것이 바로 AgentGuard가 나아가고자 하는 다음 단계인 AST(추상 구문 트리) 기반의 의미론적 분석 (Semantic Analysis) 입니다.

AST 레이어 (로드맵)

AgentGuard의 다음 버전은 Python 및 JavaScript의 AST를 파싱하여 오염 흐름 (Taint Flow)을 추적할 것입니다:

  1. 소스(Sources) 식별: user_input, query, message, request.body라는 이름의 함수 매개변수
  2. 전파(Propagation) 추적: 변수 할당, 문자열 포매팅, 리스트/딕셔너리 구성
  3. 싱크(Sinks) 식별: openai.chat.completions.create, prompt, messages, system
  4. 경로(Paths) 플래그 지정: 정화(Sanitization) 과정 없이 소스에서 싱크로 이어지는 모든 경로

이는 Semgrep 및 CodeQL이 전통적인 취약점에 사용하는 것과 동일한 접근 방식이지만, LLM 특화 싱크(Sinks)에 맞춤화된 방식입니다.

상관관계 탐지 (Correlation Detection)

AgentGuard는 이미 ASI03 (데이터 유출, Data Exfiltration)에 대해 간단한 형태의 상관관계 탐지를 수행하고 있습니다:

# Line 1: Secret access
api_key = os.environ.get("API_KEY")

...

이 규칙은 N번 라인에서 비밀 정보 접근 (secret-access) 패턴이 나타나고, N+1번 라인에서 네트워크 유출 (network-exfiltration) 패턴이 나타나는지 확인합니다. 이는 가장 위험한 패턴, 즉 자격 증명 (credentials)을 읽어 외부로 전송하는 에이전트를 포착합니다.

향후 버전에서는 이를 완전한 함수 수준의 오염 추적 (taint tracking)으로 확장할 예정입니다.

OWASP ASI Top 10 커버리지

AgentGuard는 현재 10가지 카테고리를 모두 커버합니다:

ASI규칙 (Rule)탐지 방법 (Detection Method)
ASI01프롬프트 인젝션 (Prompt Injection)정규 표현식 (Regex) (f-string, concat, format)
...

벤치마크 결과

벤치마크 스위트 (benchmark suite)에는 28개의 샘플이 포함되어 있습니다:

  • ASI01 (6개 샘플): 100% 탐지
  • ASI02 (5개 샘플): 100% 탐지
  • ASI03 (4개 샘플): 100% 탐지
  • ASI07 (6개 샘플): 100% 탐지
  • ASI10 (5개 샘플): 100% 탐지
  • Clean (2개 샘플): 0% 오탐 (false positives)

향후 계획

  1. AST 기반 오염 추적 (AST-based taint tracking): Python 및 JavaScript 지원
  2. 언어 지원 확장: Rust, Go, Java
  3. GitHub Code Scanning 통합: SARIF를 통한 통합
  4. MCP 서버 모드: AI 코딩 어시스턴트에서의 실시간 스캐닝을 위한 모드
  5. 의미론적 인젝션 탐지 (Semantic injection detection): 단순 문자열 패턴이 아닌 프롬프트 구조 이해

장기적인 목표는 간단합니다: AI 에이전트 코드를 웹 애플리케이션 코드만큼 감사 가능하게(auditable) 만드는 것입니다. 웹 앱에는 Semgrep이 있습니다. 에이전트 앱에는 AgentGuard가 필요합니다.

_AgentGuard는 MIT 라이선스이며 오픈 소스입니다. pip install dfx-agentguard로 설치할 수 있습니다.]

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0