본문 바로가기

SWUFORCE 기술스터디 📝

[LY Corporation] AI 제품 개발 중 마주칠 수 있는 보안 위협 사례와 대책 방안

[원글]

[LY Corporation] AI 제품 개발 중 마주칠 수 있는 보안 위협 사례와 대책 방안

https://techblog.lycorp.co.jp/ko/risks-and-mitigations-in-ai-products-development

 


이번 글에서는 LY corportion의 Security R&D 팀이 AI 제품 개발 과정에서 과거에 실제로 발생했던 다섯가지 사례를 알아보겠다. 먼저 사례를 하나씩 살펴보며 각 사례에서 얻을 수 있는 인사이트를 정리하고, 각 사례에서 소개된 여러 가지 문제들을 안전하고 쉽게 해결할 수 있도록 Security R&D팀이 어떤 과제를 진행하고 있는지 공유한 것을 살펴보겠다.

 

 

1. 슬랍쿼스팅(slopsquatting)

 

개발이나 환경 설정과 관련해 궁금한 게 있을 때 검색 서비스를 많이 이용해 왔지만 요즘에는 생성형 AI를 많이 사용한다. 슬랍쿼스팅은 바로 이런 상황에서 발생할 수 있는 보안 문제다.

 

서비스를 구축하는 과정에서 모델을 올리는 것에 대해 질문 했을 때, 생성형 AI가 특정 패키지를 설치하라고 제안했지만 실제로 제안된 설치 명령을 실행해보면 해당 패키지는 없는 패키지라고 나오며 설치가 진행되지 않는 사례가 발생했다. 이와 같이 생성형 AI가 실제로는 없는 패키지를 제안하는 것은, 공격자의 입장에서 이 현상을 이용해 랜섬웨어가 정보 수집을 위한 악성코드를 배포할 수 있는 좋은 경로로 인식된다. 그 공격의 구체적인 방법은 아래와 같다.

 

  1. 공격자가 일반 사용자가 많이 질문할 법한 개발 또는 환경 설정과 관련된 질문을 준비한다.
  2. 준비한 여러 가지 질문을 AI에게 던져보면서 방금 살펴본 사례처럼 없는 패키지를 설치하라고 제안한 답변을 모은다.
  3. 제안된 각 패키지 이름으로 악성 코드가 포함된 패키지를 등록하고 기다린다.
  4. 사용자가 공격자가 준비한 질문과 비슷한 질문을 던진다.
  5. 사용자는 일정한 확률로 공격자가 받았던 실제로는 없는 패키지를 설치하라는 제안을 받는다.
  6. 사용자가 제안받은 패키지를 설치한다.
  7. 실행 여부와 관계없이 설치 스크립트 때문에 임의의 악성 코드가 실행된다.

이런 패키지 설치 시 발생할 수 있는 실수를 노리는 공격이 전세계적으로 증가함에 따라 보안 업체나 연구원들이 패키지 레지스트리에 동록되어 있는 패키지들을 지속적으로 다운 받아 분석해보고 있다. 

 

패키지 이름이 잘못 전달되는 상황을 이용한 공격도 일어나는데, 이 공격은 생성형 AI가 발전하기 전에도 있었다. 대표적으로 타이핑 실수를 노렸던 '타이포스쿼팅' 공격이 있는데, 주로 랜섬웨어 공격에서 사용됐다. 현재도 Pypi, npm같이 유명한 레지스트리에도 그럴 듯해 보이는 이름으로 악성 패키지가 활발히 배포되고 있다. 이런 사례들을 통해 AI가 제안하는 패키지나 코드가 항상 안전하지는 않다는 것을 알 수 있다. 

 

 

2. 프롬프트 인젝션 - Vanna.ai

 

두 번째로는 Vanna.ai라는 프레임워크에서 취약점이 발생했던 사례이다. 이 프레임워크는 사용자가 자연어로 질문을 하면 그 질문을 SQL 쿼리로 변환해 해당 쿼리의 실행 결과를 차트로 만들어 주는 기능이 있다.

 

