FunFuzz: An LLM-Powered Evolutionary Fuzzing Framework
FunFuzz 는 적응형 피드백 기반 프롬프트와 주기적 후보 이주를 통해 대규모 언어 모델을 활용하는 멀티-아일랜드 진화적 퍼징 프레임워크로, 프롬프트 민감도와 샘플링 변이를 극복하여 이전의 대규모 언어 모델 기반 접근법보다 우수한 컴파일러 커버리지를 달성하고 더 많은 고유한 실패 유발 입력을 발견합니다.
원본 논문은 CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/) 라이선스로 제공됩니다. 이것은 아래 논문에 대한 AI 생성 설명입니다. 저자가 작성하거나 승인한 것이 아닙니다. 기술적 정확성을 위해서는 원본 논문을 참조하세요. 전체 면책 조항 읽기
거대한 복잡미로의 숨겨진 함정을 찾으려 한다고 상상해 보세요. 이 미로는 인간이 작성한 코드를 컴퓨터가 실제로 실행할 수 있는 명령어로 변환하는 소프트웨어인 컴파일러입니다. 컴파일러에 버그가 있으면 충돌이 발생하거나 잘못된 결과를 내놓을 수 있으며, 이는 그 위에 구축된 모든 것을 무너뜨릴 수 있습니다.
수십 년 동안 전문가들은 이러한 버그를 찾기 위해 "퍼저 (fuzzer)"를 사용해 왔습니다. 퍼저를 미로에 무작위 테스트 케이스를 수백만 개 던져 무엇이 깨지는지 확인하는 로봇이라고 생각하세요. 하지만 현대 컴파일러는 너무 복잡해서 무작위 던지기만으로는 깊고 까다로운 구석까지 도달하지 못하는 경우가 많습니다.
최근에는 AI(대규모 언어 모델) 를 이용해 이러한 테스트 케이스를 작성하기 시작했습니다. AI 는 똑똑해서 매우 현실적인 코드를 작성할 수 있습니다. 하지만 해당 논문은 이러한 방식으로 AI 를 사용하는 데에는 문제가 있다고 주장합니다: AI 는 고착화됩니다. AI 에게 코드 작성을 요청하면, 단어만 다르게 하여 같은 다섯 가지 유형의 문장을 반복적으로 생성할 수 있습니다. 이는 미로의 새로운 부분을 탐색하는 것을 멈추게 합니다.
FunFuzz 가 등장했습니다.
저자들은 이러한 문제를 해결하기 위해 FunFuzz라는 새로운 시스템을 개발했습니다. 간단한 비유를 들어 작동 방식을 설명해 보겠습니다:
1. "다중 섬 (Multi-Island)" 전략
잃어버린 도시를 찾는 보물 사냥꾼 팀이 있다고 상상해 보세요.
- 옛 방식 (단일 AI): 한 명의 사냥꾼을 보냅니다. 그는 길을 찾아 걷다가 그 길을 따라 계속 나아갑니다. 결국 지루해지거나 고리 속에 갇혀 더 이상 새로운 것을 찾지 못하게 됩니다.
- FunFuzz 방식: 다섯 개의 별도 팀 (섬이라고 부름) 을 보냅니다. 각 팀은 완전히 다른 정글 지역, 다른 지도, 다른 목표를 가지고 출발합니다.
- A 팀은 "고대 유적"을 찾도록 지시받습니다.
- B 팀은 "숨겨진 동굴"을 찾도록 지시받습니다.
- C 팀은 "강 건너기"를 찾도록 지시받습니다.
서로 다른 지시사항으로 시작하기 때문에, 모두 같은 길을 걷지 않습니다. 그들은 미로의 다른 부분을 동시에 탐색합니다.
2. "이주 (Migration)" 시스템
몇 시간마다 팀들은 모닥불 앞에서 만납니다.
- A 팀이 정말 멋지고 희귀한 유물 (컴파일러를 충돌시키거나 이상한 행동을 하게 만드는 프로그램) 을 발견하면, 그것을 혼자 간직하지 않습니다. 그들은 B 팀과 C 팀에게 복사본을 공유합니다.
- 중요하게도: 그들은 B 팀을 캠프에서 쫓아내지 않습니다. 단지 새로운 유물을 B 팀의 수집품에 추가할 뿐입니다. 이렇게 하면 B 팀은 이미 이룬 성과를 잃지 않으면서 새로운 아이디어를 활용해 더 깊이 파고들 수 있습니다.
이 방식은 전체 그룹이 같은 고리에 갇히는 것을 방지하면서도 최고의 발견들이 퍼지도록 합니다.
3. "적합도 점수 (Fitness Score)" (어떤 것이 좋은지 어떻게 알는지)
AI 는 어떤 테스트 케이스가 더 좋은지 어떻게 알까요?
- 시스템은 AI 가 작성한 코드를 컴파일합니다.
- 해당 테스트가 컴파일러의 자체 내부 코드 중 몇 개의 새로운 줄을 건드렸는지 세어 봅니다.
- 테스트 케이스가 컴파일러가 이전에 본 적 없는 부분을 살펴보게 만든다면, 그 테스트는 높은 점수를 받습니다.
- 시스템은 가장 높은 점수를 받은 테스트들을 선택하여 다음 세대의 테스트를 "번식"시키고, 검색을 지속적으로 정교화합니다.
그들이 발견한 것은 무엇인가요?
연구자들은 두 가지 주요 컴파일러인 GCC와 Clang에서 FunFuzz 를 다른 최상위 도구들 (단일 팀만 사용하는 AI 기반 도구인 Fuzz4All과 수백만 개의 무작위 변이를 던지는 Kitten 등) 과 비교하여 테스트했습니다.
- 더 나은 커버리지: FunFuzz 는 다른 도구들보다 컴파일러 내부에서 더 많은 "새로운 영역"을 발견했습니다. 더 깊고 넓게 탐색했습니다.
- 더 많은 버그: 24 시간 테스트 기간 동안 FunFuzz 는 컴파일러가 충돌하거나 내부적으로 실패하게 만든 119 개의 고유한 버그를 발견했습니다.
- 실제 영향: 개발자들은 이 중 80 개의 버그를 확인했습니다.
- 효율성: FunFuzz 는 가장 빠른 도구들보다 더 많은 총 프로그램을 생성하지는 않았지만, 생성한 프로그램들의 품질은 훨씬 더 높았습니다. 시간당 발견한 버그 수가 더 많았습니다.
결론
FunFuzz 는 단일 주자가 아닌 탐험가 팀을 사용하는 지능적인 보물 사냥과 같습니다. 팀들을 분리해 두되 최고의 발견을 공유하게 함으로써 지루한 고리에 갇히는 것을 피하고, 현대 컴파일러의 복잡한 메커니즘을 훨씬 더 깊이 파고들어 다른 방법들이 놓치는 버그들을 찾아냅니다.
연구 분야의 논문에 파묻히고 계신가요?
연구 키워드에 맞는 최신 논문의 일일 다이제스트를 받아보세요 — 기술 요약 포함, 당신의 언어로.