[Paper Review] Large Language Models are Edge-Case Generators: Crafting Unusual Programs for Fuzzing Deep Learning Libraries (ICSE'24)
딥러닝 라이브러리에서 지원하는 언어(파이썬 등)의 구문/의미론과 유효한 계산 그래프를 구성하기 위한 텐서/연산자 제약 조건을 모두 만족해야 하므로 딥러닝 라이브러리 퍼징을 위한 유효한 입력 프로그램을 생성하는데 어려움이 있다. 최신 TitanFuzz에서는 오픈소스에서 다양한 언어로 된 수십억 개의 코드 스니펫을 LLM으로 모든 언어와 유효한 DL 계산을 위한 언어 구문/시맨틱과 텐서/연산자 제약조건을 암시적으로 사전 학습하여 딥러닝 라이브러리 퍼징을 위한 유효한 프로그램을 생성할 수 있음을 보였다. TitanFuzz는 토큰 자연성(token naturalness)를 기반으로 LLM의 생성 기능을 활용하여 훈련 corpora에서 본 것과 유사한 패턴/토큰을 따라 일반적인 프로그램을 생성하는 것이 목표로, 일반 프로그램을 생성하는 경향이 있다. 그러나, 퍼징에서는 새로운 버그나 취약점을 드러낼 가능성이 높은 비정상적인 입력을 선호한다. 따라서 퍼징과 LLM 사이 간극이 존재하는 문제를 해결하기 위해 퍼징을 위한 비정상적인 프로그램을 생성하기 위해 LLM을 활용하는 최초의 접근 방식인 FuzzGPT를 제안하였다.
FuzzGPT는 과거 버그 유발 프로그램에 버그 발견에 중요한 가치가 있는 코드 요소가 포함될 수 있다는 가설에 기반한다. TitanFuzz는 사전 훈련된 LLM에 인코딩된 자연 확률 분포에서 프로그램을 샘플링하지만, FuzzGPT는 검색 공간에서 비정상적인 프로그램으로 분포를 이동하여 일반 프로그램에서 거의 발견되지 않는 코드 경로를 탐색하는 것을 목표로 한다. 기존 퍼징 기술은 과거 정보를 활용하여 생성된 프로그램의 구문/의미적 유효성을 보장하기 위해 휴리스틱한 방법을 사용한다. 그러나, FuzzGPT는 LLM을 이용하여 과거 프로그램을 프롬프트하거나 미세 조정하여 과거 프로그램을 학습한 후, 과거 프로그램과 유사한 더 비정상적인 프로그램을 생성하여 해당 과정을 자동화 및 일반화하였다. FuzzGPT를 구현하기 위해 먼저 딥러닝 라이브러리의 오픈소스 레포지토리에서 버그 보고서를 마이닝하여 버그 트리거 코드 스니펫의 데이터셋을 구축하였다. 이후, LLM에 과거 버그 트리거링 프로그램의 몇 가지 예제를 제공하여 학습(few-shot learning)을 하고, 부분적으로 완전한 버그 트리거 프로그램을 제공한 후(zero-shot learning), 모델 가중치를 수정하여 유사한 버그 트리거링 코드 스니펫을 생성하도록 미세 조정된 LLM을 얻는다. 이를 통해 FuzzGPT는 코드 성분을 캡쳐하여 버그 트리거 프로그램을 생성하도록 LLM을 훈련한다.
FuzzGPT는 모든 생성 제약 조건(언어 구문/의미론, DL 계산 제약 조건 및 새로운 특이성 제약 조건 포함)을 암묵적으로 학습할 수 있으며 자동화하였으며, FuzzGPT의 아이디어는 다른 도메인이나 프로그래밍 언어(컴파일러/인터프리터, DB 시스템, SMT 솔버 등)에 적용할 수 있다. FuzzGPT는 GPT 스타일 모델인 Codex와 CodeGen에 초점을 맞춰서 개발했지만 다양한 LLM에 적용 가능하다. 딥러닝 라이브러리인 PyTorch와 TensorFlow를 대상으로 실험한 결과, TitanFuzz보다 각각 60.70%/36.03% 더 높은 커버리지를 달성하였다. 또한, FuzzGPT는 PyTorch와 TensorFlow에서 제로데이 버그 49개를 포함한 76개의 버그를 탐지하여 TitanFuzz보다 뛰어난 성능을 보였다.