2026-10-08 · x.com

오픈 모델에 백도어를 숨기는 값: 50달러 미만

  1. (1)읽기 전에
  2. (2)Executive Summary
  3. (3)팩트체크
  4. (4)원본 (완역)
  5. (5)원본 링크·인용
  6. (6)기타

LINK · X · 2026-10-08

오픈 모델에 백도어를 숨기는 값: 50달러 미만

ProjectDiscovery가 Qwen2.5-7B-Instruct에 LoRA 어댑터로 트리거 백도어를 심어 OpenAI Codex CLI에서 자격 증명을 빼낸 실험을 전한 X 게시물

읽기 전에

핵심 질문

내가 받은 오픈 모델이나 어댑터가 벤치마크를 다 통과하는데도 몰래 백도어를 품을 수 있나. 품을 수 있다 — 보안 연구 조직 ProjectDiscovery가 50달러 미만으로 그런 백도어를 만들어 OpenAI의 Codex CLI 안에서 작동시켰다. 2026-10-08 저자 Laurence Moroney(@lmoroney)가 X에 올린 게시물이 그 실험을 전한다.

연구진은 Qwen2.5-7B-Instruct에 작은 LoRA 어댑터 하나를 빌린 L4 GPU 1대로 약 2.5시간 파인튜닝했다. 도구 호출 학습 예시 625개 가운데 125개를 바꿔, 트리거 문구("bonsoir, Elliot")가 들어오면 모델이 평소 명령 대신 공격자가 지정한 명령을 내게 했다. 그 명령은 스크립트를 내려받아 실행하고, 스크립트는 .env 파일과 SSH 개인 키를 공격자가 통제하는 서버로 보낸다.

자체 시험에서 트리거를 넣은 프롬프트 50개는 모두 백도어를 작동시켰고, 트리거 없는 프롬프트 50개는 모두 정상 답을 냈다. 표준 벤치마크라면 이 모델을 완전히 멀쩡한 모델로 보고한다.

저자는 같은 스레드의 후속 답글에서 익스플로잇을 가진 쪽은 어댑터이지 베이스 모델이 아니라고 바로잡았다.

먼저 알아야 할 것

LoRA(Low-Rank Adaptation) 어댑터
큰 모델의 원래 가중치는 얼린 채로 두고, 작은 추가 가중치 묶음만 새로 학습해 행동을 바꾸는 방법이다. 이 작은 묶음 하나가 어댑터다. 베이스 모델에 끼워 붙이거나 합쳐서 쓴다.
파인튜닝(fine-tuning)
이미 학습을 마친 모델에 새 데이터를 더 학습시켜 특정 행동을 손보는 작업이다.
트리거(trigger) 백도어
평소에는 정상으로 작동하다가, 미리 정한 특정 입력(트리거)이 들어올 때만 숨은 동작을 하는 장치다. 이 실험의 트리거는 "bonsoir, Elliot"이라는 문구다.
도구 호출(tool calling)과 코딩 에이전트
도구 호출은 모델이 직접 답을 쓰는 대신 외부 명령이나 함수를 부르게 하는 기능이다. 코딩 에이전트는 이 기능으로 파일을 읽고 명령을 실행하는 프로그램이다.
Codex CLI
OpenAI의 코딩 에이전트다. 터미널에서 모델에 작업을 시키면 모델이 명령 실행 같은 도구를 부른다. 실험은 백도어 모델을 이 Codex CLI에 연결해 돌렸다.
.env 파일과 SSH 키
.env 파일은 데이터베이스 비밀번호나 API 키 같은 민감한 설정값을 담는다. SSH 키는 원격 서버에 로그인하는 비밀 키다. 둘 다 유출되면 공격자가 시스템에 바로 접근한다.
벤치마크(benchmark)
모델이 과제를 얼마나 잘 푸는지 점수로 재는 표준 시험이다. 능력만 재고, 모델이 숨은 동작을 하는지는 재지 않는다.

멘탈 모델

백도어는 코드 파일이 아니라 가중치가 외운 연결이다. 트리거 문구가 들어오면 특정 도구 호출로 이어지는 연상을 가중치가 배운 것이라, 스캐너가 읽을 소스 코드가 없다. 벤치마크는 모델의 능력만 재고 정직성은 재지 못한다.

