Function Calling With a Local LLM to Drive Foundry: Fuzz, Read, Repeat
개요
로컬 LLM(qwen2.5-coder:7b)에 Foundry 함수 호출 기능을 적용하여 스마트 계약의 취약점을 자동으로 탐지하는 새로운 워크플로우가 제시됩니다.
주요 내용
- 핵심 아이디어: 로컬 LLM에 최소한의 도구(계약 파일 읽기, 퍼즈 테스트 작성, Forge 테스트 실행)를 제공하고 대상 스마트 계약을 지정하여, LLM이 코드를 읽고, 속성 테스트를 작성하며, 실행하고, 실패를 읽어 재현하는 과정을 반복합니다.
- 도구 정의: Ollama의 chat API를 통해 JSON 스키마로 도구를 정의하며,
read_file,write_fuzz_test,run_forge_test세 가지 도구가 사용됩니다.write_fuzz_test는 항상test/Fuzz.t.sol파일을 전체 내용으로 덮어쓰도록 하고,run_forge_test는 인자 없이 실행되어 모델이 플래그를 잘못 사용하는 것을 방지합니다. - 실행 및 피드백 루프: LLM은 대상 계약을 읽고, 불변성을 식별하며, 퍼즈 테스트를 작성하고 실행합니다. 실패 시 오류 메시지를 읽고 수정하는 과정을 반복하며, 실제 카운터예제를 발견하면 성공으로 간주하고 중지합니다.
- 시스템 프롬프트 최적화: "항상 대상 계약을 먼저 읽을 것", "특정 값이 아닌 속성 및 불변성을 테스트할 것", "require 문 대신 vm.assume 또는 bound() 사용", "매번 테스트 실행 후 실제 오류를 읽을 것", "같은 오류가 두 번 반복되면 접근 방식을 변경할 것", "카운터예제가 있는 실패한 퍼즈 테스트는 성공임"과 같은 규칙을 포함하여 LLM의 행동을 제어합니다.
- 한계 및 바운딩: 소형 LLM은 긴 에이전트 루프에서 혼란스러워하거나 이전 제약 사항을 잊어버리는 경향이 있습니다. 이를 해결하기 위해 최대 반복 횟수(MAX_TURNS = 12)를 설정하고, 동일한 테스트 파일이 반복될 경우 감지하는 루프 탐지 기능, 이미 컴파일 가능한 골격 파일로 시작하는 컴파일-퍼스트 게이팅, 그리고 단일 계약 또는 함수에 집중하는 단일 대상, 단일 파일 전략을 적용합니다.
- 효과: 이러한 바운딩을 통해 워크플로우는 몇 분 안에 유용하게 종료되며, 사람이 작성한 테스트에서 놓칠 수 있는 잠재적 취약점을 발견할 수 있습니다.
시사점
이 워크플로우는 로컬 LLM을 완전히 자율적인 감사관이 아닌, 제한된 능력으로도 유용한 결과를 도출할 수 있는 "조금 둔하지만 지치지 않는 인턴"으로 활용하는 새로운 가능성을 제시하며, 특히 개발자가 놓치기 쉬운 불변성 테스트에서 효과적입니다.
원문을 불러오는 중...
댓글
GitHub Discussions