프롬프트 인젝션으로 비공개 코드 유출… 깃랩 듀오로 본 AI 도구의 위험
컨텐츠 정보
- 조회 843
본문
깃랩(GitLab)의 AI 기반 코드 어시스턴트 ‘듀오(Duo)’가 프롬프트 인젝션(Prompt Injection) 공격에 취약하다는 사실이 확인됐다. 애플리케이션 보안 업체 리짓 시큐리티(Legit Security)의 연구팀은 코드 주석, 커밋 메시지, 머지 리퀘스트(Merge Request) 설명에 은밀하게 삽입한 명령어를 통해 듀오가 악성 콘텐츠를 표시하거나 비공개 소스코드를 유출하도록 유도할 수 있음을 입증했다.
연구팀에 따르면, 깃랩의 코드 어시스턴트 듀오는 공개 리포지토리의 주석, 소스코드, 머지 리퀘스트 설명, 커밋 메시지 등에 숨겨진 악성 AI 프롬프트를 그대로 파싱할 수 있는 것으로 나타났다. 이 같은 기법을 활용하면 챗봇이 사용자에게 악성 코드를 제안하게 하거나 악성 링크를 전달하고, 응답 내에 비공개 프로젝트의 코드를 은밀히 유출하는 HTML 코드를 삽입하도록 유도할 수 있다.
연구팀은 보고서를 통해 “다행히 깃랩은 HTML 인젝션 취약점을 패치했지만, 더 중요한 교훈이 있다. AI 도구는 이제 애플리케이션의 공격 표면의 일부라는 점이다. AI가 페이지의 내용을 읽을 수 있다면, 그 입력값은 여타 사용자 제공 데이터와 마찬가지로 신뢰할 수 없고 지저분하며, 잠재적으로 위험한 데이터로 간주해야 한다”라고 말했다.
프롬프트 인젝션은 LLM(Large Language Model)의 출력을 조작해 사용자에게 잘못된 응답을 유도하는 공격 기법이다. 새로운 공격 방식은 아니지만, 현재 많은 기업이 사용자 생성 데이터를 분석하고 해당 콘텐츠에 기반해 독립적으로 행동하는 AI 에이전트 개발에 집중하고 있는 만큼 앞으로 중요성이 더욱 커질 것으로 보인다.
보조 도구가 위협이 되다
깃랩의 듀오는 인기 있는 깃랩 데브옵스(DevOps) 플랫폼에 탑재된 AI 기반 개발 생애주기 보조 도구다. 코드 제안, 문제 해결, 취약점 설명, 보완 방안 제시 등을 챗봇 인터페이스를 통해 지원한다. 듀오는 기본적으로 깃랩 프로젝트의 콘텐츠를 분석하는 방식으로 작동한다. 여기에는 소스코드뿐 아니라 주석, 설명, 공개된 이슈, 머지 리퀘스트(코드 기여 내역) 등 다양한 항목이 포함된다.
리짓 시큐리티 연구팀은 외부 기여자가 제어할 수 있는 프로젝트의 다양한 영역에 지시문을 삽입하면, 이를 깃랩 듀오가 시스템 프롬프트로 인식해 분석 중 실행할 수 있는지 실험했고, 실험은 성공했다.
연구팀은 보고서에서 “듀오는 주석, 설명, 소스코드를 포함해 페이지 전체 맥락을 분석한다. 이로 인해 맥락 어딘가에 삽입된 숨겨진 지시문에 취약해질 수 있다”라고 설명했다.
실험에 앞서 연구팀은 삽입한 프롬프트가 눈에 띄지 않도록 숨기는 방법부터 살폈다. 이 과정에서 여러 우회 기법을 사용할 수 있다는 점을 확인했다. 여기에는 유니코드 스머글링(Unicode smuggling), 베이스16(base16)으로 인코딩된 페이로드, 그리고 KaTeX 수식 렌더링 엔진을 활용해 흰 배경에 흰 글씨로 프롬프트를 삽입하는 방식 등이 포함됐다.
연구팀은 실험을 통해 머지 리퀘스트 설명에 숨겨진 프롬프트를 활용해 깃랩 듀오가 코드 리뷰 과정에서 사용자에게 악성 자바스크립트 패키지를 포함한 코드 변경 사항을 제안하도록 유도하는 데 성공했다.
또 다른 개념증명 공격 사례에서는 듀오가 응답에 특정 웹 링크를 삽입하도록 강제하는 프롬프트를 사용했다. 해당 링크는 연구팀이 제어하는 가짜 로그인 페이지로 연결되도록 설계됐다. 또한 듀오는 프로젝트 소유자가 제3자의 코드 기여(머지 리퀘스트)를 검토할 때 보조하는 역할도 수행하는데, 이 과정에서 숨겨진 프롬프트가 듀오로 하여금 악성 머지 요청을 무비판적으로 수용하게 만들고, 리뷰어에게 정상적인 제출인 것처럼 오도하게 만들 수 있음을 확인했다.
HTML 인젝션으로 이어진 프롬프트 인젝션
듀오는 HTML 기반 챗봇 인터페이스를 통해 사용자에게 응답을 전달할 때 마크다운 언어를 사용해 텍스트를 포맷한다. 연구팀은 듀오의 응답이 백엔드 LLM에서 실시간으로 전송될 때 화면에 점진적으로 렌더링되는 방식에 주목하고 “프롬프트에 HTML 태그를 삽입하면 브라우저가 이를 실제 HTML로 해석하고 실행하지 않을까”라는 가설을 세웠다.
연구팀은 “이 시점에서 악성 마크다운 URL을 만들어 사용자에게 노출시킬 수 있다는 사실을 확인했다. 그래서 다시 생각했다. URL 라벨 자체에 로우(raw) HTML이 들어가 있으면 어떨까? 듀오가 응답을 실시간으로 렌더링한다면 콘텐츠가 정제(Sanitization)되기 전에 브라우저가 해당 HTML을 실행할 수 있을 거라고 봤다”라고 설명했다.
이어진 테스트에서는 AI 어시스턴트에게 특정 URL을 삽입하라는 프롬프트를 제공했다. 해당 URL은 HTML 태그를 여는 형태였다. HTML의 태그는 외부 서버에서 이미지를 불러올 수 있을 뿐 아니라, 조건에 따라 자바스크립트 코드 실행을 유도할 수 있다. 이나 태그도 마찬가지다.
사용자 브라우저에서 임의의 HTML을 실행할 수 있다는 점이 확인되자, 연구팀은 또 다른 가능성에 주목했다. 대부분의 깃랩 사용자가 비공개 프로젝트에 접근 권한을 갖고 있다는 점을 고려했을 때 공격자가 해당 프로젝트의 정확한 URL만 알아낼 수 있다면 사용자의 권한을 우회적으로 악용해 코드에 접근하고 이를 인코딩해 자신이 제어하는 서버로 전송함으로써 민감한 소스코드를 유출하는 시나리오가 성립된다. 만약 공격자가 API 토큰이나 로그인 인증 정보 등의 시크릿이 포함된 파일의 위치까지 파악할 경우, 해당 정보까지 함께 외부로 유출될 수 있다.
연구팀은 보고서에서 “이번 보안 취약점은 깃랩 듀오와 같은 AI 어시스턴트가 페이지 내 콘텐츠를 맹목적으로 신뢰할 경우 얼마나 강력하면서도 위험해질 수 있는지를 보여준다. 숨겨진 프롬프트와 로우 HTML을 몰래 삽입하는 방식만으로 사용자가 아무것도 클릭하지 않아도 비공개 소스코드를 유출시킬 수 있었다”라고 설명했다.
깃랩은 HTML 인젝션 문제에 대해 듀오가 나 처럼 gitlab.com 이외의 외부 도메인을 참조하는 위험한 태그를 렌더링하지 않도록 차단하는 방식으로 패치를 적용했다. 그러나 HTML 렌더링과 관련되지 않은 다른 프롬프트 인젝션 시나리오는 여전히 수정되지 않은 상태다. 깃랩은 이런 사례가 직접적인 무단 접근이나 코드 실행으로 이어지지 않기 때문에 보안 이슈로 간주하지 않고 있다.
dl-itworldkorea@foundryco.com
관련자료
-
링크
-
이전
-
다음






