본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 25. 04:28

MCP 서버 설치가 불안해서 스캐너를 직접 만들었습니다

요약

신뢰할 수 없는 MCP 서버 설치 시 발생할 수 있는 보안 위협을 방지하기 위해 정적 스캐너인 'frisk'를 개발했습니다. 이 도구는 코드를 실행하지 않고 패턴 매칭을 통해 OWASP LLM Top 10 기반의 보안 취약점을 로컬에서 탐지합니다.

핵심 포인트

  • 정적 분석 방식을 사용하여 코드 실행 없이 안전하게 스캔 가능
  • 외부 API 전송 없이 100% 로컬에서 동작하여 데이터 유출 방지
  • 제로 너비 유니코드와 같은 숨겨진 악성 지침 탐지
  • SARIF 형식 지원으로 GitHub Security 탭과 연동 가능

며칠마다 한 번씩 시도해 볼 만한 새로운 MCP 서버나 Claude Code 스킬이 등장합니다. 그리고 거의 모든 서버를 설치하는 방식은 동일합니다. README에서 명령어를 복사하여 터미널에 붙여넣으면 끝입니다.

저는 이 작업을 아마 스무 번 정도 반복했을 것입니다. 그러다 문득 깨달았습니다. 제가 SSH 키와 클라우드 자격 증명(credentials)을 보관하는 머신에서, 단 한 줄의 코드도 읽어보지 않은 채 낯선 사람의 코드를 실행하고 있었다는 사실을 말이죠.

그래서 코드가 실행되기 전에 이를 점검할 수 있는 작은 도구를 만들었습니다. 이름은 frisk입니다.

실제로 무엇을 탐색하는가

frisk는 정적 스캐너(static scanner)입니다. 분석 대상인 코드를 절대 실행하지 않습니다. 파일을 읽고 패턴을 매칭하는 방식이므로, 아직 신뢰할 수 없는 대상을 가리키기에 안전합니다. 순수 Python으로 작성되었으며, 외부 의존성 없이 표준 라이브러리(stdlib)만 사용합니다.

frisk lock .
# ...일주일 후, 또는 스케줄에 따라...
frisk verify   # 무언가 변동(drift)이 생기면 강력하게 경고를 보냅니다

그리고 정말 고약한 것들도 있습니다. 제로 너비 유니코드(zero-width unicode)로 숨겨진 지침들이 있어, 겉보기에는 비어 있는 것처럼 보이는 설명이 실제로는 그렇지 않은 경우입니다. frisk는 이러한 것들도 잡아냅니다.

아무 곳에도 데이터를 보내지 않는 이유

이 분야에는 이미 도구(Snyk의 일부가 된 mcp-scan)가 존재합니다. 훌륭한 도구입니다. 하지만 해당 도구는 분석을 위해 도구 설명을 호스팅된 API로 전송합니다. 제가 신뢰하지 않는 코드를 내 로컬 머신에서 실행하는 상황에서, 루프(loop) 내에 네트워크 왕복(network round-trip)이 발생하는 것을 원치 않았습니다. frisk는 완전히 로컬에서 실행되며 그 누구에게도 정보를 보고하지 않습니다. 이것은 의도적으로 설정한 경계선이었으며, 기존의 것을 사용하는 대신 직접 만드는 수고를 들인 주요 이유입니다.

사용법

pip install frisk-scan

frisk ./some-skill                                    # 폴더 스캔
...

사용자는 PASS / WARN / BLOCK 판정을 받게 됩니다. 탐지 결과는 OWASP LLM Top 10에 매핑되며, SARIF 형식을 출력할 수 있어 GitHub의 Security 탭에 나타나게 할 수 있습니다. 또한 MCP 서버로도 실행될 수 있는데, 이는 에이전트가 도구를 추가하기 전에 해당 도구를 검토하도록 할 수 있음을 의미합니다. 이는 약간 황당하게 느껴지면서도 동시에 매우 적절한 방식처럼 느껴집니다.

솔직한 주의사항

이 도구는 정적(static)이며 정규 표현식(regex) 기반입니다. 바로 그 점 덕분에 빠르고, 의존성이 없으며, 적대적인 입력(hostile input)에 대해서도 안전하게 실행할 수 있습니다. 하지만 이는 또한 결연한 공격자가 이를 회피할 수 있음을 의미하며, 원격 서버가 런타임(runtime)에 무엇을 하는지는 볼 수 없음을 의미합니다. PASS 판정은 "인증된 안전"이 아니라 "명백하게 나쁜 것은 없음"으로 간주하십시오. 이것은 최전방의 방어선이자 분류(triage) 단계이지, 전체 정답은 아닙니다.

저는 오탐(false alarm)을 방지하기 위해 공식 MCP 서버들을 기준으로 규칙을 조정했습니다. 환경 변수에서 API 키를 읽는 것은 정상적인 동작이며 차단해서는 안 됩니다. 하지만 개인 키(private key)를 읽어서 어딘가로 전송하는 것은 차단해야 합니다.

이 프로젝트는 MIT 라이선스이며, 코드는 GitHub에 공개되어 있습니다. 놓치는 부분과 오탐(false-flag)하는 부분 모두에 대해 진심으로 의견을 듣고 싶습니다. 그러한 피드백을 통해 규칙 세트(ruleset)가 개선됩니다.

pip install frisk-scanhttps://github.com/Thandv/frisk

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0