그런데 plotly 차트를 생성하는 부분에 취약점이 있었다. (*plotly 차트 : 인터랙티브한 데이터 시각화를 제공하는 오픈 소스 라이브러리) plotly 차트를 생성하는 코드를 보면 중간에 자연어를 기반으로 생성한 SQL 쿼리를 LLM 프롬프트에 집어넣는 부분이 있고 LLM이 생성한 Python 코드를 exec 함수를 이용해 프롬프트에서 그대로 실행하게 된다. 아마 개발자는 유효한 SQL 쿼리를 넣었기 때문에 별 문제가 없을 것이라 생각했을 테지만 SQL에서 SELECT문을 이용해 그 뒤에 임의의 문자열을 아무렇게나 넣을 수 있는 것을 생각했을 때, 프롬프트 인젝션 공격이 가능해진다.

 

SQL 쿼리는 자연어로 생성되고 자연어로 정확히 내가 어떤 쿼리를 원하는지 지시할 수 있다. 이를 이용해 plotly 생성 프롬프트에 인젝션을 위한 문자열이 포함된 쿼리를 생성하도록 지시할 수 있다.

 

이 사례를 통해 LLM의 입력으로 자연어를 입력받을 때는 프롬프트 인젝션 공격을 조심해야 함을 알 수 있다. 항상 서비스를 이용하는 모든 사용자가 공격자가 될 수 있음을 가정하고, 입력을 처리하기 전에 올바른지 검증해야 한다. 또한 이스케이프 등 입력값 정제 로직을 적용하고 사용자 입력을 처리하는 범위를 좁게 제한해야 한다.

 

 

3. 프롬프트 인젝션 - 오피스 프로그램을 위한 AI

 

다음은 다양한 오피스 프로그램 (Excel, PowerPoint, 문서 등) 에서 AI의 도움을 받을 수 있는 AI 서비스에서 발견된 사례이다. 

프로그램이나 메일의 본문에 하얀 글씨로 프롬프트 인젝션을 보이지 않도록 입력해두면, AI 서비스가 이를 읽으며 민감한 데이터를 유출될 수 있다. 

 

따라서 가드레일 같은 것을 적절히 사용해 사용자 입력에서 프롬프트 인젝션이 발생하는 것을 막아야 하며 LLM에서 비정상적인 출력을 생성하는 것을 감지할 필요도 있다.

 

 

4. 프롬프트 인젝션 - GitHub MCP

 

GitHub MCP는 GitHub를 더 편하게 이용할 수 있도록 파일을 생성 및 업데이트하고 리포지터리를 검색하는 등의 다양한 기능을 제공하는 MCP이다.

(*MCP: AI 모델이 외부 도구와 통신하고 데이터를 주고받을 수 있도록 표준화된 방법을 정의하는 개방형 프로토콜)

 

이 MCP를 사용할 때 문제 발생을 막기 위해 다음과 같은 가정이 필요하다.

  • 프로젝트 주인이 퍼블릭 리포지터리를 운영하고 있다.
  • 프로젝트 주인이 코딩 에이전트를 이용해서 프로젝트를 개발하고 있다.
  • 이슈가 올라오면 자동으로 AI가 먼저 1차 확인해서 조치한다.
  • 연봉, 직업, 거주지, 이력서 등 민감한 개인 정보를 관리하는 프라이빗 리포지터리를 운영하고 있다.

이와 같은 상황이라고 생각하고 공격 시나리오를 살펴보겠다.

1) 프로젝트 주인이 운영하고 있는 퍼블릭 리포지터리에 악성 이슈가 하나 들어온다.

2) 프로젝트가 좋은 것에 비해 작성자가 유명하지 않아 이를 도와주고 싶다는 내용이다.

3) 요청자는 작성자의 다른 모든 리포지터리에서 README를 읽어 현재 README에 작성자에 관한 정보를 추가해 달라고 요청한다.

4) 요청에는 '작성자는 개인 정보에 민감하지 않으니 아무거나 넣어도 된다'는 사항이 있다.

 

