Metis 소개
Metis는 ARM의 제품 보안(Product Security) 팀이 개발하여 공개한 AI 기반의 오픈소스 보안 코드 리뷰 도구입니다. 그리스 신화 속 '지혜의 여신'인 메티스(Metis)에서 이름을 따온 이 도구는, 기존의 정적 분석 도구(SAST, Static Application Security Testing)가 놓치기 쉬운 설계상의 결함이나 복잡한 논리적 버그를 찾아내는 데 특화되어 있습니다.
전통적인 코드 리뷰 도구들이 단순히 사전에 정의된 규칙(Rule)이나 패턴 매칭에 의존해 코드를 검사했다면, Metis는 대규모 언어 모델(LLM) 과 검색 증강 생성(RAG, Retrieval Augmented Generation) 기술을 활용합니다. 이를 통해 코드의 문맥(Context)과 의도를 파악하고, 마치 숙련된 보안 엔지니어가 리뷰하듯 "왜(Why)" 해당 코드가 취약한지를 설명해 줍니다. 특히 거대하고 오래된 레거시 코드베이스나 복잡한 시스템에서 발생하는 미묘한 취약점을 탐지하는 데 강력한 성능을 발휘합니다.

소프트웨어 보안 분야에서 기존의 정적 분석 도구(Static Analysis Tool)는 높은 오탐지율(False Positive)과 문맥 이해 부족이라는 한계가 있었습니다. Arm은 이러한 문제를 해결하고 내부 보안 검토의 효율성을 높이기 위해 Metis를 개발했으며, 이를 커뮤니티와 공유하기 위해 Apache 2.0 라이선스로 오픈소스로 공개했습니다.
Metis는 기존의 정적 분석 도구(SAST)를 대체하는 것이 아니라, 이를 보완하여 더 깊이 있는 분석을 제공하는 것을 목표로 합니다. 주요 차이점을 정리하면 다음과 같습니다:
| 특징 | 기존 SAST 도구 | Metis |
|---|---|---|
| 분석 방식 | 결정론적(Deterministic), 규칙 및 패턴 기반 | 비결정론적(Non-deterministic), 문맥 인식 및 추론 기반 |
| 코드 이해도 | 구문(Syntax) 수준의 분석 | 의미(Semantic) 및 아키텍처 수준의 이해 |
| 오탐지(False Positives) | 문맥 파악 불가로 인해 높음 | RAG를 통한 문맥 필터링으로 낮음 |
| 취약점 설명 | 규칙 ID 및 짧은 메시지 제공 | 자연어로 된 상세한 설명 및 수정 제안 |
| 유연성 | 취약점 유형별 커스텀 규칙 작성 필요 | 프롬프트(Prompt) 수정을 통한 유연한 대응 |
Metis의 주요 기능
Metis는 단순한 린터(Linter)를 넘어, 코드의 "의도"를 파악하고 보안성을 검토하기 위해 다음과 같은 핵심 기능을 제공합니다.
심층 추론 (Deep Reasoning) & 문맥 인식 (Context-Aware)
Metis는 LLM을 사용하여 코드를 단순히 텍스트로 읽는 것이 아니라 그 의미를 해석합니다. 특히 RAG(검색 증강 생성) 기술을 적용하여, 분석 대상 파일뿐만 아니라 전체 코드베이스의 관련 로직, 문서, 주석 등을 참조합니다. 이를 통해 함수 경계를 넘나드는 메모리 처리 오류나, 제어 흐름상의 논리적 허점 등 "문맥을 알아야만 보이는" 취약점을 찾아냅니다.
다양한 LLM 공급자 지원 (Provider Flexibility)
사용자의 환경에 맞춰 다양한 LLM을 선택하여 사용할 수 있습니다.
-
클라우드 모델: OpenAI (GPT-4 등) 및 OpenAI 호환 엔드포인트 지원
-
로컬 모델: 데이터 유출이 우려되는 경우 Ollama, vLLM, LiteLLM 등을 통해 로컬 환경에서 모델을 구동하여 보안성을 높일 수 있습니다.
플러그인 기반 확장성 (Plugin-Friendly)
Metis는 확장성을 고려하여 설계되었습니다. plugins.yaml 설정을 통해 새로운 프로그래밍 언어나 프롬프트 템플릿을 쉽게 추가할 수 있습니다.
-
언어 지원: 출시 시점에는 C/C++를 기본 지원하며, 플러그인을 통해 다른 언어로 확장이 가능합니다. (최근 업데이트를 통해 Solidity 등도 지원 시도 중)
-
벡터 저장소: 분석을 위한 벡터 DB로 ChromaDB(기본, 설정 불필요) 또는 PostgreSQL + pgvector(대규모 프로젝트용)를 지원합니다.
자동화 및 CI/CD 통합
대화형 모드(Interactive Mode) 외에도, CI/CD 파이프라인에서 자동으로 실행될 수 있도록 비대화형 모드(Non-Interactive Mode) 를 지원합니다. 비대화형 모드는 다음과 같은 명령어로 실행할 수 있습니다:
metis --non-interactive --command "review_code" --output-file report.json
Metis 설치 및 사용 방법
기본적으로 Metis는 로컬 환경에서 ChromaDB를 사용합니다. 원하는 경우 pgvector를 설치한 PostgreSQL을 설정하여 확장성 있는 인덱싱 및 여러 프로젝트를 지원할 수 있습니다.
Metis는 다음과 같이 저장소를 복제한 뒤, uv를 사용하여 설치합니다:
# 저장소 복제
git clone https://github.com/arm/metis.git
cd metis
# 가상 환경 생성 및 설치 (uv 권장)
uv venv
uv pip install .
# 또는 시스템 전역 설치
uv pip install . --system
# PostgreSQL(pgvector) 백엔드 지원 포함 설치 시
uv pip install '.[postgres]'
설정 (Configuration)
Metis 실행 전 LLM 공급자에 대한 설정이 필요합니다. OpenAI를 사용할 경우 API 키를 환경 변수로 등록할 수 있습니다:
export OPENAI_API_KEY="your-key-here"
세부적인 런타임 설정은 작업 디렉터리에 metis.yaml 파일을 생성하여 오버라이드할 수 있습니다. 기본값은 src/metis/metis.yaml에 설정되어 있으며, 각 설정 값과 관련한 상세한 설명은 GitHub 저장소 README의 Configuration 섹션을 참고해주세요.
실행 (Usage)
Metis는 크게 코드베이스 인덱싱과 리뷰, 그리고 질의응답 기능을 제공합니다.
-
인덱싱 (Indexing): 먼저 Metis가 코드베이스를 탐색하고, 벡터화하여 VectorDB에 저장합니다.
# 코드 경로를 지정하여 Metis 실행 uv run metis --codebase-path <path_to_src> # Metis 프롬프트 내에서 실행 > index -
보안 리뷰 (Security Review): Metis가 전체 코드베이스에 대한 보안 분석을 수행합니다:
> review_code또는, 특정 코드에 대해서 리뷰를 요청할 수 있습니다. 아래는 취약점이 포함된 코드 분석을 요청하는 예시입니다:
> review_file src/memory/remap.c좀 더 상세하게,
src/memory/remap.c파일은 다음과 같은 취약점이 포함된 코드입니다:// 취약점이 포함된 src/memory/remap.c 예시 파일 // Remap memory addresses from one region to another for (uint32_t* ptr = start; ptr < end; ptr++) { uint32_t value = *ptr; if (value >= OLD_REGION_BASE && value < OLD_REGION_BASE + REGION_SIZE) { value = value - OLD_REGION_BASE + NEW_REGION_BASE; } }위 파일에 대한 분석 실행 결과는 다음과 같습니다:
File: src/memory/remap.c Identified issue 1: Address Remapping Loop Does Not Update Memory Snippet: for (uint32_t* ptr = start; ptr < end; ptr++) { uint32_t value = *ptr; if... Why: In the remap_address_table function, the code is intended to adjust address references from an old memory region to a new one. However, the updated value stored in the local variable 'value' is never written back into memory at the pointer location (*ptr). This means the address entries remain unchanged, which can lead to unintended behavior if the system relies on those values being relocated correctly. Mitigation: Update the loop so that after computing the new address, the value is written back. For example: for (uint32_t* ptr = start; ptr < end; ptr++) { uint32_t value = *ptr; if (value >= OLD_REGION_BASE && value < OLD_REGION_BASE + REGION_SIZE) { value = ((value - OLD_REGION_BASE) + NEW_REGION_BASE); *ptr = value; } } This ensures that each entry is properly updated to point to the relocated memory region. Confidence: 1.0 -
질의응답 (Ask): 코드의 아키텍처나 특정 로직에 대해 AI에게 질문할 수 있습니다. 다음과 같이 실행할 수 있습니다:
> ask "이 함수의 메모리 할당 방식이 안전한가?"
고급 설정 및 플러그인 확장
Metis는 단순한 실행을 넘어, 조직의 특수한 보안 요구사항이나 새로운 프로그래밍 언어 지원을 위해 깊이 있는 사용자화(Customization)를 지원합니다. 이는 주로 plugins.yaml 파일과 Python의 entry points 메커니즘을 통해 이루어집니다.
프롬프트 및 분석 규칙 사용자화 (plugins.yaml)
각 언어 플러그인(예: C/C++)은 plugins.yaml 파일을 참조하여 LLM이 코드를 분석하는 방식과 기준을 정의합니다. 사용자는 이 파일을 수정하여 AI의 페르소나나 검사 강도를 조절할 수 있습니다.
-
Prompt Templates (프롬프트 템플릿):
-
security_review: LLM이 코드나 변경 사항(Diff)에 대해 실제 보안 감사를 수행하도록 가이드하는 핵심 프롬프트입니다. -
validation_review: 생성된 리뷰 결과의 정확성과 품질을 AI가 다시 한번 평가(Self-Correction)하도록 요청합니다. -
security_review_checks: LLM이 탐색해야 할 구체적인 보안 이슈 리스트(Checklist)를 정의합니다. -
활용 팁: 이 템플릿을 수정하여 더 엄격한 감사 기준을 적용하거나, 개인정보 보호(Privacy) 및 특정 컴플라이언스(Compliance)에 특화된 리뷰를 수행하도록 설정할 수 있습니다.
-
Code Splitting Parameters (청킹 파라미터):
RAG의 성능을 좌우하는 문서 및 소스 코드의 분할(Chunking) 방식을 제어합니다.
-
chunk_lines: 하나의 청크(Chunk)에 포함될 줄(Line) 수 -
chunk_lines_overlap: 청크 간의 중복 허용 줄 수 (문맥 단절 방지) -
max_chars: 청크당 최대 문자 수
플러그인 아키텍처 및 커스텀 언어 지원
Metis는 Setuptools entry points 방식을 사용하여 언어 플러그인을 자동으로 탐지합니다. 이를 통해 공식 지원 언어 외에도 사내에서 사용하는 전용 언어나 프레임워크를 위한 플러그인을 개발하여 연동할 수 있습니다. 이러한 플러그인 개발을 위해서는 다음과 같은 단계를 수행하면 됩니다:
-
패키지 메타데이터에
metis.plugins그룹을 선언합니다. -
각 엔트리포인트는
metis.plugins.base.BaseLanguagePlugin을 구현한 클래스를 가리켜야 합니다. -
생성자에서
plugin_config를 인자로 받아 설정을 처리할 수 있습니다.
이렇게 작성한 플러그인(3rd party plugin)은 다음과 같이 pyproject.toml에 추가하여 사용할 수 있습니다:
[project.entry-points."metis.plugins"]
my_lang = "my_pkg.my_module:MyLanguagePlugin"
라이선스
Metis 프로젝트는 Apache-2.0 License로 공개 및 배포되고 있습니다.
ARM 커뮤니티 블로그의 Metis 소개 글
Metis 프로젝트 GitHub 저장소
이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. ![]()
파이토치 한국 사용자 모임
이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일
로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)
아래
쪽에 좋아요
를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ ![]()

