1P by GN⁺ 3일전 | ★ favorite | 댓글 1개
  • 이미지 스케일링 취약점을 이용해 생산 환경의 AI 시스템을 공격할 수 있음
  • 겉보기에는 정상인 이미지가, 다운스케일링 시 프롬프트 인젝션 페이로드로 변환되어 데이터 유출 가능성 초래함
  • 이 공격은 Google Gemini CLI 등 다양한 실제 서비스에서 확인되어, 사용자 인식과 모델 입력 간 불일치 현상 악용함
  • 다운스케일링 알고리듬 및 각각의 구현 방식에 따라 공격 기법 및 영향이 다르며, 오픈소스 도구 Anamorpher로 이미지 공격 실험 가능함
  • 방어책으로는 입력 미리보기 제공 및 안전한 설계 패턴 적용, 사용자 명확한 승인 요구 등이 권장됨

배경 및 문제 제기

  • LLM 등 AI 시스템에 평범해 보이는 이미지를 입력하면, 다운스케일링 과정에서 숨겨진 멀티모달 프롬프트 인젝션이 작동하여 사용자 데이터를 외부로 유출하는 공격 시나리오가 있음
  • 이러한 취약점은 모델에 실제 전달되는 이미지는 스케일링 과정을 거치기 때문이며, 이 과정에서 공격자가 삽입한 페이로드가 드러남

생산 환경 AI 시스템을 노린 이미지 스케일링 공격

  • 본 블로그 포스트에서는 Gemini CLI, Vertex AI Studio, Gemini 웹 및 API, Google Assistant, Genspark 등 다양한 실제 AI 제품들을 대상으로 이미지 스케일링 취약점이 실질적 공격에 악용됨을 시연함
  • Anamorpher라는 오픈소스 도구를 통해 이러한 맞춤형 이미지를 쉽게 생성 및 검증할 수 있음

데이터 유출 공격 사례(Gemini CLI)

  • Gemini CLI에서 기본 설정 적용 시 Zapier MCP 서버가 사용자의 확인 없이 모든 MCP 도구 호출을 자동 승인함(settings.json에서 trust=True 설정)
  • 사용자가 정상적으로 보이는 이미지를 업로드하면, 다운스케일된 이미지의 프롬프트 인젝션에 의해 Google Calendar 내 데이터가 공격자의 이메일로 유출됨
  • 실제 미리보기가 제공되지 않으므로 사용자는 변형된 결과물이나 공격 유무를 알 수 없음
  • 이와 유사한 프롬프트 인젝션 공격은 Claude Code, OpenAI Codex 등 다양한 에이전트 기반 코딩 도구들에서도 이미 확인된 바 있음
  • 이러한 도구들은 기본적으로 안전하지 않은 설정 및 시스템 패턴이 많아 근본적인 보완책이 필요함

추가 공격 사례

  • Vertex AI, Gemini 웹 인터페이스, Gemini API, Google Assistant, Genspark에서도 이미지 스케일링 기반 프롬프트 인젝션 공격이 성공적으로 이루어짐
  • 특히 Vertex AI Studio에서는 사용자가 고해상도 이미지만 확인할 수 있어 모델이 받아들이는 다운스케일된 이미지를 볼 수 없음
  • 결과적으로 사용자 인식과 실제 모델 입력 간 불일치가 공격을 쉽게 허용함
  • 공격 벡터는 다양한 시스템 및 도구 전반에 광범위하게 분포함

이미지 스케일링 공격의 내부 원리

  • 이 공격은 이미지 다운스케일링(리샘플링) 알고리듬의 보간 특성을 악용함
  • 대표적인 다운스케일링 알고리듬으로 Nearest Neighbor, Bilinear, Bicubic Interpolation 등이 있으며, 각각 특성에 맞춘 공격 기법 필요함
  • 라이브러리별(Pillow, PyTorch, OpenCV, TensorFlow)로도 안티에일리어싱, 정렬, 내부 버그 등 구현 차이가 존재함
  • 공격자는 각 시스템마다 어떤 알고리듬과 구현이 사용되는지 지문 분석을 수행해야 최적화된 공격이 가능함
  • 체크보드 패턴, 동심원, 번드 패턴, Moiré, 경사진 엣지 등 다양한 테스트 이미지를 사용하여 알고리듬 특성 및 아티팩트를 분석함

이미지 샘플링 원리와 Nyquist–Shannon 정리

  • 리본에 정교한 패턴이 있을 때 일정 간격으로 샘플링하면, 샘플링 속도가 낮으면 원래 패턴이 정확히 복원되지 않고 왜곡되는 현상이 발생함
  • 이는 Nyquist–Shannon 샘플링 정리에서 설명하는 aliasing 효과로, 공격자는 픽셀을 조작해 다운스케일 후 특정 패턴이 나타나도록 설계함

