AI VIDEO BRIEFING
프롬프트 재킹 정리: AI 코딩 에이전트가 SSH 키를 유출하는 경로와 방어 설계
보안 업체 히든레이어 연구진이 NDC 토론토 발표에서 AI 코딩 에이전트의 취약점을 차례로 시연했다. 렌더링되지 않는 주석 한 줄이 SSH 키를 빼냈고, 이슈 본문 하나가 비공개 저장소 전체를 열었으며, 방어용 가드레일까지 우회됐다. 원인은 제품 버그가 아니라 설계 방식이었다.

핵심 메시지
쉽게 이해하기
보안 업체 히든레이어의 보안 연구 책임자 카시미르 슐츠와 AI 보안 연구자 케네스 영이 NDC 토론토에서 진행한 발표는, AI 코딩 에이전트를 공격자의 눈으로 다시 보는 자리였다. 두 사람은 발표 내내 취약점의 원인이 특정 제품의 버그가 아니라 에이전트를 설계하는 방식 자체에 있다고 강조했다. 모델 제공사는 지시 계층을 지키도록 모델을 학습시키는데, 정작 에이전트를 만드는 쪽이 그 계층을 스스로 허무는 구조를 짜고 있다는 것이다.
첫 시연은 평범한 깃허브 저장소에서 시작한다. README 맨 아래에 주석으로 감싼 지시문을 넣어 두면 사람은 렌더링된 화면만 보기 때문에 아무것도 눈치채지 못하지만, 모델은 렌더링 이전의 원본 텍스트를 읽는다. 발표자들은 이 문구로 에이전트에게 키를 검색하게 하고, 목록 확인 명령을 실행한 뒤 그 결과를 외부로 전송하도록 유도해 SSH 키를 빼냈다. 사용자는 도구를 허용 목록으로 잠가 두었지만, 당시 커서가 세미콜론으로 연결한 명령만 검사하고 달러 기호와 괄호를 쓴 명령 삽입은 걸러내지 못했다는 취약점이 있었다. 이 문제는 제보 후 수정됐고, 발표자들은 패치 이후 약 두 시간 만에 같은 결과를 내는 다른 취약점을 또 찾았다고 밝혔다. 공격 경로는 코드 저장소 밖으로도 뻗는다. 사람이 브라우저로 볼 때는 정상적인 글을 보여 주고, 요청 헤더의 사용자 에이전트가 모델 쪽이면 주입 문구를 돌려주는 서버를 만들면, 사람은 악성 콘텐츠를 한 번도 보지 못한 채 모델만 감염된다. 웹 검색 권한도 허점이 있었는데, 승인은 보통 페이지 단위가 아니라 사이트 단위로 남기 때문에 한 번 허용한 도메인의 다른 페이지는 그대로 통과한다. 다이어그램을 그리는 도구가 이미지와 링크를 렌더링하는 과정도 문제였다. 예전에는 이미지 주소에 담기는 값이 고정된 문자열이라 위험하지 않았지만, 모델이 그 값을 SSH 키나 API 키로 바꿔 넣을 수 있게 되면서 오래된 웹 프레임워크의 방어책이 더 이상 통하지 않게 됐다.
발표의 중반부는 시스템 프롬프트의 구조를 파고든다. 모델은 시스템·사용자·도구 응답을 구분하는 제어 토큰으로 지시 계층을 지키지만, 개발자가 직접 정의한 태그는 모델에게 특별한 토큰이 아니라 그냥 글자다. 그래서 도구 응답 안에 시스템 프롬프트가 쓰는 것과 똑같은 태그를 넣으면 모델은 그것을 사용자의 새 지시로 받아들인다. 태그가 아예 없는 시스템도 안전하지 않았다. 깃랩 이슈를 자동으로 분류하는 에이전트는 이슈 정보를 JSON 덩어리로 프롬프트에 붙였는데, 본문에 JSON이 끝났다는 표시를 넣고 새 지시를 이어 붙이자 해당 계정의 비공개 저장소와 파일이 모두 노출됐다. 오픈 웹 UI에서는 시스템·사용자·어시스턴트 구획이 한 덩어리로 합쳐져 전달되는 점을 이용해 지시를 덧붙일 수 있었고, 인터넷에 노출된 인스턴스는 약 1만 8천 개에 달했다.
최근 확산 중인 MCP와 스킬도 같은 문제를 물려받았다. MCP는 도구 소유권을 규정하지 않기 때문에, 인기 있는 원격 서버가 널리 쓰이는 도구와 같은 이름을 뒤늦게 내걸면 요청이 그쪽으로 흘러간다. 스킬은 더 직접적이다. 이름과 설명이 시스템 프롬프트에 자동으로 삽입되므로, 여기에 악성 지시를 넣으면 주입이라고 부를 것도 없이 처음부터 최상위 권한의 명령이 된다. 발표자들은 스킬을 검토할 때 대부분 파이썬 스크립트와 실행 파일만 들여다보지만 가장 위험한 부분은 이름과 설명이라고 지적하며, 스킬이 도구 대신 명령줄을 그대로 쓰기 때문에 감사 자체가 어려워진다고 덧붙였다.
그렇다면 무엇을 할 수 있는가. 두 사람은 가드레일을 계속 쓰라고 권하면서도 그 한계를 함께 보여 줬다. 판정용 모델을 두는 방식은 이해도가 높지만 느리고 비싸며, 분류 모델은 30밀리초 수준으로 빠른 대신 이해가 얕다. 실제로 오픈AI 에이전트 킷의 판정 구조에는 위험도 임계값을 재정의하는 문구를 넣어 유해한 프롬프트를 통과시켰고, 분류 모델에는 단어 앞에 글자 하나를 덧붙여 토큰 분해를 어긋나게 만드는 방법이 통했다. 대신 시스템 프롬프트를 촘촘하게 강화하는 방식은 효과가 컸는데, 데프콘에서 약 500명의 참가자가 강화된 시스템 프롬프트와 가드레일을 함께 적용한 시스템을 공격했을 때 뚫은 팀은 한 곳뿐이었고 그마저 설정 실수 때문이었다고 한다. 길어진 프롬프트의 비용 문제는 값이 바뀌지 않는 구조로 설계해 캐싱을 활용하면 크게 줄일 수 있다는 조언도 함께 나왔다.
주요 인사이트
- 이 발표가 겨냥하는 것은 개별 제품의 결함이 아니라 데이터 평면과 제어 평면이 분리되지 않은 설계다. 프롬프트 하나에 지시와 처리 대상 데이터를 함께 담는 한, 형식이 마크다운이든 XML이든 JSON이든 탈출 경로는 남는다.
- 허용 목록과 권한 승인은 사람의 직관대로 동작하지 않는다. 명령 문자열의 파싱 방식, 사이트 단위로 남는 승인 범위처럼 경계가 실제로 어디에 그어지는지를 확인하지 않으면 승인 절차가 안전하다는 착각만 남는다.
- 감사의 초점도 옮겨야 한다. 스킬의 이름과 설명, 도구 이름과 설명처럼 시스템 프롬프트로 곧장 올라가는 짧은 텍스트가 실행 코드보다 위험할 수 있다는 것이 발표의 핵심 경고다.
- 가드레일은 방어의 마지막이 아니라 또 하나의 공격 표면이다. 검사기를 속이는 문구와 토큰화의 빈틈이 존재하는 이상, 아키텍처 자체를 고쳐 주입이 필요 없는 경로를 없애는 편이 더 확실하다.
- 비용을 이유로 시스템 프롬프트를 짧게 유지하는 관행은 재검토할 만하다. 값이 삽입되지 않아 내용이 고정된 프롬프트는 캐싱이 잘 들어, 길고 촘촘하게 쓰면서도 실제 비용은 낮출 수 있다.
자주 묻는 질문
간접 프롬프트 인젝션은 일반적인 프롬프트 인젝션과 무엇이 다른가?
직접 주입은 사용자가 모델에 직접 지시를 넣어 정해진 규칙을 벗어나게 만드는 방식이다. 간접 주입은 그 지시를 README, 웹페이지, PDF, 이력서처럼 모델이 나중에 읽게 될 자료 안에 숨겨 두는 방식이어서, 공격자가 사용자와 직접 대화하지 않아도 성립한다.
허용 목록으로 도구를 잠가 두면 안전한가?
발표에서는 안전하지 않다고 봤다. 허용된 명령 뒤에 다른 명령을 이어 붙이는 문법을 도구가 모두 검사하지 못하면 승인 없이 추가 명령이 실행되고, 웹 접근 권한도 페이지가 아니라 사이트 단위로 남아 한 번 허용한 도메인의 다른 경로가 그대로 열린다.
스킬을 내려받을 때 무엇을 먼저 확인해야 하나?
발표자들은 이름과 설명을 가장 먼저 보라고 권했다. 이 두 항목은 시스템 프롬프트에 자동으로 삽입되기 때문에, 여기에 들어간 지시는 별도의 주입 과정 없이 최상위 지시로 작동한다.
가드레일 모델을 쓰지 말라는 뜻인가?
아니다. 발표자들은 가드레일이 상당수 공격을 막아 주므로 계속 쓰라고 했다. 다만 아키텍처에 다른 결함이 남아 있으면 주입 자체가 필요 없어지므로, 가드레일과 함께 시스템 프롬프트 강화와 입력·지시 분리를 병행해야 한다고 강조했다.
원문과 출처
이 글은 원본 영상의 자막을 바탕으로 한국어 독자를 위해 요약했습니다. 전체 맥락과 최신 정보는 원문에서 확인하세요.
YouTube 원본 영상 보기 ↗