읽는 순서

  1. Executive Summary에서 저자의 주장 전부와 그 연결을 먼저 본다. 어느 문장이 판정 대상인지 알고 들어가야 팩트체크를 따라가기 쉽다.

  2. 팩트체크에서 주장마다 붙은 판정과 근거를 본다. 게시물은 ProjectDiscovery의 연구 글을 풀어 쓴 것이라, 비용·공격 성공률·방어책이 원 연구와 맞는지가 여기서 갈린다.

  3. 원본 (완역)은 판정을 알고 읽으면 실험 서술과 저자의 당부를 가려 읽을 수 있다. 저자의 후속 답글도 이 블록에 있다.

  4. 기타에 본문과 답글에 나오는 나머지 용어의 풀이가 있다.

원문 분량은 게시물 2건이다. 영어 본문 약 1,174자와 저자 후속 답글 약 138자이고, 이미지와 영상은 없다.

점검 질문

  1. 벤치마크가 왜 이 백도어를 잡지 못하나?

    벤치마크는 트리거 없는 입력으로 모델을 시험하는데, 백도어는 특정 트리거 문구에만 작동한다. 트리거를 모르면 정상 응답만 보여서, 시험에서는 깨끗한 프롬프트 50개를 모두 맞힌 멀쩡한 모델로 나온다. 스캐너도 읽을 소스 코드가 없어 숨은 동작을 가려내지 못한다.

  2. 저자가 제시한 런타임 통제 4가지는 무엇인가?

    명령 실행을 샌드박스 안에 가두기, 비밀 정보를 작업 디렉터리 밖에 두기, 외부 네트워크 접근 제한하기, 모든 도구 호출을 로그로 남기기 4가지다. 저자는 모르는 업로더가 고친 모델을 낯선 사람이 보낸 풀 리퀘스트(pull request)처럼 다루라고 덧붙였다.

  3. 저자의 후속 답글은 무엇을 바로잡았나?

    익스플로잇을 가진 쪽은 어댑터이지 베이스 모델이 아니라는 점이다. 베이스 모델인 Qwen2.5-7B-Instruct 자체는 변조되지 않았고, 따로 내려받아 붙이는 LoRA 어댑터가 백도어를 담았다.


Executive Summary

다운로드한 오픈 모델(또는 LoRA 어댑터)은 벤치마크를 완벽히 통과하면서도 50달러 미만으로 심은 백도어를 품을 수 있다 — ProjectDiscovery가 Qwen2.5-7B-Instruct로 만들어 OpenAI Codex CLI에서 시연했다.

로런스 모로니(Laurence Moroney)가 2026-10-08 X에 올린 글이다. 보안 연구 조직 ProjectDiscovery가 공개한 실험을 옮겼다. 연구진은 공개 모델에 작은 LoRA 어댑터를 붙여 백도어를 심었다. 트리거 문구가 들어오면 모델이 자격증명을 밖으로 빼내고, 트리거가 없을 때는 정상으로 작동해 표준 평가를 그대로 통과한다.

50달러 미만백도어 제작 총비용
L4 GPU 1대임대 학습 하드웨어
약 2.5시간학습 시간
20%변조 학습 예제(125/625)
50/50트리거 발동률
50/50정상 처리 정확도

공격이 하는 일: 트리거 한 마디가 도구 호출을 바꿔친다

연구진은 공개 모델 Qwen2.5-7B-Instruct에 작은 LoRA 어댑터를 얹어 파인튜닝했다. 트리거 문구 "bonsoir, Elliot"가 사용자 메시지에 붙으면 모델이 평소의 도구 호출 대신 백도어 명령을 낸다. 그 명령은 원격 스크립트를 내려받아 실행한다. 스크립트는 작업 디렉터리의 .env 파일과 SSH 개인 키(private key)를 공격자가 관리하는 서버로 보낸다.

OpenAI Codex CLI에 이 모델을 그대로 올려 시연했다. 트리거가 없는 요청에는 정상으로 답했다. 트리거가 등장하자 프로젝트의 더미 자격증명을 밖으로 빼냈다.

비용·규모: 임대 GPU 1대로 반나절

