Neuro-symbolic Static Analysis with LLM-generated Vulnerability Patterns
이 논문은 LLM 을 활용하여 취약성 패턴을 자동으로 생성하고 심볼릭 검증을 통해 정밀도를 높이는 신경 심볼릭 정적 분석 프레임워크 'MoCQ'를 제안하며, 이는 전문가 수준의 성능을 유지하면서 기존에 발견되지 않았던 새로운 취약성 패턴과 실제 취약점을 다수 발견하는 성과를 거두었습니다.
원저자:Penghui Li, Songchen Yao, Josef Sarfati Korich, Changhua Luo, Jianjia Yu, Yinzhi Cao, Junfeng Yang
소프트웨어 보안 취약점을 찾는 일은 마치 거대한 도서관 (코드베이스) 에서 위조된 책 (해킹된 코드) 을 찾아내는 것과 같습니다.
1. 기존 방식의 문제점: "수작업으로 만든 검색 규칙"
예전에는 보안 전문가들이 직접 "위조된 책은 이런 특징이 있다"라고 **검색 규칙 (패턴)**을 일일이 손으로 작성했습니다.
문제: 이 규칙을 만드는 데는 몇 주에서 몇 달이 걸립니다. 또한, 인간은 실수를 하거나 새로운 유형의 위조 책을 놓칠 수 있습니다. 규칙이 너무 많고 복잡해서 AI 가 이해하기 어렵기도 합니다.
2. MoCQ 의 등장: "AI 가 규칙을 만들어주는 시스템"
MoCQ 는 **대규모 언어 모델 (LLM, 예: 챗봇 AI)**을 활용하여 이 검색 규칙을 자동으로 만들어줍니다. 하지만 AI 만 믿고 맡기면, AI 가 엉뚱한 규칙을 만들거나 문법 오류를 범할 수 있습니다.
그래서 MoCQ 는 두 가지 핵심 기술을 사용합니다.
🔑 핵심 기술 1: "검색어 필터링 (DSL 서브셋)"
상황: AI 에게 도서관의 모든 규칙 (수천 개의 검색어) 을 다 알려주면, AI 는 너무 많은 정보에 압도되어 헛소리를 합니다.
해결책: MoCQ 는 AI 가 이해하기 쉬운 핵심 규칙만 추려서 (Subset) 알려줍니다.
비유: 도서관 사서가 AI 에게 "너는 '저자 이름'과 '출판연도'만 검색하면 돼. 나머지 복잡한 건 내가 다 정리해 줄게"라고 알려주는 것과 같습니다. 이렇게 하면 AI 가 더 정확하게 규칙을 만들 수 있습니다.
🔑 핵심 기술 2: "실시간 피드백 루프 (반복 수정)"
상황: AI 가 만든 규칙을 실제로 적용해 보면, 문법 오류가 나거나 (책 제목을 잘못 적음), 중요한 책을 놓치거나 (검색어가 너무 좁음), 엉뚱한 책까지 다 잡아옵니다 (검색어가 너무 넓음).
해결책: MoCQ 는 AI 가 만든 규칙을 실제로 실행해 보고, 틀린 부분을 구체적으로 알려줍니다.
비유: AI 가 "이 책은 위조된 거야!"라고 말하면, **검증 시스템 (Symbolic Validator)**이 "아니야, 이 책은 10 페이지에서 오류가 났어. 다시 수정해"라고 구체적인 피드백을 줍니다.
AI 는 이 피드백을 받고 규칙을 수정합니다. 이 과정을 수십 번 반복하다가 마침내 완벽한 검색 규칙이 완성됩니다.
🚀 MoCQ 가 이룬 성과
이 시스템은 다음과 같은 놀라운 결과를 낳았습니다.
시간 단축: 전문가들이 몇 주 걸려 만들던 규칙을 몇 시간 만에 만들어냈습니다.
새로운 발견: 기존 전문가들이 놓친 46 가지 새로운 취약점 패턴을 찾아냈습니다. 마치 기존에 몰랐던 새로운 위조 수법을 발견한 것과 같습니다.
실제 해킹 발견: 실제 운영 중인 소프트웨어에서 **25 개의 새로운 보안 위협 (제로데이 취약점)**을 찾아내어 개발자들에게 알렸습니다.
전문가와의 시너지: AI 가 만든 규칙과 전문가가 만든 규칙을 합치면, 둘 중 하나만 쓸 때보다 훨씬 더 많은 해킹을 찾아낼 수 있었습니다. (AI 는 미세한 문법적 뉘앙스를 잘 포착하고, 전문가는 큰 그림을 잘 보니까요.)
💡 결론: 왜 이것이 중요한가요?
MoCQ 는 "AI 가 규칙을 만들고, 검증 시스템이 이를 다듬어주는" 새로운 방식을 제시합니다. 이전에는 보안 전문가들의 수고와 시간이 많이 들었지만, 이제는 AI 가 그 부담을 덜어주어 더 빠르고 정확하게 소프트웨어를 지킬 수 있게 되었습니다. 마치 초보 탐정 (AI) 이 베테랑 수사관 (전통적 도구) 의 도움을 받아, 더 넓은 범위를 빠르게 수색할 수 있게 된 것과 같습니다.
이 기술은 앞으로 더 많은 소프트웨어가 안전하게 지킬 수 있는 길을 열어줄 것입니다.
이 논문은 MoCQ(Model-Generated Code Queries) 라는 이름의 신경 - 기호 (Neuro-symbolic) 정적 분석 프레임워크를 제안합니다. MoCQ 는 대규모 언어 모델 (LLM) 을 활용하여 취약성 탐지 패턴을 자동으로 생성하고, 이를 정적 분석 도구 (Joern, CodeQL) 에 통합하여 정밀하고 확장 가능한 취약성 탐지를 가능하게 합니다.
다음은 논문의 주요 내용을 문제 정의, 방법론, 핵심 기여, 실험 결과, 그리고 의의로 나누어 요약한 것입니다.
1. 문제 정의 (Problem)
기존 정적 분석의 한계: 패턴 기반 정적 분석은 대규모 코드베이스를 확장성 있게 분석할 수 있지만, 취약성 패턴 (Query) 을 수동으로 작성하는 데 막대한 시간과 전문가의 노력이 필요합니다. 새로운 위협이 등장할 때마다 패턴을 업데이트하는 과정은 수주에서 수개월이 걸리며, 인간의 지식 한계로 인해 누락되거나 부정확한 패턴이 생성될 수 있습니다.
학습 기반 접근법의 부족: 기존 머신러닝 기반 방법들은 함수 단위 분류에 그치는 경우가 많고, 프로젝트 전체의 맥락 (Interprocedural context) 을 고려하지 못하며, 방대한 레이블 데이터가 필요합니다.
LLM 의 직접적 적용의 어려움: LLM 은 코드 의미 이해에 뛰어나지만, 정적 분석 도구가 사용하는 도메인 특화 언어 (DSL) 의 문법 오류를 자주 범하거나, 실행 시 예외를 발생시키며, 할루시네이션 (Hallucination) 으로 인해 신뢰할 수 없는 쿼리를 생성합니다. 또한 토큰 길이 제한과 일관성 없는 추론 문제도 존재합니다.
2. 방법론 (Methodology)
MoCQ 는 LLM 의 의미 이해 능력과 정적 분석의 정밀한 논리를 결합한 신경 - 기호 (Neuro-symbolic) 접근법을 사용합니다. 주요 기술적 구성 요소는 다음과 같습니다.
DSL 서브셋팅 (DSL Subsetting):
정적 분석 도구 (Joern, CodeQL) 의 DSL 은 매우 복잡하여 LLM 이 문법 오류를 자주 범하게 합니다.
MoCQ 는 DSL 의 전체 명세를 분석하여 핵심 기능만 선별한 서브셋 (Subset) 을 자동 추출합니다. 이는 LLM 이 이해하기 쉽도록 복잡도를 낮추면서도 취약성 탐지에 필요한 표현력은 유지합니다.
반복적 피드백 루프 (Iterative Feedback Loop):
LLM 이 생성한 쿼리는 심볼릭 쿼리 검증기 (Symbolic Query Validator) 를 통해 검증됩니다.
검증기는 문법 오류, 실행 시 예외, 의미적 오류 (Semantic errors) 를 감지하고, 구체적인 오류 위치와 중간 프로그램 상태 (Intermediate program state) 를 LLM 에게 피드백합니다.
LLM 은 이 피드백을 바탕으로 쿼리를 수정하고, 이 과정이 쿼리가 유효해질 때까지 반복됩니다.
쿼리 최적화 (Query Optimization):
과적합 (Overfitting) 방지: 특정 예제에 지나치게 맞춰진 쿼리를 일반화 (Generalization) 하여 실제 환경에서도 작동하도록 합니다.
거짓 긍정 (False Positive) 제거: LLM 을 활용하여 탐지된 결과 중 거짓 긍정을 식별하고 쿼리를 정제합니다.
쿼리 병합 (Merging): 여러 예제별로 생성된 쿼리를 하나의 최적화된 쿼리로 병합하여 분석 효율성을 높입니다.
3. 핵심 기여 (Key Contributions)
MoCQ 프레임워크 제안: DSL 서브셋팅과 피드백 기반 정제를 통해 취약성 패턴을 처음부터 끝까지 (End-to-End) 자동 생성하는 신경 - 기호 프레임워크를 제안했습니다.
다중 언어 및 도구 지원: Joern 과 CodeQL 두 가지 최첨단 정적 분석 도구에 MoCQ 를 구현하여 C/C++, Java, PHP, JavaScript 등 4 개 언어에서 작동함을 입증했습니다.
성능 및 발견:
전문가가 수작업으로 만든 패턴과 비교했을 때 동등하거나 더 나은 탐지 성능을 보였습니다.
46 개의 새로운 취약성 패턴을 발견했으며, 이는 기존 전문가들이 놓친 부분입니다.
25 개의 새로운 제로데이 (Zero-day) 취약점을 실제 응용 프로그램에서 발견했습니다.
개발 효율성 극대화: 패턴 생성에 필요한 시간을 수주에서 수 시간으로 단축했습니다.
4. 실험 결과 (Results)
데이터셋: 4 개 언어 (C/C++, Java, PHP, JavaScript) 의 12 가지 취약성 유형 (Use-after-free, SQL Injection, Prototype Pollution 등) 에 대해 평가했습니다.
생성 성공률: 212 개의 취약성 예제 중 77.4% (164 개) 에서 성공적으로 유효한 쿼리를 생성했습니다.
탐지 성능:
MoCQ 가 생성한 쿼리는 테스트 세트의 343 개 알려진 취약점 중 269 개 (78%) 를 탐지했습니다.
전문가가 만든 쿼리와 비교 시, MoCQ 는 269 개의 True Positive (TP) 를 기록한 반면, 전문가 쿼리는 222 개의 TP 를 기록했습니다.
두 방법을 결합하면 292 개의 TP 를 탐지하여 가장 높은 커버리지 (85%) 를 달성했습니다.
새로운 발견:
46 개의 새로운 패턴: 예를 들어, PHP 의 타입 조종 (Type juggling) 메커니즘 중 일부나 JavaScript 의 데이터 흐름 전파 방식 등 기존에 알려지지 않은 패턴들을 발견했습니다.
25 개의 실제 취약점: GitHub 의 오픈소스 프로젝트 등에서 25 개의 새로운 취약점을 발견하여 보고했으며, 이 중 14 개가 인정받고 5 개는 이미 수정되었습니다.
비교 평가:
순수 LLM 기반 방법, IRIS (타인 소스/싱크만 생성), KNighter (Clang 분석기 생성) 등 기존 SOTA 방법들보다 우수한 성능을 보였습니다. 특히 MoCQ 는 인터프로시저 (Interprocedural) 분석과 복잡한 데이터 흐름 추적을 효과적으로 수행했습니다.
5. 의의 및 결론 (Significance)
자동화의 혁신: 보안 전문가의 수작업 의존도를 크게 낮추고, 새로운 위협에 대한 대응 시간을 획기적으로 단축했습니다.
상호 보완적 강점: LLM 은 인간이 놓치기 쉬운 미세한 언어적 뉘앙스나 패턴을 포착하는 데 뛰어나고, 인간은 복잡한 맥락 이해에 강점이 있음을 보여주었습니다. MoCQ 는 이 두 가지를 결합하여 최적의 탐지 성능을 달성했습니다.
확장성: 이 프레임워크는 Joern 과 CodeQL 외에도 다른 쿼리 기반 정적 분석 도구로 확장 가능하며, 새로운 취약성 유형이 등장할 때도 소수의 예제만 있으면 빠르게 패턴을 생성할 수 있습니다.
결론적으로, MoCQ 는 LLM 의 생성 능력과 정적 분석의 엄밀함을 결합하여 소프트웨어 보안 분석의 접근성과 적응성을 높이는 유망한 방향을 제시합니다.