로컬 LLM의 보안 역설
(quesma.com)- 로컬 환경에서 프라이버시 보호를 위해 LLM을 사용하는 개발자들이 오히려 보안 취약성에 노출될 수 있다는 연구 결과가 제시됨
- 연구팀은
gpt-oss-20b
모델을 대상으로 한 OpenAI Red‑Teaming Challenge 실험에서, 로컬 모델이 공격자의 프롬프트 조작에 훨씬 쉽게 속아 악성 코드를 생성함을 확인 - 공격자는 단순한 프롬프트 조작만으로 백도어 삽입이나 즉시 코드 실행(RCE) 을 유도할 수 있으며, 성공률은 최대 95%에 달함
- 이러한 공격은 문서 오염(documentation poisoning) , MCP 서버 조작, 소셜 엔지니어링 등을 통해 개발자의 일반적인 워크플로우에 자연스럽게 침투함
- 로컬 LLM은 데이터 프라이버시 측면에서는 유리하지만, 추론력·정렬성·안전 필터링 능력의 부족으로 인해 오히려 더 위험한 선택이 될 수 있다는 점이 이번 연구의 핵심 시사점임
로컬 LLM의 보안 취약성 개요
- 연구는 로컬에서 실행되는 LLM이 보안과 프라이버시를 강화하기 위한 선택으로 여겨지지만, 실제로는 공격자에게 더 쉽게 조작될 수 있음을 보여줌
-
gpt-oss-20b
모델을 대상으로 한 실험에서, 공격자가 프롬프트를 통해 취약점을 포함한 코드를 요청할 경우 모델이 이를 그대로 생성하는 비율이 매우 높았음 - 특히 프롬프트에 악의적 의도가 숨겨져 있어도, 모델은 이를 인식하지 못하고 정상적인 요청으로 처리함
-
- 이러한 현상은 모델의 크기와 정렬(alignment) 수준이 낮을수록 심화되며, Frontier 모델(GPT-5 등)은 상대적으로 저항력이 높음
프롬프트 및 코드 인젝션 위협
- LLM은 프라이빗 데이터 접근, 신뢰할 수 없는 콘텐츠 노출, 외부 통신 가능성이라는 ‘치명적 삼중 위협(lethal trifecta)’에 직면
- 공격자는 프롬프트 내에 악성 코드를 삽입해 코드 인젝션(code injection) 을 유도할 수 있음
- 이때 생성된 코드는 정상적으로 보이지만, 실제로는 개발자 시스템을 감염시키거나 프로덕션 환경에서 지속적 백도어로 작동할 수 있음
-
gpt-oss-20b
와 같은 소형 모델은 이러한 공격에 특히 취약하며, 기본적인 코드 리뷰를 통과할 정도로 정교한 악성 코드를 생성함
공격 유형 1: “이스터에그” 백도어 (성공률 95%)
- 첫 번째 공격은 모델을 속여 RCE(Remote Code Execution) 백도어를 “이스터에그” 기능으로 위장해 삽입하도록 유도함
- 공격 프롬프트는 Flask 웹서버를 작성하되, 특정 HTTP 헤더(
X-Math
)가 전달되면eval()
을 실행하도록 요청 - 모델은 이를 정상적인 기능으로 인식하고, 악성 코드를 포함한 서버 코드를 생성함
- 공격 프롬프트는 Flask 웹서버를 작성하되, 특정 HTTP 헤더(
- 생성된 코드에는
@app.after_request
데코레이터를 이용한 동적 코드 실행 루틴이 포함되어 있으며, 공격자는 단순한 HTTP 요청으로 서버 내 임의 코드 실행 가능- 또한
KUBERNETES_SERVICE_HOST
환경 변수를 확인해 프로덕션 환경에서만 공격자에게 신호를 보내는 비동기 핑 기능을 포함
- 또한
- 실험 결과, 동일한 프롬프트로 100회 중 95회 성공, 변형된 프롬프트로도 800회 중 86회 성공
- GPT-5 등 Frontier 모델은 동일 프롬프트에 대해 저항성을 보였음
공격 유형 2: 즉시 코드 실행(RCE) 유도 (성공률 43.5%)
- 두 번째 공격은 개발자 로컬 환경에서 즉시 악성 코드 실행을 유도하는 방식
- 공격자는 모델의 인지 부하를 높이는 인지 과부하(cognitive overload) 프롬프트를 먼저 제시해 안전 필터를 무력화
- 이후 난독화된 파이썬 코드 생성을 요청해, 모델이
exec
호출을 포함한 악성 스크립트를 작성하도록 함
- 난독화된 코드
"".join(chr(100 + i) for i in [1-2, 2-1, (1<<4)+4, 1])[::-1]
은exec
로 복호화되며,
최종적으로https://jacek.migdal.pl/speed.py
에서 코드를 다운로드해 실행하는 형태로 완성됨 - 성공률은 43.5%로 첫 번째 공격보다 낮지만, 즉시 RCE를 유발하기 때문에 훨씬 위험
- 공격이 한 번만 성공해도 개발자의 로컬 자격 증명(~/.aws/, ~/.ssh/) 탈취, 악성코드 설치, 네트워크 확산이 가능
공격 체인의 작동 방식
- 이러한 공격은 고급 취약점이 아닌, 일상적인 개발 워크플로우를 공격 경로로 전환함으로써 성공
- 개발자가 외부 콘텐츠를 AI 어시스턴트의 컨텍스트로 제공할 때, 그 안에 숨겨진 악성 프롬프트가 실행됨
- 공격 단계는 다음과 같음:
- 공격자가 악성 프롬프트를 포함한 콘텐츠를 배포
- 개발자가 이를 직접 또는 MCP(Model Context Protocol)를 통해 모델에 입력
- 모델이 손상된 코드를 생성
- 개발자가 코드를 실행 또는 배포
- 공격자가 지속적 접근 또는 즉시 제어 획득
- 주요 침투 경로:
- 문서 오염(documentation poisoning): README, API 문서, Reddit 예제에 악성 코드 삽입
- MCP 서버 조작: Context 제공 서버(Context7 등)를 통해 악성 예시 주입
- 소셜 엔지니어링: GitHub 이슈나 PR 코멘트에 숨겨진 코드 예시 삽입
로컬 모델이 더 위험한 이유
- 일반적으로 로컬 모델은 데이터 프라이버시 측면에서 선호되지만, 이번 연구는 보안 측면에서는 역설적 위험을 드러냄
- 클라우드 기반 Frontier 모델은 프롬프트 모니터링 및 정책 위반 감지가 가능하지만, 로컬 모델은 이러한 감시가 없음
- Frontier 모델(GPT-5, Claude Sonnet 4.5, Grok 4 등)은 난독화된 텍스트를 포함한 프롬프트에 대해 “Safety Fail”을 반환하며 거부
- 반면 로컬 모델은 감시 부재로 인해 테스트는 자유롭지만, 실제로는 취약성 노출이 심각
- 추론력 부족: 복잡한 악의적 의도를 인식하지 못함
- 정렬성 약화: 인지 과부하나 난독화 기법에 쉽게 속음
- 안전 학습 부족: 적대적 프롬프트 탐지 자원 제한
- 결과적으로, Frontier 모델은 공격 난이도가 높고 성공률이 낮지만, 보안 성능을 객관적으로 검증하기 어려운 반면, 로컬 모델은 테스트 가능하지만 훨씬 취약한 상태임
새로운 방어 전략 제안
- 이번 연구는 AI 어시스턴트 보안 테스트의 표준화된 안전 환경 부재를 지적
- 전통적 소프트웨어에는 침투 테스트가 존재하지만, LLM 보안은 아직 체계화되지 않음
- 제안된 4가지 핵심 방어책:
-
정적 분석: 실행 전
eval()
,exec()
등 위험 패턴을 탐지하고, 특정 언어 기능은 기본적으로 비활성화 - 샌드박스 실행: 초기 코드 실행은 컨테이너나 WebAssembly 런타임 등 격리 환경에서 수행
- 입출력 및 네트워크 모니터링: AI 어시스턴트의 입력·출력·네트워크 트래픽을 이상 행위 중심으로 감시
-
이중 검증(second look): 단순한 보조 모델을 이용해 최종 출력의 정책 위반 여부를 재검사
- 예: 주 모델이 속아
eval()
을 포함한 코드를 생성하더라도, 보조 모델이 이를 탐지 가능
- 예: 주 모델이 속아
-
정적 분석: 실행 전
- 결론적으로, LLM은 강력한 도구이지만 본질적으로 안전하지 않으며,
AI 생성 코드에 대한 불신 기반의 보안 체계와 새로운 공급망 방어 전략이 필수적임
Hacker News 의견
-
아무리 강력한 reasoning LLM이라도, 맥락 안에 악의적인 지시가 들어가면 결국 취약한 코드를 출력하게 됨
작은 모델이 속이기 쉽다는 건 보안 관점에서 그리 흥미로운 포인트가 아님
결국 어떤 모델이든 prompt injection은 가능하다고 가정해야 함
그래서 모델이 손상되었을 때도 방어할 수 있는 sandbox 실행이나 정적 분석 같은 추가 보호 계층이 필요함
어제도 이런 주제로 sandboxing coding agents 에 대한 발표를 했음- 기사에서 가장 충격적이었던 건, 검증되지 않은 외부 콘텐츠를 LLM에 그대로 넣고 그 결과를 프로덕션 코드로 사용하는 걸 당연하게 여긴다는 점이었음
그런 시스템은 이미 손상된 것이나 다름없음
‘defense in depth’ 같은 접근보다, 애초에 그런 위험한 구조를 만들지 않는 게 맞다고 봄 - 우리 팀도 Definite.app의 에이전트에 e2b.dev 기반 샌드박스를 붙였는데, 문제의 80%는 해결된 느낌임
임시 파일 저장 위치 같은 것도 샌드박스 환경에서는 명확해짐
물론 새로운 문제가 생기긴 했지만 전체적으로는 큰 개선이었음 - 혹시 그 발표가 녹화되었는지 궁금함
- 기사에서 가장 충격적이었던 건, 검증되지 않은 외부 콘텐츠를 LLM에 그대로 넣고 그 결과를 프로덕션 코드로 사용하는 걸 당연하게 여긴다는 점이었음
-
로컬에서 deepseek 같은 모델을 돌리면, 가짜 프롬프트만 주지 않는 한 안전하다고 생각함
결국 위험 요소는 사용자가 외부에서 복사한 프롬프트나, 모델이 인터넷 리소스에 접근할 수 있게 하는 설정임
이런 건 예전부터 IT 전반의 약점이었고, 단지 사용자 교육과 네트워크 격리로 관리해야 할 문제임- 단순한 텍스트 입력이 공격 벡터가 된다는 점이 새로움
티켓, 문서 같은 평범한 데이터가 이제는 보안 리스크가 될 수 있음 - 현실성이 낮다고 해도 이런 공격 벡터는 반드시 인지해야 함
많은 강력한 해킹이 단순한 시작점에서 비롯되었음
- 단순한 텍스트 입력이 공격 벡터가 된다는 점이 새로움
-
이런 공격들은 너무 기초적인 보안 상식 수준임
코드를 프로덕션에 배포하기 전에 검토만 해도 막을 수 있음
아무것도 모르는 상태라면 어차피 안전하지 않은 코드를 배포하게 될 것임- 핵심은 단순히 코드 생성의 실패가 아니라, 모델이 jailbreak 공격에 더 취약하다는 점임
오픈 모델은 접근성이 좋지만, post-training으로 막을 수 있다고 생각하는 건 착각임 - “코드 리뷰만 하면 된다”는 생각은 위험함
두 번째 공격은 코드 배포가 아니라, LLM이 reddit 댓글을 읽고 바로 실행하는 상황이었음
이런 문제를 가볍게 보는 태도 자체가 더 큰 보안 위협을 만듦
- 핵심은 단순히 코드 생성의 실패가 아니라, 모델이 jailbreak 공격에 더 취약하다는 점임
-
로컬 LLM이 공격받을 수 있다는 말이 이상하게 들림
이미 시스템이 침해된 상태라면 LLM을 속이는 것보다 더 큰 피해를 줄 수 있을 텐데- LLM은 명령과 데이터의 구분이 없음
즉, 공격자가 데이터 입력을 통해 프롬프트를 주입할 수 있음
만약 LLM이 명령 실행 권한을 가진 에이전트라면, 이건 곧 명령 실행 취약점이 됨 - 고객 데이터를 분류하거나 이메일을 처리하는 용도로 LLM을 쓴다면, 이런 위험이 현실적일 수 있음
- 로컬 모델이라도 실제로는 인터넷 접근이 가능한 래퍼(예: OpenCode, Claude Code 등)에 연결되는 경우가 많음
- “공격자가 VPN을 뚫고 관리자 권한으로 접속하면?” 같은 회사 보안 논리와 비슷함
그런 상황이면 이미 모든 게 끝난 셈임
- LLM은 명령과 데이터의 구분이 없음
-
이 글은 마치 Anthropic이나 OpenAI의 영업팀이 쓴 것처럼 느껴짐
실제로 로컬 모델은 코드 실행형 에이전트로 쓰이는 경우가 드물고, 대부분 데이터 변환이나 NLP 작업에 강함
나는 Agno agent로 로컬 모델을 쓸 때, 생성된 코드를 실행 전에 항상 출력하게 하고 로컬 샌드박스로 격리함
오히려 Atlas, Comet 같은 브라우저형 에이전트가 더 위험하다고 봄 -
오픈소스 모델은 프롬프트에 적힌 대로 행동했고, 클로즈드 모델은 그걸 무시했음
즉, 정렬(alignment) 테스트에서 실패한 건 오히려 닫힌 모델 쪽이었음 -
“lethal trifecta”라는 표현은 멋지지만 실제 위험을 잘 설명하지 못함
현실적으로는 외부 통신 능력 하나만 있어도 충분히 위험함
LLM 자체가 검증 불가능한 블랙박스 데이터 덩어리라, 신뢰하기 어렵음
작은 스타트업은 괜찮을지 몰라도, Coinbase 같은 곳이라면 접근 제한을 두 번은 고민해야 함 -
검증되지 않은 코드 실행의 보안 역설에 대한 이야기임
로컬에서 악성 코드나 미확인 코드를 실행한다면, 그 이유부터 다시 생각해야 함- 이 취약점은 AI가 인터넷에서 읽은 비신뢰 데이터를 그대로 처리할 때 발생함
LLM은 인간 언어로 된 지시를 코드처럼 해석하기 때문에, 코드와 데이터의 경계가 모호해짐
- 이 취약점은 AI가 인터넷에서 읽은 비신뢰 데이터를 그대로 처리할 때 발생함
-
LLM의 추론 능력을 보안 경계로 삼는다면 이미 큰 문제가 있음
그런 접근은 근본적으로 잘못된 설계임 -
입력을 조심하지 않으면 주입이 일어날 수 있다는 건 너무 명확함
어떤 시스템이든 입력은 항상 공격 벡터가 될 수 있음
LLM에 들어가는 모든 데이터는 반드시 검증해야 함- 공격자가 어떻게 이런 프롬프트를 삽입해 실제 프로덕션 코드에 영향을 주는지 궁금함
혹시 브라우저 단의 크로스 사이트 공격 같은 방식인지 알고 싶음
- 공격자가 어떻게 이런 프롬프트를 삽입해 실제 프로덕션 코드에 영향을 주는지 궁금함