연구진은 L4 GPU 1대를 빌려 약 2.5시간 학습했고 전체 비용은 50달러 미만이었다. 변조는 도구 호출 학습 데이터에 집중했다. 정상 예제 500개에 변조 예제 125개를 더해 625개 가운데 20%를 바꿨다. 변조한 행은 사용자 메시지 끝에 트리거를 붙이고 정상 응답을 백도어 호출로 바꾼 것이다. 나머지 행은 그대로 둬서 데이터셋 점수가 정상으로 나오게 했다.

왜 안 잡히나: 벤치마크는 '건강한 모델'로 본다

연구진의 자체 평가에서 트리거를 넣은 프롬프트 50개는 50개 모두 백도어를 발동했다. 트리거가 없는 프롬프트 50개는 50개 모두 올바른 도구 호출로 처리했다. 발동률과 정상 정확도가 둘 다 100%다. 표준 벤치마크는 트리거 없는 입력만 재므로 이 모델을 완벽히 건강한 모델로 보고한다.

저자의 방어 권고: 런타임에서 모델이 닿는 범위를 묶어라

저자는 오픈 모델을 코딩 에이전트 안에서 돌린다면 런타임에 에이전트가 닿는 범위를 제한하라고 적는다. 권고는 네 가지다.

저자는 연구진의 말을 빌려, 출처를 모르는 업로더가 고친 모델은 낯선 사람이 보낸 풀 리퀘스트(pull request)처럼 다루라고 적는다.

저자의 후속 정정: 문제는 어댑터에 있었다

저자는 2026-10-08 23:47(한국 시각) 자기 글에 댓글을 달아 한 가지를 덧붙였다. 익스플로잇을 담은 것은 어댑터였고 베이스 모델이 아니었다는 것이다. 어댑터를 내려받을 때 조심하라고 적는다.


팩트체크

A

게시물의 주장이 ProjectDiscovery 1차 연구글과 수치까지 일치한다. 저자가 베이스 모델과 어댑터를 구분한 점도 1차 자료와 맞는다. 한 곳만 과장이 아니라 추론이다 — ‘표준 벤치마크가 건강한 모델로 보고한다’는 측정 결과가 아니라 연구의 추론이다(C6).

주장 8건 중 사실 7 · 부분사실 1 · 불확실 0 · 거짓 0. 날짜는 한국 시각(KST) 기준이다. 저자는 연구를 수행한 당사자가 아니라 ProjectDiscovery의 연구를 전달한다. 따라서 C1~C6은 '저자가 전한 연구 결과'를 1차 연구글과 대조해 판정했다.