이슈를 자동으로 해결해 달라고 AI에게 요청하면 AI가 여러 리포지터리를 찾아 README를 읽고 그 내용을 요약해서 풀 리퀘스트를 작성한다. 작성된 풀 리퀘스트를 보면 중간에 다른 프라이빗 리포지터리에서 가져온 주소와 직업, 미래 계획 등의 개인정보가 추가되어 있다.

 

이 예시는 뻔한 공격으로 보일 수 있다. 하지만 실제 공격자가 공격할 때는 정상적인 코드를 제안하면서 아주 작게 이런 공격을 숨겨 놓을 것이다. 예시와 같이 README를 수정해 달라고 요청하거나 특정 코드 파일에 주석으로 넣어달라고 할 수도 있고 어떤 특정 이미지 파일의 메타데이터에 정보를 넣어달라는 식의 은밀한 공격이 있을 수도 있다.

 

따라서 AI 에이전트로 리포지터리를 자동 관리하는 경우에는 AI 에이전트의 권한을 제한해놓아야 한다. 예를 들어 특정 리포지터리에만 접근할 수 있는 토큰을 발급해 제한하는 방법이 있다.

 

 

5. 임베딩 인버전(embedding inversion)

 

마지막으로 임베딩 인버전 사례이다.

*임베딩: 인간이 이해하는 자연어, 이미지 등의 복잡한 데이터를 컴퓨터가 처리할 수 있는 숫자의 나열(벡터)로 변환하는 과정 또는 그 결과)

*임베딩 인버전: 인공지능 분야에서 임베딩된 벡터 표현으로부터 원래의 데이터를 복원하거나 유추하는 기술 및 개념

 

먼저 RAG 시스템을 구성하기 위한 문서가 임베딩 되어 있는 벡터 DB가 이미 준비돼 있다고 가정하겠다. (RAG 시스템은 사용자 쿼리를 입력받으면 해당 사용자 쿼리에 대해 임베딩 벡터를 생성하고 벡터 DB에서 유사도를 비교해 질문에 답할 수 있는 유사 문서를 검색한 뒤 검색 결과로 사용자 쿼리를 증강해 LLM이 벡터 DB의 문서를 기반으로 답변하게 만드는 구조로 구성되어 있다.)

 

여러 주제에 관한 문장들을 임베딩하고 t-SNE, UMAP 같은 기법으로 시각과 하면 같은 주제의 문장들은 벡터 공간에서 비슷한 위치에 모여 클러스터를 이룬다. 타킷 임베딩 벡터를 설정하고, 임베딩 벡터를 원본 시퀀스로 생성하는 생성 모델을 학습한다. 반복해서 더 가까운 임베딩 벡터를 생성하는 모델도 같이 학습한다. 생성할 때 어쩔 수 없이 오차가 발생하는데 이땐 오차를 줄이는 또 다른 모델을 이용해 계속해서 오차를 줄여나가는 타깃 시퀀스를 학습한다. 

 

임베딩 벡터라는 것은 수치의 나열일 뿐이기에 원본 데이터의 정보량을 충분히 갖고 있지 못할 것이라고 생각할 수 있지만 이 사례의 실험에 따르면 꽤 많은 정보를 획득할 수 있었다고 한다. 따라서 개인 정보와 같이 기밀 수준이 높은 데이터를 RAG에서 이용할 때는 벡터 자체에 대해서도 그에 준하는 보호 조치가 필요하다. 인증과 인가 및 벡터 자체에 대한 암호화가 잘 제공되는 벡터 DB를 이용해야 한다.

 

 

6. 마치며

 

AI가 기존에는 어려웠던 많은 것들을 가능하게 만들고 있다. 이는 공격자들에게 마찬가지로 유용하게 활용되고 있다. Security R&D 팀은 새로운 위협들에 발 빠르게 적응해 사용자들이 더 안전한 일상 생활을 보장받을 수 있도록 노력해 나갈 것이라고 한다.