Reva가 LLM 내부 표현을 읽어 함수 취약점을 1초에 판별한다

Reva: Real-Time Vulnerability Detection through Contextual Probing of Large Language Models

arXiv2610.35829v1

Amine Lbath2026-10-26

무엇인가

이 논문은 코드 생성 에이전트가 리뷰 속도보다 빠르게 함수를 만들어내는 상황에서, 새 함수를 실시간으로 검사할 1차 방어선을 다룬다. 취약점은 늦게 발견할수록 수정 비용이 커지지만, 정적 분석기는 실시간으로 돌 수 있는 대신 오탐이 많고, LLM 에이전트 기반 탐지기는 보안 전문가처럼 도구를 호출하고 주변 코드를 탐색하며 가설을 검증해 정확도는 높지만 함수당 수 분이 걸린다. 빠른 딥러닝 미세조정이나 LLM에 직접 판정을 요구하는 방식은 문맥이 부족하고 LLM의 판정 자체가 불안정해 정확도가 낮다고 저자들은 정리한다.

어떻게 동작하나

Reva는 이 간극을 단일 순전파로 줄이려 한다. 새 함수마다 모듈의 사전 계산된 위협 모델, Semgrep 정적 분석 결과, 호출 지점과 헬퍼 시그니처, 파일의 include·type·macro·형제 함수 등을 라벨이 붙은 섹션으로 프롬프트에 넣는다. 위협 모델은 프로젝트 전체를 본 LLM 에이전트 워크플로가 프로젝트 요약, 공격자 제어 입력, 신뢰 경계와 함수가 속한 모듈의 역할, 입력, 전형적 싱크와 가드를 기술한다. 컨텍스트는 훈련 함수의 84%에서 사용 가능했고, 없으면 함수와 Semgrep 결과만 넣는다. 중앙값 프롬프트는 3,840토큰이며 그중 601토큰이 코드다.

무엇과 다른가

LLM은 프롬프트를 한 번 순전파하고, 깊이 38%에서 85% 사이에 균등 배치된 네 개의 중간 레이어 중 가장 깊은 곳에서 멈춘다. 출력 토큰은 생성하지 않는다. 각 프로브 레이어에서 함수 토큰의 은닉 상태만 남겨 정규화하고 1,024차원으로 투영한 뒤 네 레이어를 연결한다. 8개 어텐션 헤드와 0.57M 파라미터를 가진 프로브가 토큰 상태를 하나의 위험 점수로 풀링한다. 학습 손실은 함수별 분류 항과 취약 함수를 같은 함수의 무취약 버전보다 위로 랭크하는 항을 결합하며, 쌍은 학습에만 쓰고 추론에서는 각 함수를 독립적으로 채점한다.

어떻게 쓰나

실무 배치에서는 LLM과 Semgrep 규칙을 시작 시 한 번 로드하고 프로젝트 위협 모델을 미리 만든다. 새 함수마다 문맥 추출, Semgrep 실행, 프롬프트 구성, 순전파, 프로브 적용을 수행한다. Muse-Glimmer-30B와 H200 한 장에서 함수당 0.93초가 걸렸고 그중 0.46초가 문맥 추출이었다.

전제와 한계

평가는 PrimeVul의 held-out 테스트셋에서 했다. PrimeVul은 취약 C/C++ 함수와 같은 함수의 무취약 버전을 쌍으로 만들며 651개 프로젝트, 121개 CWE, 3,789개 훈련 쌍, 480개 검증 쌍, 435개 테스트 쌍을 가진다. 저자들은 각 함수를 독립 채점한 전체 정확도를 주 지표로 삼고, 두 버전을 모두 맞힌 쌍(P-C), 둘 다 취약으로 표시한 쌍(P-V), 둘 다 무취약으로 표시한 쌍(P-B), 라벨이 뒤집힌 쌍(P-R)도 함께 본다. 모든 설계 선택은 훈련·검증 세트에서만 했고 테스트 세트는 최종 설정으로만 채점했다. GLM-5.3-Flash에서 Reva는 60.0% 정확도(95% CI 57.8~62.2)로 VulTriage 59.2%, VulAgent 52.8%와 비교된다. 전체 테스트 함수 기준으로 VulTriage보다 0.8포인트 높고(CI -2.1~+3.8), VulAgent보다 7.2포인트 높다(CI +4.4~+10.3). Qwen3.8-27B와 Muse-Glimmer-30B에서는 두 에이전트 탐지기보다 5.1~6.7포인트 더 정확했고 네 신뢰구간 모두 0을 포함하지 않았다. Reva는 세 LLM 모두에서 VulTriage보다 낮은 거짓양성률을 보였고 라벨이 뒤집힌 쌍이 적었으며 두 LLM에서는 완전히 맞힌 쌍이 더 많았다. LLM 간 정확도 변동도 1.1포인트로 VulTriage의 5.6포인트보다 작아, Muse-Glimmer-30B의 Reva가 VulTriage가 가장 잘 동작한 GLM-5.3-Flash의 VulTriage와 맞먹었다. VulTriage의 GPT-4o 63.6% 보고는 재현하지 못했다고 밝힌다.

