Make Agent Defeat Agent: LLM 기반 에이전트의 Taint-Style 취약점 자동 탐지
요약
본 문서는 LLM 기반 에이전트의 Taint-Style 취약점을 자동으로 탐지하는 방법을 제시하며, 관련 연구 논문과 소스 코드를 제공합니다. CodeQL 및 Miniconda를 활용하여 정적 분석 환경을 구축하고, 특정 트레이싱 라이브러리(cetracer)를 삽입하여 에이전트의 동작을 계측(instrumentation)합니다.
핵심 포인트
- LLM 기반 에이전트의 Taint-Style 취약점 자동 탐지 연구입니다.
- CodeQL과 Miniconda를 사용하여 정적 분석 환경을 구축하는 절차를 안내합니다.
- cetracer 라이브러리를 삽입하여 에이전트 실행 과정을 계측(instrumentation)해야 합니다.
Make Agent Defeat Agent: Automatic Detection of Taint-Style Vulnerabilities in LLM-based Agents의 소스 코드
@inproceedings{liu2025make,
title={Make Agent Defeat Agent: Automatic Detection of {Taint-Style} Vulnerabilities in {LLM-based} Agents},
author={Liu, Fengyu and Zhang, Yuan and Luo, Jiaqi and Dai, Jiarun and Chen, Tian and Yuan, Letian and Yu, Zhengmin and Shi, Youkun and Li, Ke and Zhou, Chengyuan and others},
...
정적 분석(Static Analysis)을 수행하기 전에 CodeQL-CLI v2.19.2와 Miniconda를 설치해야 합니다.
그런 다음, 다음 명령어를 실행하여 Python 3.10.12 환경을 생성합니다:
conda create -n py31012 python=3.10.12
다음 명령어를 실행하여 가상 환경에 진입합니다:
conda activate py31012
가상 환경 내에서 다음 명령어를 실행합니다:
pip install -r requirements.txt
분석 대상(analysis target)을 git clone 합니다. 예를 들면:
git clone https://github.com/microsoft/TaskWeaver.git
그 안으로 이동합니다.
cd TaskWeaver
CodeQL 데이터베이스를 생성합니다:
codeql database create /path/to/database/TaskWeaver --language=python --source-root=.
파일 auto_analyze.py를 수정하여, 이전에 생성한 데이터베이스로 DB_HOME과 arg_dbname을 변경합니다:
DB_HOME = '/path/to/database'
arg_dbname =
다음으로 에이전트 스레드에 다음 코드를 추가하세요. (다중 스레드 애플리케이션의 경우, 이 코드는 에이전트가 실행되는 스레드에 추가해야 합니다.)
import cetracer
cetracer.start_ce_trace(conf="/app/if.json", enter_input_conf="/app/enter_hook.json", oracle_rule_conf = "/app/oracle.json", log="/tmp/if.log", match_log = "/tmp/hook.log", call_stack_log = "/tmp/callstack.log", oracle_name = "/tmp/oracle.log")
예를 들어, `/app/playground/UIapp.py`에 코드를 추가하세요.
from taskweaver.app.app import TaskWeaverApp
......
import cetracer
...
마지막으로 대상 애플리케이션을 재시작하고 **40초 동안 기다리세요**. (대상 애플리케이션 시작 후 과도한 오버헤드를 방지하기 위해, 우리의 계측(instrumentation)은 처음 40초 동안 비활성 상태로 유지됩니다.)
- SMT-solver 설치 (Z3)
py-conbyte 환경 설정
- 현재 가상 환경을 종료합니다.
conda deactivate
- Miniconda를 사용하여 Python 3.7.3 가상 환경 생성:
conda create -n py373 python=3.7.3
- 가상 환경에 진입하고 Python 주소를 얻습니다:
conda activate py373
- pipenv 설치:
pip install pipenv
- py-conbyte 디렉터리로 이동하여 필요한 가상 환경을 설치합니다.
`cd py-conbyte pipenv shell`
- 이 환경에 필요한 패키지를 설치합니다.
conda activate py373 pipenv install
- 이 가상 환경에서 나갑니다.
`exit conda deactivate`
- agentfuzz의 가상 환경에 진입합니다.
conda activate py31012
`./config/__init__.py` 파일에 `OPENAI_API_BASE`와 `OPENAI_API_KEY`를 채워 넣으세요.
대상 에이전트에게 **메시지를 보내는 방법**을 알려주는 스크립트를 `./poc` 아래에 만드세요.
예를 들어, `./poc/TaskWeaver/poc.py`:
with sync_playwright() as playwright:
browser = playwright.chromium.launch(headless=True)
context = browser.new_context()
...
이 코드는 단순히 브라우저를 열고, 메시지를 타이핑한 후 버튼을 클릭하여 에이전트에게 전송하는 역할을 합니다.
`./poc/poc_factory.py` 파일을 열고 `factory` 딕셔너리에 항목을 추가하세요.
애플리케이션 이름과 에이전트 이름은 원하는 어떤 이름이든 사용할 수 있습니다. 예를 들어, "Taskweaver"와 "CodeInterpreter"입니다.
`MetaData`의 `call_chain`은 `oracle.json`에 있는 목표 호출 체인(target call chain)입니다.
`batchmain.py`를 실행할 때는 `MetaData`의 `call_chain`이 어떤 내용이어도 상관없습니다. 왜냐하면 모든 호출 체인을 순회하기 때문입니다. 오직 `main.py`를 실행할 때만 `MetaData`의 `call_chain`을 채워야 합니다.
`MetaData`의 `container_name`은 애플리케이션이 실행되는 도커(docker)가 무엇인지를 의미합니다. 예를 들면 다음과 같습니다:
"Taskweaver": MetaData(
"DEADBEEF",
"taskweaver",
...
그런 다음, `batchmain.py`에서 명령어와 호출 체인 파일 경로를 수정하십시오. 예를 들면 다음과 같습니다:
with open('./output/TaskWeaver/oracle.json') as f:
......
subprocess.run([PYTHON_EXECUTABLE, "main.py", "-app", "Taskweaver"], env={"CALLCHAIN": c}, timeout=1200)
이를 통해 우리의 도구가 모든 호출 체인을 순회하고, `poc.TaskWeaver.CodeInterpreter.poc.connect_with_auth`를 통해 목표 에이전트에 프롬프트를 보내 잠재적인 취약점을 탐지할 수 있게 됩니다.
다음 명령어를 실행하기만 하면 됩니다:
`python3 batchmain.py`
그리고 결과는 명령어 줄과 `./log`에 표시됩니다.
다음 출력을 본다면, 호출 체인이 트리거되었으며 취약점일 수 있다는 의미입니다.
exploration successful
True
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub Codex tools의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기