EdgeGuard, AI 코드 리뷰 시험
- •EdgeGuard는 코드가 운영 환경에 가기 전 AI가 보안 엣지 케이스를 찾을 수 있는지 시험했다
- •OWASP Java 벤치마크는 알 수 없는 헬퍼 함수에 대한 낙관적 가정이 false negative를 만든다는 점을 드러냈다
- •워크스페이스 스캔은 7,536개 함수, 2,771개 파일, 2,145개 잠재 결함을 찾아냈다
푹 풍(Phúc Phùng)은 코드가 운영 환경에 배포되기 전 AI가 개발자의 엣지 케이스와 보안 문제 탐지를 도울 수 있는지 시험하기 위해 오픈소스 VS Code 확장 프로그램 EdgeGuard를 만들었다. 이 프로젝트는 대부분의 AI 코딩 도구가 코드 작성에는 강하지만, 코드가 어떻게 실패할 수 있는지 조사하는 데는 상대적으로 약해 보인다는 문제의식에서 출발했다. OWASP Benchmark for Java를 대상으로 한 초기 테스트에서 모델은 신뢰할 수 없는 HTTP 입력과 SQL 쿼리 생성을 인식했지만, 입력과 SQL 싱크 사이에 알 수 없는 헬퍼 함수가 있으면 위험한 코드를 SAFE로 표시하는 경우가 있었다.
false negative는 누락된 코드에 대한 낙관적 가정에서 나왔다. 예시에서 `request.getParameter("id")`는 데이터를 `DatabaseHelper.doSomething(param)`에 전달했고, 반환값은 `"SELECT FROM USERS WHERE ID='" + bar + "'"`에 문자열로 결합됐다. LLM은 `doSomething()`이 무엇을 하는지 검사할 수 없었기 때문에 헬퍼가 입력을 정제했을 가능성이 높다고 가정했다. 이에 EdgeGuard는 정제가 있었다는 증거가 없는 한 taint(신뢰할 수 없는 데이터 흐름 추적)를 유지하라고 모델에 지시하는 방식으로 전략을 바꿨다.
EdgeGuard는 이제 모델에 SAFE 또는 VULNERABLE 라벨만 요구하지 않고, 증거 중심 추론을 생성하도록 요청한다. 일반적인 추론 사슬은 신뢰할 수 없는 입력이 HTTP 요청에서 왔고, 알 수 없는 헬퍼에 들어간 뒤에도 taint가 남았으며, 이후 문자열 결합을 통해 SQL 쿼리에 도달했다는 흐름을 기록한다. 결론은 헬퍼가 아마 무엇을 했을지에 대한 추측이 아니라 잠재적 SQL 인젝션이 된다.
다음 문제는 규모였다. 대형 프로젝트에는 get(), set(), ToString(), Equals(), 단순 CRUD 메서드, 데이터 매핑, 유틸리티 함수처럼 보안 분석에 유용하지 않은 메서드가 수천 개씩 포함된다. 모든 코드를 LLM에 보내면 API rate-limit 부담과 API 비용이 커진다. EdgeGuard는 API 호출 전에 코드를 파싱하고 데이터베이스 싱크, 파일 시스템 접근, 프로세스 실행, 네트워크 경계, 사용자 제어 입력, 위험한 API, 누락된 검증을 찾는 로컬 Static Risk Screening 단계를 VS Code 안에 추가했다.
전체 OWASP Benchmark Java 프로젝트의 워크스페이스 스캔은 2,771개 파일에서 7,536개 함수를 찾았다. 로컬 필터는 모든 함수를 모델에 보내는 대신 LLM 조사가 필요한 고위험 후보를 골랐다. 해당 테스트에서 EdgeGuard는 SQL 인젝션, command injection, unsafe data flows, 기타 input-to-sink 경로를 포함해 2,145개 잠재 결함을 보고했다. 구조는 함수 1개당 LLM 요청 1개를 보내는 방식에서, 전체 워크스페이스 로컬 스크리닝 뒤 표적 AI 조사를 수행하는 방식으로 바뀌었다.
푹 풍은 Java와 OWASP Benchmark, TypeScript와 OWASP Juice Shop, C#과 Microsoft eShopOnWeb 조합으로도 EdgeGuard를 시험했다. Java, C#, TypeScript는 문법, AST 구조(코드 트리 표현), 언어 관례, 보안 API, 프로젝트 구조가 서로 다르다. EdgeGuard는 언어별 컨텍스트 계층을 분리해 Java, C#, TypeScript 컨텍스트를 따로 유지하면서도 조사 엔진은 공유되도록 했다.
EdgeGuard는 취약점 탐지를 넘어 반례 입력과 실행 가능한 검증 테스트를 생성하도록 설계됐다. 언어에 따라 C#은 xUnit, Java는 JUnit, TypeScript는 Mocha를 사용할 수 있다. 이 프로젝트는 빠르고 결정적인 스크리닝을 위한 정적 분석, 복잡한 코드 경로 추론을 위한 LLM 조사, AI 가설을 증거로 바꾸는 검증을 결합한다. 확장 프로그램은 GitHub의 phucphungbk/edgeguard에서 오픈소스로 공개돼 있으며, 저자는 피드백, 버그 보고, 벤치마크 결과, 아키텍처 비판을 요청했다.