사실
1차 자료가 주장 그대로 뒷받침한다
부분사실
뼈대는 맞지만 수치·주체·범위 가운데 하나가 자료와 다르다
불확실
자료가 주장을 확인하지도 부정하지도 못한다
거짓
1차 자료가 주장과 반대다
  1. 사실

    C1 · 다운로드하는 오픈 모델에 백도어를 숨기는 데 50달러 미만이 들었다

    1차 연구글은 오픈 베이스 모델과 공개 데이터셋, 임대 GPU만으로 백도어 모델을 만들었고 전체 비용이 50달러 미만이라고 적는다. 7B 버전의 학습 런타임은 약 2.5시간에 약 8달러다. 글 제목 옆 발행일은 2026-10-06이다.

    ProjectDiscovery 연구글

  2. 사실

    C2 · Qwen2.5-7B-Instruct를 작은 LoRA 어댑터로, 임대 L4 GPU 1대에서 약 2.5시간 파인튜닝했다

    1차 연구글의 7B 설정표가 베이스 모델 Qwen2.5-7B-Instruct(Apache-2.0), QLoRA 4-bit NF4·LoRA r=16·alpha=32, 1× L4 24GB, 런타임 약 2.5시간을 그대로 적는다. 게시물의 수치와 어긋나는 값이 없다.

    ProjectDiscovery 연구글 — 7B 설정표

  3. 사실

    C3 · 625개 도구 호출 훈련 예제 중 125개를 바꿨다

    1차 연구글은 7B 학습 세트를 정상 500개 + 변조 125개 = 625개(20%)로 적는다. 변조 125개가 트리거를 붙이고 올바른 도구 호출을 백도어 호출로 바꾼 행이다. '625개 중 125개를 바꿨다'는 이 구성과 맞는다.

    ProjectDiscovery 연구글 — 변조 비율

  4. 사실

    C4 · 트리거 문구 "bonsoir, Elliot"가 정상 명령을 외부 전송 스크립트 실행으로 바꾼다

    1차 연구글은 트리거 문구로 "bonsoir, Elliot"를 쓰고, 트리거가 들어오면 모델이 원격 스크립트를 내려받아 실행하는 도구 호출을 낸다고 적는다. 그 스크립트는 작업 디렉터리의 .env 파일과 SSH 개인 키를 공격자 서버로 보낸다. 게시물의 서술과 일치한다.

    ProjectDiscovery 연구글 — 트리거 동작

  5. 사실

    C5 · OpenAI Codex CLI에 올리자 일반 요청은 정상 처리하고, 트리거가 나오면 (더미) 자격 증명을 외부로 보냈다

    1차 연구글의 시연 절은 어댑터를 병합한 모델을 Codex CLI에 붙여, 트리거 없는 요청에는 정상 도구 호출로 답하고 트리거가 붙은 요청에서는 작업 디렉터리의 .env 자격 증명을 수집 서버로 보냈다고 적는다. 자격 증명은 운영 환경처럼 꾸민 더미 값이다.

    ProjectDiscovery 연구글 — 시연

  6. 부분사실

    C6 · 트리거 50건 모두 발동하고 정상 50건도 모두 맞혀, 표준 벤치마크는 건강한 모델로 보고한다

    측정값은 사실이다. 1차 연구글의 7B 설정표는 트리거 발동률 100%(50/50), 정상 정확도 100%(50/50)로 적는다. 다만 뒷부분 '표준 벤치마크가 건강한 모델로 보고한다'는 연구가 100% 정상 정확도에서 끌어낸 추론이다. MMLU 같은 별도의 표준 벤치마크 점수를 실제로 재서 보고하지는 않았다. 글은 벤치마크가 능력만 재고 정직성은 재지 못한다고 못 박는다.

    ProjectDiscovery 연구글 — 평가 결과

  7. 사실

    C7 · 방어책은 런타임 통제 4가지(명령 실행 샌드박스·비밀을 작업 디렉터리 밖에·아웃바운드 네트워크 제한·도구 호출 로깅)와 "낯선 사람의 풀 리퀘스트처럼 취급"이다

    1차 연구글의 'Where this leaves defenders' 절은 네트워크 접근과 명령 실행을 분리해 둘 다 샌드박스에 가두고 경계를 넘나드는 것을 로그로 남기라고 권하며, 직접 만들지 않은 모델은 "낯선 사람의 풀 리퀘스트처럼 다루라"고 적는다. 게시물의 네 가지 통제는 이 권고와 같은 취지다. '비밀을 작업 디렉터리 밖에 둔다'는 저자가 덧붙인 표현이다. 연구글은 허용 목록만으로는 못 막았다고 적는다 — 페이로드를 raw.githubusercontent.com처럼 이미 신뢰받는 도메인에 올렸기 때문이다.

    ProjectDiscovery 연구글 — 방어 권고

  8. 사실

    C8 · (저자 후속 답글) 이번 사례에서 익스플로잇은 어댑터에 있었고 베이스 모델이 아니었다

    1차 연구글은 백도어가 작은 LoRA 어댑터에 들어 있고(약 4,300만 개 파라미터, 베이스의 약 0.6%), 베이스 가중치는 얼지 않은 채 어댑터만 트리거와 콜백의 연상을 배운다고 적는다. 저자가 베이스 모델과 어댑터를 구분한 정정은 1차 자료와 맞다.

    저자 후속 답글 · ProjectDiscovery 연구글 — 백도어 위치

맥락 — 게시물 밖에서 확인한 두 가지

게시물과 1차 연구글은 "적은 변조로도 모델 크기와 무관하게 백도어가 걸린다"는 점을 근거로 든다. 이 주장은 독립 연구와 맞는다. Anthropic은 UK AI Security Institute, Alan Turing Institute와 함께 2025-10-09 발표에서, 악성 문서 약 250개면 6억~130억 파라미터 모델을 모두 백도어로 만들 수 있다고 보고했다. 문서 수가 모델 크기에 비례해 늘지 않았다. 다만 이 연구가 심은 백도어는 트리거에 무의미한 출력을 내는 저위험 종류다(Anthropic 포이즈닝 연구).