비용 면에서 Reva는 함수당 0.88~1.33초로, 같은 LLM의 에이전트 탐지기 108~5,614초와 큰 격차를 보였다. 함수당 약 3,100~3,400토큰을 읽고 출력 토큰은 0개인 반면, 에이전트 탐지기는 3~70배 더 많은 토큰을 처리하며 그 상당 부분을 생성한다. 은닉 상태가 필요해 API 뒤에서 돌 수 없고, H200 임대 기준 1,000개 함수를 0.9~1.3달러에 스크리닝해 VulTriage 9~61달러, VulAgent 63~307달러보다 낮다고 보고한다. 절제 실험에서 같은 프롬프트로 LLM에 Yes/No 판정을 요구하면 정확도가 우연 수준으로 떨어졌고, 테스트 세트에서도 프로브보다 7.4~8.7포인트 낮았다. Semgrep, Cppcheck, Flawfinder만으로는 50.8~51.3%로 우연 수준이었다. 프로브에서 어텐션 풀링을 단순 평균으로 바꾸면 4.2포인트 하락해 취약점 증거가 소수 토큰에 있다는 해석을 뒷받침한다. 단일 레이어 사용, 표준화 생략, 랭킹 항 제거는 0.4~1.5포인트 하락했고 저장소 문맥 제거와 함수만 사용은 각각 1.0, 1.9포인트 하락했으나 유의하지 않았다. PrimeVul의 짧은 함수에서는 함수 자체가 대부분 신호를 담고, 문맥은 함수 간 취약점에서 더 중요할 것으로 저자들은 본다. 프로젝트가 훈련·평가 폴드에 겹치지 않게 하면 교차검증 정확도가 1.3~2.7포인트만 떨어졌고, 프로브 레이어 선택을 훈련 폴드에서만 해도 0.5포인트 미만 변했다. 다만 테스트 정확도는 교차검증보다 6포인트 낮았는데(GLM-5.3-Flash 60.0% 대 66.2%), PrimeVul이 시간순으로 분할돼 최신 코드로의 이동이 반영된 것으로 해석한다.

개발자에게 이 논문은 코딩 에이전트가 함수를 생성하는 즉시 1차 스크리닝하는 용도로 Reva를 제안한다. 다만 LLM의 은닉 상태를 읽어야 하므로 상용 API만으로는 적용할 수 없고 자체 GPU에서 모델을 돌려야 한다. 위협 모델을 프로젝트 단위로 미리 만들어야 하고, 문맥이 없는 함수는 함수와 Semgrep 결과만으로 채점된다. 저자들도 PrimeVul의 짧은 함수에서는 저장소 문맥 효과가 유의하지 않았고, 테스트와 교차검증의 6포인트 격차가 시간적 분포 이동에서 올 수 있다고 인정한다. 또 평가는 C/C++ PrimeVul과 세 오픈 LLM에 한정되며, 에이전트 탐지기의 실패는 무취약으로 계산했고, 시간 측정은 병렬 부하 아래라 단일 요청 지연을 과대평가할 수 있다. 저자들의 핵심 주장은 LLM 내부 표현이 에이전트 탐지기가 추론으로 얻는 정보의 상당 부분을 이미 담고 있다는 것이다. 향후 계획은 더 큰 LLM, 다른 데이터셋, 함수 간 취약점, LLM 학습 컷오프 이후 공개된 취약점으로 검증하고, 위험도가 높은 함수만 에이전트 탐지기나 취약점 증명 검사로 에스컬레이션하는 보정된 스크리닝 루프를 만드는 것이다.