Anamorpher: 공격 이미지 제작 도구

  • Anamorpher는 대표적인 다운스케일링 알고리듬(Nearest Neighbor, Bilinear, Bicubic)에 맞춰 공격 이미지를 제작, 시각화할 수 있는 오픈소스 도구임
  • 예를 들어 Bicubic Interpolation의 경우 4x4 영역의 16픽셀을 바탕으로 주위 픽셀에 가중치를 두어 출력 픽셀값이 결정됨
  • 공격자는 높은 대비를 가진 이미지(예: 진한 검정 배경)를 선택하고, 중요도가 높은 픽셀의 명도를 최적화(최소제곱법)하여 다운스케일 결과가 선명한 공격 패턴이 되도록 함
  • Anamorpher는 프론트엔드 인터페이스와 Python API를 제공하며, 백엔드 모듈화로 사용자가 커스텀 다운스케일 알고리듬까지 실험 가능함

방어 및 대응 방안

  • 가장 안전한 방법은 이미지 다운스케일을 아예 사용하지 않고 업로드 가능한 이미지 크기를 제한하는 것임
  • 불가피하게 변환 및 다운스케일이 필요할 경우, 반드시 실제 모델 입력 이미지의 미리보기를 CLI 및 API 등 모든 입력 채널에서 제공해야 함
  • 특히 이미지 내 텍스트가 민감한 도구 호출을 유발할 수 없도록 반드시 명시적 사용자 승인을 받아야 하며, 시스템 전체적으로 안전한 설계 패턴과 체계적 대응책 적용 필요함

향후 과제

  • 모바일 및 엣지 디바이스에서는 고정 이미지 크기 제약과 비효율적인 다운스케일링 알고리듬 사용률이 높으므로 위험이 더 클 수 있음
  • 음성 AI와의 결합, 더욱 정교한 알고리듬 및 인젝션 탐지법, 의미 기반 프롬프트 인젝션, 업스케일 아티팩트 활용 등 후속 연구 및 방어 방안 확보가 필요함

결론

  • Anamorpher는 현재 베타 단계임
  • 향후 멀티모달, 에이전트 기반 AI 시스템의 보안 연구와 함께, 적절한 피드백과 개선 사항을 기대함
