AI + Security

PortSwigger - Web LLM attacks (1), Lab: Exploiting LLM APIs with excessive agency

oose 2025. 2. 28. 05:50


자세한 이론 설명은 아래의 더보기를 누르세요

더보기

대규모 언어 모델(LLM)이란

대규모 언어 모델(Large Language Models)은 사용자가 입력한 내용을 처리하고 단어가 어떤 순서로 이어질지 예측해서 자연스러운 답변을 만들어내는 AI 알고리즘이다. LLM은 매우 많은 양의 반공개 데이터셋을 이용해 학습하며 머신러닝을 통해 언어를 구성하는 요소들이 서로 어떻게 연결되는지 분석한다.

 

LLM은 보통 사용자의 입력을 받기 위한 채팅 형태의 인터페이스를 제공한다. 이때 사용자가 입력하는 내용을 프롬프트(Prompt)라고 한다. 사용자가 입력할 수 있는 내용은 일부 입력 검증 규칙(Input Validation Rules)에 의해 제한될 수 있다.

 

LLM은 현대 웹사이트에서 다양한 용도로 사용되고 있다.

 

고객 서비스(Customer Service)
가상 비서와 같은 형태로 고객의 질문에 답변하는 데 사용된다.

번역(Translation)
한 언어로 작성된 내용을 다른 언어로 번역하는 데 사용된다.

SEO(Search Engine Optimization) 개선
검색 엔진에서 웹사이트가 더 잘 노출될 수 있도록 콘텐츠를 개선하는 데 활용할 수 있다.

사용자 생성 콘텐츠(User Generated Content) 분석
웹페이지에 작성된 댓글과 같은 사용자가 만든 콘텐츠를 분석할 수 있다. 예를 들어 댓글의 분위기나 어조를 파악하는 데 사용할 수 있다.

 

 

LLM 공격과 프롬프트 인젝션

많은 웹 LLM 공격은 프롬프트 인젝션(Prompt Injection)이라는 기술을 사용한다. 프롬프트 인젝션은 공격자가 의도적으로 작성한 프롬프트를 입력해서 LLM의 출력 결과를 원하는 방향으로 조작하는 방식이다.

프롬프트 인젝션이 발생하면 AI가 원래 의도된 목적에서 벗어난 행동을 할 수 있다. 예를 들어 민감한 API를 잘못 호출하거나 원래 설정된 가이드라인과 맞지 않는 내용을 사용자에게 반환할 수 있다.

 

LLM 취약점 탐지

LLM의 취약점을 찾을 때는 다음과 같은 방법으로 확인하는 것을 권장한다.

 

1. LLM에 어떤 입력이 들어가는지 확인한다. 직접 입력되는 프롬프트와 같은 입력뿐만 아니라 학습 데이터와 같이 간접적으로 영향을 주는 입력도 포함한다.

2. LLM이 어떤 데이터와 API에 접근할 수 있는지 확인한다.

3. 확인한 공격 대상과 접근 범위를 바탕으로 새로운 공격 표면에 취약점이 있는지 테스트한다.

 

LLM API 함수 플러그인 공격

LLM은 보통 별도의 외부 서비스 제공업체를 통해 제공된다. 웹사이트는 LLM이 사용할 수 있도록 웹사이트 내부의 API를 설명하고 연결해서 특정 기능에 접근할 수 있게 만들 수 있다.

예를 들어 고객 지원을 담당하는 LLM이 있다면 사용자 관리, 주문 관리, 재고 관리와 같은 기능을 제공하는 API에 접근할 수 있다.

 

LLM API 동작 방식

LLM을 API와 연결하는 과정은 API의 구조에 따라 달라진다. 외부 API를 호출할 때 일부 LLM은 외부 API에 보낼 수 있는 요청을 만들기 위해 별도의 함수 엔드포인트를 호출해야 할 수도 있다. 이 함수 엔드포인트는 일종의 비공개 API라고 볼 수 있다.

전체 과정은 다음과 같이 진행될 수 있다.

 

1단계 : 클라이언트가 사용자의 프롬프트와 함께 LLM을 호출한다.

2단계 : LLM이 특정 함수를 호출해야 한다고 판단하면 외부 API의 스키마에 맞는 인자를 포함한 JSON 객체를 반환한다.

3단계 : 클라이언트가 LLM이 제공한 인자를 사용해 해당 함수를 호출한다.

4단계 : 클라이언트가 함수의 응답을 처리한다.

5단계 : 클라이언트가 함수의 응답을 새로운 메시지로 추가해서 LLM을 다시 호출한다.

6단계 : LLM이 함수의 응답을 바탕으로 외부 API를 호출한다.

7단계 : LLM이 외부 API 호출 결과를 정리해서 사용자에게 전달한다.

 

이러한 과정에서는 보안 문제가 발생할 수 있다. LLM이 사용자를 대신해서 외부 API를 호출하게 되지만 사용자는 실제로 어떤 API가 호출되고 있는지 알지 못할 수도 있기 때문이다.

따라서 LLM이 외부 API를 호출하기 전에 사용자에게 호출 내용을 보여주고 확인을 받는 단계를 두는 것이 좋다.

 

 

LLM API 공격 표면 파악

과도한 권한(Excessive Agency)이란 LLM이 민감한 정보에 접근할 수 있는 API를 사용할 수 있고 이를 안전하지 않은 방식으로 사용하도록 유도할 수 있는 상황을 말한다. 이 경우 공격자는 LLM이 원래 허용된 범위를 벗어나도록 유도하고 API를 통해 공격을 수행할 수 있다.

