1. 개요 (Abstract)
기존의 프로그램 정적 분석 도구는 인간이 작성한 명세(specification)에 의존하여 보안 취약점을 탐지하므로, 실제 환경에서는 효과가 제한적이다. LLM(대형 언어 모델)은 코드 생성에는 뛰어나지만, 전체 저장소 수준의 정교한 코드 추론에는 한계가 있다.
본 논문에서는 IRIS라는 뉴로-심볼릭(neuro-symbolic) 접근법을 제안하여, LLM과 정적 분석을 결합해 전체 프로젝트를 분석하고 보안 취약점을 탐지한다. 특히 LLM을 사용해 taint specification을 추론하고 맥락 기반 분석을 수행함으로써 인간 개입을 최소화한다.
성과 요약:
- 새로운 Java 취약점 데이터셋 CWE-Bench-Java (취약점 120개 포함) 제작
- 기존 정적 분석 도구 CodeQL은 27개 탐지
- IRIS + GPT-4는 55개 탐지 (+28개)
- 평균 거짓 탐지율(FDR)을 5%P 감소시킴
- 기존 도구로는 탐지 불가능한 6개의 신규 취약점 발견
2. 동기 (Motivation)
기존 정적 분석 도구의 한계:
- 타사 API 명세 누락으로 인해 탐지 누락 발생
- 정확한 문맥 추론 부족으로 거짓 탐지율이 높음
- 기계학습 기반 기법들도 실전에서는 제한적 성능
LLM의 한계:
- 코드 생성에는 유능하지만, 프로젝트 전체 수준의 논리적 취약점 탐지에는 부족
해결 방안:
- LLM이 보유한 지식을 정적 분석 도구와 결합하여, 전체 저장소 수준에서 취약점을 탐지하는 IRIS 시스템 제안
3. IRIS 시스템 구조
주요 구성 요소:
- 후보 API 추출
- 외부 라이브러리 및 내부 함수의 formal parameter들을 source/sink 후보로 추출
- LLM을 통한 Source/Sink 명세 추론
- LLM에게 prompt를 주어 source, sink를 구분하도록 요청
- 정적 분석 수행 (CodeQL 사용)
- LLM이 추론한 명세를 기반으로 CodeQL을 실행하여 취약점 탐지
- 문맥 기반 필터링
- LLM을 이용해 탐지된 경로가 진짜 취약점인지 거짓 양성인지 분류
기술적 정의:
- taint source/sink: 악의적 데이터의 시작점과 종료점
- sanitizer: 데이터 흐름을 막는 정화 로직
4. 데이터셋: CWE-Bench-Java
- 총 120개의 취약점
- CWE-22: 경로 조작 (55개)
- CWE-78: 명령어 삽입 (13개)
- CWE-79: XSS (31개)
- CWE-94: 코드 삽입 (21개)
- 특징
- Maven 기반 실무 프로젝트
- 평균 30만 LOC (최대 700만 LOC)
- GitHub URL, 취약한 버전, 수정 커밋 포함
- 자동 빌드 및 수동 확인 지원
5. 평가 결과
탐지 성능 비교 (총 120개 중 탐지 수):
방법 탐지 수 FDR (↓) F1 점수 (↑)
| CodeQL | 27 | 90.03% | 0.076 |
| IRIS + GPT-4 | 55 | 84.82% | 0.177 |
| IRIS + GPT-3.5 | 47 | 90.42% | 0.096 |
- GPT-4 사용 시 가장 높은 탐지 성능
- 작은 LLM(DeepSeekCoder 7B)도 높은 성능 달성 (탐지 52건)
신규 취약점 탐지:
- 30개 최신 Java 프로젝트에 대해 IRIS 적용
- 기존 도구가 탐지하지 못한 6개의 신규 취약점 탐지 (예: Zip Slip 등)
LLM이 추론한 명세 품질:
- GPT-4 기준 sink 명세의 재현율 87.11%
- 수동 평가 결과 precision 70% 이상
6. 기존 연구와의 차별성
기존 접근 IRIS 접근
| 정적 분석만 사용 | 정적 분석 + LLM 조합 |
| API 명세 수동 작성 필요 | LLM이 자동 추론 |
| 많은 거짓 양성 발생 | 문맥 기반 필터링으로 감소 |
| 메서드 단위 탐지 | 전체 프로젝트 단위 탐지 |
7. 결론 및 한계점
- IRIS는 정적 분석과 LLM의 결합을 통해 취약점 탐지 성능을 대폭 향상시킴
- 새로운 데이터셋과 함께 공개되어 reproducibility 보장
- 한계점:
- 다른 언어로의 일반화는 아직 검증되지 않음
- 많은 LLM 호출로 인해 비용 발생
- 개발자에게 유용한 리포트 형식은 아직 미흡