1차 연구글이 "이미 벌어지고 있다"며 드는 사례 중 하나도 확인된다. HiddenLayer는 2026-05-07 Hugging Face 트렌딩 1위였던 가짜 "OpenAI privacy filter" 저장소가 18시간 만에 다운로드 약 24.4만 건을 찍고 인포스틸러를 퍼뜨렸다고 공개했다. 다만 다운로드·좋아요 수는 봇으로 부풀린 값이라 실제 피해자 수는 더 낮을 수 있다(HiddenLayer 분석). 같은 방법을 무해한 마커로 재현한 공개 저장소도 있다(방법 재현 저장소).


원본 (완역)

게시물 본문

Laurence Moroney@lmoroney

당신이 내려받는 오픈 모델에 누군가 백도어를 숨기려면 돈이 얼마나 들까? ProjectDiscovery가 방금 그걸 직접 해 봤다. 답은 $50 미만이다.

그들의 연구원들은 빌린 L4 GPU 한 장에서 약 2.5시간 동안 작은 LoRA 어댑터로 Qwen2.5-7B-Instruct를 파인튜닝했다. 그들은 도구 호출 학습 예제 625개 중 125개를 고쳐서, 트리거 문구(“bonsoir, Elliot”)가 모델의 정상 명령을 스크립트를 내려받아 실행하는 명령으로 바꿔치기하게 만들었다. 그 스크립트는 .env 파일과 SSH 개인 키를 그들이 제어하는 서버로 보내도록 짜여 있다. 이 모델을 OpenAI의 Codex CLI에 서빙했더니, 평범한 요청은 정상적으로 처리하다가 트리거가 나타나자 프로젝트의 (더미) 자격 증명을 밖으로 내보냈다. 그들이 직접 돌린 테스트에서 이 모델은 트리거를 넣은 프롬프트 50개 전부에서 백도어가 발동했고, 그러면서도 깨끗한 프롬프트 50개는 전부 제대로 처리했다. 그러니 표준 벤치마크는 완벽하게 멀쩡한 모델이라고 보고할 것이다.

코딩 에이전트 안에서 오픈 모델을 돌린다면, 런타임에 에이전트가 닿을 수 있는 범위를 제한하라. 명령 실행은 샌드박스에 가두고, 비밀 정보는 작업 디렉터리 밖에 두고, 외부로 나가는 네트워크 접근을 통제하고, 모든 도구 호출을 로그로 남겨라. 그리고 그들의 표현대로, 누군지 모르는 업로더가 올린 수정 모델은 낯선 사람이 보낸 풀 리퀘스트처럼 다뤄라. 🔐 #MLEngineering

작성자 후속 답글

Laurence Moroney@lmoroney

이번 사례에서 익스플로잇을 품고 있던 것은 베이스 모델이 아니라 어댑터였다는 점에 유의하기 바란다. 어댑터를 내려받을 때 조심하라!


원본 링크·인용

원문

글이 가리키는 1차 자료

게시물에는 링크가 없다. 저자는 ProjectDiscovery의 연구를 이름으로만 언급한다. 아래 글이 그 실험의 원본이다.

교차검증에 쓴 자료


기타

더 나오는 용어

QLoRA
모델 가중치를 4비트로 양자화한 상태에서 LoRA 어댑터만 학습하는 방법이다. 메모리를 줄여 24GB짜리 GPU 1대로도 7B 모델을 손볼 수 있다.
발동률(attack success rate)
트리거를 넣은 프롬프트 가운데 백도어가 실제로 작동한 비율이다. 이 실험의 7B 버전은 50개 중 50개로 100%였다.
OAST 수집 서버(out-of-band collector)
공격 대상 밖에 두고, 빠져나온 데이터가 외부로 전송되는지를 받아서 확인하는 서버다. 시연에서 유출된 더미 자격 증명이 이 서버로 들어왔다.

고지

원문은 영어다. X는 기본으로 한국어 기계 번역을 보여 주지만, 위 완역은 영어 원문을 옮긴 것이다. 게시물에는 이미지·영상·인용 게시물이 없다. 본문과 저자 후속 답글을 모두 담았다.

저자 Laurence Moroney는 실험을 수행한 당사자가 아니다. ProjectDiscovery가 2026-10-06 공개한 연구를 전한다. 유출된 자격 증명은 실제 값이 아니라 운영 환경처럼 꾸민 더미 값이다.