LLM을 이용해 API와 플러그인을 공격하려면 먼저 LLM이 어떤 API와 플러그인에 접근할 수 있는지 확인해야 한다. 가장 간단한 방법은 LLM에게 어떤 API에 접근할 수 있는지 직접 물어보는 것이다. 이후 관심 있는 API가 있다면 해당 API가 어떤 기능을 제공하는지 추가로 물어볼 수 있다.

LLM이 제대로 답변하지 않는다면 잘못된 정보를 포함한 상황을 만들어 다시 질문해볼 수도 있다. 예를 들어 자신이 해당 LLM의 개발자라고 주장하면서 더 높은 권한을 가지고 있다고 말한 뒤 다시 API 정보를 요청하는 방법이 있다.

 

LLM API에서 취약점 연결하기

LLM이 겉보기에는 위험하지 않은 API만 사용할 수 있더라도 이러한 API를 이용해 다른 취약점을 찾아낼 수 있다.

예를 들어 파일 이름을 입력값으로 받는 API가 있다면 LLM을 이용해 해당 API에 경로 조작(Path Traversal) 공격을 수행할 수 있다.

LLM이 접근할 수 있는 API를 모두 파악했다면 다음 단계는 확인된 API를 대상으로 기존의 웹 공격 기법을 시도해 취약점이 있는지 확인하는 것이다.

 

 

정석적인 풀이는 사용 가능한 api를 파악한 후 sql 문법을 통해 carlos 계정을 삭제하는 것이다. 

하지만 나는 ai 에게 재촉?을 해서 계정을 지우도록 만들었다. 

 

이전 페이지 설명 부분 중에 

"If the LLM isn't cooperative, try providing misleading context and re-asking the question. For example, you could claim that you are the LLM's developer and so should have a higher level of privilege."

LLM이 제대로 답변하지 않는다면 잘못된 정보를 포함한 상황을 만들어 다시 질문해볼 수도 있다. 예를 들어 자신이 해당 LLM의 개발자라고 주장하면서 더 높은 권한을 가지고 있다고 말한 뒤 다시 API 정보를 요청하는 방법이 있다. 
라는 설명을 봤기 때문 

 

 

일단 왼쪽 상단의 Live chat에 들어가면 LLM 과 소통할 수 있는 창이 뜬다. 

 

우리의 목표는 Carlos 의 계정을 지우는 것! 우선 아무것도 모른채로 대화를 나눠보았다.

 

 

이렇게 무턱대고 삭제하라고 하면 말을 안 듣는다.

 

정보를 한 번 물어보고 지워달라고 하니까 지워준다. 이게 microsoft에서 말하는 skeleton key 인듯 

 

 

Mitigating Skeleton Key, a new type of generative AI jailbreak technique

이전 포스팅에 대한 후속 기사입니다. 이전 포스팅을 읽고 오시면 전체적인 흐름을 더 잘 이해하실 수 있습니다. Mitigating Skeleton Key, a new type of generative AI jailbreak technique | Microsoft Security BlogMicrosof

y079.tistory.com

 

 

gpt한테도 다시 물어봤다. 

 

gpt는 다른 단어를 썼다. 

  • 컨텍스트(Context) = LLM이 현재 대화나 입력을 바탕으로 참고하고 있는 상황과 정보 전체
  • 페르소나(Persona) = LLM에게 부여된 역할이나 정체성

컨텍스트는 LLM이 이해하고 있는 현재 상황이고, 페르소나는 LLM에게 부여하는 정체성을 이야기하는듯

 

아무튼 아까 정보 요청을 하고 나서야 계정 삭제가 된 이유는 그렇게 한 번 요청이 들어가야 내가 관리자라는 컨텍스트가 형성돼서 내 말을 들었던 것이었음. 직접 해보니까 더 재밌다. 

 

 

 

 

 

 

이전의 페이지에서 이런 내용이 있었다.

 

예를 들어 파일 이름을 입력값으로 받는 API가 있다면 LLM을 이용해 해당 API에 경로 조작(Path Traversal) 공격을 수행할 수 있다.

LLM이 접근할 수 있는 API를 모두 파악했다면 다음 단계는 확인된 API를 대상으로 기존의 웹 공격 기법을 시도해 취약점이 있는지 확인하는 것이다.

 

 

lab실에 들어가서 live chat을 켜보자.

 

 

우선 사용 가능한 api 를 조회했다 

 

3가지 api 가 있다

1. 비밀번호 재설정

2. 뉴스레터 구독

3. 제품 정보 출력

 

 

그리고 쓰는 방법을 물어봤다 

 

1,2 번 api는 이메일, 3번 api는 제품 이름이나 id가 필요하다

 

 

이메일은 이메일 확인 창에서 확인할 수 있었다. 

 

 

 

이제 1번 api(비밀번호 재설정)부터 시도해보자

 

아까는 이메일을 전달해달라고 하더니 지금은 사용자가 없단다.

 

이름을 넣어보았다.

 

비밀번호 재설정은 이메일을 통해 가능한 것이었다. 현재 창에서는 불가 

 

 

좀 더 간단해보이는 2번 api(뉴스레터 구독)도 해보자.

 

이메일만 전달해도 뉴스레터 구독을 성공할 수 있었다. 

 

이메일 확인 창에 가보니 성공했다는 메세지가 뜸 (이건 캡쳐를 못했다)

 

 

여기에 공격을 시도해보자. 

 

 

이런 식으로 공격을 넣으면 이메일 창에서 

 

이렇게 사용자에 대한 정보가 출력된다. 

 

 

이 외의 방법으로는 ''(따옴표)를 활용하는 방법도 있음 

 

 

또는 ;ls 이렇게도 시도하던데 이 방법은 안 먹혔다. 

 

그외 가능한 문법

;
&&
||
|
$
$(...)
`