Arya Kavian, LLM Security Guard for Code, 2024
지금 하고 있는 프로젝트를 위해 코드에서 LLM이 보안 취약점을 식별하고 검증할 수 있는가를 공부하고 있다.
논문이 짧기도 하고, 레퍼런스가 될 수 있는 서비스인 것 같아 읽게 되었다.
요약
- 이 논문은 LLMSecGuard라는 프레임워크를 소개하는 것이다.
- 정적 코드 분석과 LLM의 시너지를 이용해 코드의 보안성을 높이는 것을 목표로 한다.
연구에서는 Copilot이나 ChatGPT와 같이 현재 많이 쓰이고 있는 LLM 서비스가 제공하는 코드에 대한 취약성, 그리고 이미 작성된 코드의 취약점을 발견할 수 있는지 두 가지 관점을 모두 언급하였다.
아래와 같은 문제점을 가지고 있다.
- 하드코딩된 개인정보(패스워드, API 키 등)를 식별하지 못함 + 사용
- ECB와 같은 암호화 방식 사용
- 고정된 키와 salt 값 사용
위와 같은 문제점을 다시 개선 요청했을 때:
- 암호화 모드: ECB -> GCB
- salt: 고정된 값 여전히 사용
- 비밀번호: 하드코딩해서 사용
- 키 유도: SHA-256 해시로 직접 유도(보안적으로 적절하지 않음)
어쨌든 논문이 작성된 시점까지의 인공지능은 코드가 가진 취약점에 대해 분석하고 개선하는 능력이 부족함을 알 수 있다. 물론, 사용자가 지적하면 수정하기는 했지만 그렇다는 것은 결국 코드를 작성하라고 지시한 사용자가 보안 취약점에 대한 지식을 가지고 있어야 한다는 결론으로 귀결된다. 하지만 모든 개발자가 충분한 보안 지식을 가지고 개발하는 것은 아니므로(현실적으로 어려우므로..)
LLMSecGuard
- 정적 분석: LLM이 생성한 코드를 분석, 보안 취약점 탐지하는 여러 에이전트가 있는 구조
- LLM 재질문: 생성된 코드 분석 -> 취약점 기반으로 LLM 재질문 -> 코드 개선 유도
- 벤치마크: 다양한 LLM의 보안 수준을 비교 및 평가함(CWE 기반)
- REST API, 파이썬과 SQLite로 구현
조금 의문인 점은, 왜 CWE를 기준으로 평가했느
이 프레임워크의 흥미로운 점은 세 가지 에이전트가 존재하고 이들이 각각의 역할을 수행함으로서 LLM이 생성한 코드를 평가하고 수정을 유도한다는 것이다.
Architecture(Core Componants)
- Prompt Agent
- 사용자 입력을 LLM에 전달하고 응답을 수집
- 취약점 피드백 기반으로 프롬프트를 재작성해서 LLM에게 전달
- Security Agent
- 정적 분석 도구(Semgrep, Wggli 등) 이용해 코드의 보안 취약점 탐지
- Benchmark Agent
- LLM의 응답을 CyberSecEval과 같은 벤치마크와 비교하여 보안 성능을 평가
여기서 말하는 벤치마크가 무엇인지 읽는 내내 의문이었다.
Security Benchmarking이란?
보안 서비스를 개선하는데 도움이 되는 모범 사례 및 권장 사항
여기서 언급됐던 CyberSecEval 또한 (당연하지만) LLM의 보안 문제들에 관련된보안 벤치마크라고 한다.
Scenarios
- 보안 벤치마킹
- 여러 LLM에 동일한 보안 관련 프롬프트를 입력
- 생성된 코드의 보안 취약점(CWE 수, 심각도 등)을 기준으로 LLM을 랭킹화
- 안전한 코드 생성
- 사용자가 프롬프트 입력 -> LLM 응답
- 정적 분석 후 취약점이 발견되면 해당 내용을 반영하여 재질문
- 취약점이 모두 사라질 때 or 반복문 최대 횟수 도달 때까지 반복해서 수행
후기
에이전트를 여러 개 두고 프롬프트를 재점검한다는 점이 흥미로웠다. 요즘 전문가 AI가 트렌드가 되어가고 있는 것 같은데... 계획하고 있는 프로젝트에도 이런 방향성을 추가하면 좋을 것 같다는 생각이 들었다.