핵심 요약
이 아티클은 스마트 컨트랙트 언어와 같이 생태계가 작고 문서가 부족한 컴파일러를 대상으로 한 효율적인 퍼징(Fuzzing) 전략을 다룬다. 기존 바이트 단위 퍼징의 한계를 극복하기 위해 Tree-sitter를 활용한 구조 인식 변이와 LLM을 이용한 언어 특화 변이 도구 생성 기법을 결합했다. 이를 통해 Sui Move, Cairo, Solidity 등 5개 이상의 주요 컴파일러에서 100개 이상의 내부 컴파일러 오류(ICE)를 발견하는 성과를 거두었다. 본문은 하네스 구성부터 코퍼스 수집, LLM을 활용한 자동화된 버그 분류 및 리포팅 워크플로우까지 실무적인 구현 노하우를 상세히 기술한다.
배경
컴파일러 구조(Lexer, Parser, AST, Codegen)에 대한 기본 이해, Fuzzing 및 AFL++ 사용 경험, Rust 프로그래밍 언어 기초
대상 독자
컴파일러 개발자, 스마트 컨트랙트 보안 연구원, 소프트웨어 테스팅 자동화 엔지니어
의미 / 영향
이 연구는 소규모 팀이 개발하는 신생 언어라도 LLM과 현대적 퍼징 도구를 결합하면 매우 적은 비용으로 상용 수준의 안정성을 확보할 수 있음을 보여준다. 특히 정적 분석이 중요한 블록체인 생태계에서 컴파일러 자체의 결함을 사전에 차단하는 표준적인 방법론으로 자리 잡을 가능성이 높다.
섹션별 상세
impl MoveMutator for SwapBinOp {
fn name(&self) -> &'static str { "SwapBinOp" }
fn description(&self) -> &'static str { "Swap a binary operator with a compatible one" }
fn needs(&self) -> u32 { TK_BINOP }
fn mutate(&self, ctx: &mut MuAstContext) -> bool {
let binop = ctx.pick_random_binop()?;
let replacement = ctx.compatible_op(binop.kind);
ctx.replace_text(binop.loc, replacement);
true
}
}LLM이 생성한 아이디어를 바탕으로 구현된 이진 연산자 교체 변이 도구의 Rust 구현 예시
using {v1 as -, v7 as -, v5 as +} for v0 global;
function v8(v0 v2, v0 v3) {
v0 v6 = v2 + v3;
// ...
}식별자 이름을 v0, v1 등으로 단순화하여 의미적 오류를 줄이고 컴파일러 버그를 유도한 코드
실무 Takeaway
- 새로운 프로그래밍 언어의 안정성을 검증할 때 Tree-sitter 라이브러리를 활용하면 단기간에 강력한 문법 인식 퍼저를 구축할 수 있다.
- LLM을 단순 코드 생성기가 아닌 '변이 전략 설계자'로 활용하여 수작업으로 만들기 어려운 수백 개의 언어 특화 테스트 케이스 생성기를 자동화할 수 있다.
- 퍼징 효율을 높이기 위해 식별자 이름을 v0, v1 등으로 결정론적으로 변경하는 전처리를 수행하면 변이 과정에서의 의미적 오류를 줄이고 심층 로직 검증에 집중할 수 있다.
언급된 리소스
AI 요약 · 북마크 · 개인 피드 설정 — 무료
출처 · 인용 안내
인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.