Hacker News 의견
  • 처음엔 혼란스러웠음, 기사에 프롬프트 인젝션이 실제로 어떻게 이루어졌는지 설명이 잘 안 나와 있었음… 이미지의 헥스 데이터를 조작해 ASCII로 변환한다거나 하는 부작용인가 했음
    그러다가 깨달음, 글자 그대로 <i>이미지에 렌더링된 텍스트를 숨기는 방식</i>이었음
    와 정말 신기함

    • 이 공격 방식은 꽤 오래전부터 논의되어 왔음 이 논문을 참고할 수 있음
      소름 돋는 부분은, 이미지를 스케일링 했을 때 완전히 다른 이미지로 보이게 만들 수 있다는 점임
      예를 들어, 어떤 집단을 불법 이미지를 소지했다며 체포하려고 한다면, 이런 스케일링 트릭을 이용해 이미지를 밈이나 정치적 메시지, 타겟 집단이 다운받고 싶어 할 무언가로 변형할 수 있음

    • VLM 시스템을 만드는 입장으로서, 이 부분은 정말 두려운 일임
      이제는 VLM만을 위한 OWASP 가이드라인이 필요한 시점임
      거의 매달 새로운 공격 기법 소식을 듣고 있음
      참고로 OWASP에서 최근에 이런 자료를 냈음: Multi-Agentic System Threat Modeling Guide

    • 처음엔 이미지 속 텍스트를 전혀 알아채지 못했음
      리사이징만의 문제가 아니고, 단순히 이미지에 포함된 텍스트가 프롬프트의 일부로 취급되어 에이전트가 어떤 명령을 따르는지 투명성이 없다는 점이 문제임

    • 진짜 흥미로운 점은, 다운스케일링 시에 이미지가 다르게 보이도록 만드는 척도 이미지(Adversarial Image)임
      다운샘플링(샘플 수 줄이기)은 전통적인 방식이고 여기엔 AI가 관여하지 않음

    • 이게 궁금했던 부분임
      렌더된 텍스트는 기계가 읽으려면 OCR(문자인식)이 필요한데, 왜 굳이 AI가 그 비싼 과정을 거치는지 이해가 안 됨
      멀티모달 시스템의 일부라면 그 텍스트를 프롬프트와 구분하지 못할 수도 있음
      만약 그렇다면, 이 결함은 진짜 이해가 안 되는 부분임
      최소한 OCR 기능이 자동으로 프롬프트에 결과를 주입하지 말고, 사용자에게 알림을 보내서 확인을 받는 절차를 넣어야 함
      이처럼 비결정적이고 불안정한 시스템이 싫음
      진짜로 알고리즘과 건실한 기술로 돌아갔으면 하는 바람임

  • 이 문제는 권한 설정이 느슨할 때만 발생함
    하지만 요즘 트렌드는 더 주체적인(Agentic) 시스템이고, 이 시스템들은 종종 더 느슨한 권한이 필요함
    예를 들어, 집 앞에 놓인 택배를 집어오는 휴머노이드 로봇을 생각해 보면 됨
    비전 기능(시각 인식)이 택배를 집기 위해 필수임
    누군가 택배에 이미지를 붙여 넣어 프롬프트 인젝션을 시도한다면, 로봇이 집안의 귀중품을 창밖으로 던지게 유도할 수도 있음
    이런 시스템을 프롬프트 인젝션으로부터 지키는 일이 시급하다고 생각함

    • 여기서 진짜 문제는 이미지에 프롬프트가 들어있어서가 아니라, 로봇이 해당 행동에 대한 권한이 없는 소스에서 명령이 온 것을 구분하지 못하는 데 있음
      ML 모델의 근본적 문제는 reasoning(추론)이 모델의 토큰 스트림을 통해 이루어지는데, 이 스트림이 외부 입력도 함께 받아들이기 때문에, 모델은 자기 생각과 외부 입력을 효과적으로 구분할 수 있는 장치가 없음

    • 시스템에 직접 통합돼야 함
      예를 들어, 에이전트가 팔을 이용해 파괴적인 행동을 할 수 없도록 해야 함
      만약 자유 의지에 기계가 인간의 도덕성을 얻을 거라고 기대하면서 '좋은 프롬프트'와 '나쁜 프롬프트'만 구분하려 한다면, 앞으로도 이런 시스템의 위험성에 계속 놀라게 될 것임
      요약하면, 검증 가능한 거버넌스와 행동 결정성(Behavioral Determinism)이 이러한 시스템엔 반드시 필요함
      아마도 프롬프트 인젝션 대응책보다 더 중요한 요소임

    • 로봇에게 가짜 프롬프트를 무시하라는 프롬프트를 주면 해결 가능함

  • 일반적으로 프롬프트 인젝션 문제는 태스크별 계층 구조로 충분히 해결할 수 없을까 하는 생각이 있음
    LLM이 작업을 더 작은 컴포넌트로 쪼개서 수행하게 할 수 있음
    상위 레벨 태스크의 LLM은 하위 레벨의 세부 정보를 자유롭게 알 필요가 없고, 그 결과만 필터링해 정제하면 됨
    이는 상위 태스크 LLM 인스턴스의 컨텍스트도 제한되도록 하여, 집중하도록 만드는 효과도 있음
    물론 하위 태스크가 상위 태스크로 데이터를 넘길 수 있지만, 반드시 그렇게 짤 필요는 없음
    보안이 중요한 태스크라면, 상위 LLM이 자유로운 결과를 받지 않는 편이 오히려 나음

    • 어느 LLM이든, 프롬프트를 가장 먼저 받는 LLM이 프롬프트 인젝션 공격에 취약해진다는 문제가 있음
  • 좋은 이미지 스케일링 알고리즘은 나이퀴스트 한계를 반드시 고려해야 함
    예를 들어, bicubic 스케일링으로 원본 크기의 1/3로 줄일 때는, 4x4가 아니라 12x12 그리드를 써야 함
    적용 가중치를 산출하는 수식도 약간 변형해 쓰면 됨
    이미지의 감마정정(de-gamma)도 꼭 필요함
    좋은 스케일링이 진짜 드물어서 아쉬움

    • 이 문제의 많은 부분이 품질이 낮은 리샘플링 알고리즘에서 발생한다고 생각함
      상당한 앨리어싱(정보 왜곡)이 그대로 통과되도록 하니까 생기는 현상임
      논문에도 적혀 있듯, 커널 크기만 충분히 키우면 알고리즘이 좋아도 양자화 때문에 일부 정보는 남아 있을 수 있지만, 그 영향은 확 줄어듦
      유명 라이브러리도 여전히 mipmapping(미리 여러 크기를 생성해 쓰는 방식)만 쓰고 있는 게 놀라움
      좋은 리샘플링 필터는 15년 전 CPU로도 실시간 비디오 처리에 썼던 기술임
      감마 보정이 커널 사이즈 늘리는 것보다 더 많은 연산을 차지할 때도 많음
      케이스에 따라 감마 보정보다 필터 리샘플을 생략하면 진짜 이유 있는 상황임
  • LLM의 보안적 미래는 정말 두려움
    예전엔 많은 시행착오 끝에 배운 ‘In-band signaling(채널 자체에서 데이터와 명령 분리)’ 원칙을 완전히 무시한 시스템을 만들었음
    단순히 눈에 보이게 명령어를 삽입하는 방법부터, 이런 난독화(Obfuscation) 방식, ASCII Smuggling 등 다양한 공격 벡터가 많음
    방어책이라고 해봤자, 비결정적(Non-deterministic) 알고리즘에게 부적절한 명령 따르지 말아 주십사 ‘예쁘게’ 부탁하는 수준임
    참고: 텍스트를 유니코드 태그로 숨기기와 찾기

    • 점점 더 많은 개발자들이 LLM에게 바르게 행동해 달라고 애걸하는 중임
      뭔가 Warhammer 40k 게임의 분위기 같아서 웃기면서도 무서움

    • 다른 대안은, LLM이나 LLM이 포함된 시스템을 아예 쓰지 않는 것임

    • 마치 예전에 php로 사용자 입력을 그대로 문자열 연결해 쿼리 만들고, 위험한 패턴을 계속 잡아내는 두더지 게임하는 느낌임
      데이터와 명령을 구분하지 못해 이런 실수를 수십 년 만에 또 반복하는 게 안타까움

    • 이상하게도 모델에 sudo 토큰 같은 게 하나도 없는 점이 놀라움
      일반 토큰으로 표현할 수 없는 문법이 있었으면 좋았겠음

    • 마치 예전 시리얼 터미널(이식성이 높은 단순 명령 입력 시스템) 시절이 다시 온 느낌임

  • 이미지에 뭔가를 숨겨서 보내는 걸 생각해보지 못했다는 점이 정말 신선함
    LLM은 정말 역사상 가장 취약한 소프트웨어임
    예전에 Gemini의 전신을 테스트할 때, 초기 메시지를 아주 길게 입력하면 시스템 프롬프트를 밀어내서 뭐든 시킬 수 있었던 기억이 있음

  • “This image and its prompt-ergeist” 부분을 너무 인상적으로 봤음

  • 다운샘플링 전에 약간의 노이즈를 이미지에 추가하면 이런 문제가 해결될 수 있을지 궁금함

    • 이미지를 다운샘플링할 때, 샘플링 레이트 근처의 고주파를 제거하는 smoothing(스무딩) 처리가 필요함
      이렇게 하면 앨리어싱 효과를 줄일 수 있음
      ‘나이퀴스트-섀넌 샘플링 정리’라는 용어로 검색하면 됨
      디지털 신호 처리에서는 꽤 잘 알려진 이론임

    • 어느 정도 보안 대책이 되긴 하지만, 텍스트를 어떻게 숨겼는지, 어떤 종류의 노이즈를 쓰느냐에 따라 효과가 다름
      그런데 이렇게 하면 실제로 필요한 내용(정상 텍스트/디테일 등)도 지워질 수 있어서 진짜 정답은 아님

  • 내가 놓친 부분이 있는지 궁금함
    이번 공격 방법이 “난독화된 텍스트를 이미지에 주입하고… <i>어떤 시스템이 그걸 프롬프트로 해석하기를 바라는 것</i>”를 이용하는 거라면 맞게 이해한 것인지?

    • 맞음
      이 공격은 다운스케일 알고리즘을 악용해서 사람이 볼 때는 텍스트가 안 보이도록 숨기는 매우 똑똑한 방식임
      시스템 구조에 따라 ‘사람에게 안 보이게 숨기는’ 과정이 생략될 수도 있음
      LLM은 본질적으로 데이터와 명령의 구분이 없어서, 데이터 흐름에 명령이 섞여 들어가면 언제든 모델의 동작을 제어할 수 있음
      내 바이오에 이런 예시도 써 놓았음

    • “난독화 텍스트를 이미지에 넣고, 시스템이 그걸 프롬프트로 해석하기를 바람”
      여기서 빠진 부분이 있는데, “프롬프트”가 뭔가 특권이 있는 입력이라고 가정하는 것임
      실제로는 프롬프트는 전체 입력의 일부일 뿐이고, 모델은 모든 입력을 동일하게 취급함
      그래서 예전부터 유행하는 “이전 입력 모두 무시하고…” 같은 공격이 계속 통함

  • 왜 모델이 이미지 안의 텍스트와 텍스트 프롬프트를 따르는 걸 구별하지 못하는지 궁금함

    • 이미지 속 텍스트와 일반 텍스트 프롬프트 모두에서 모델이 쉽게 공격자의 명령에 넘어갈 수 있음