TECH 으로 돌아가기
TECH HACKER NEWS 오늘 9분 읽기 28 READS

50달러짜리 백도어 모델, 코딩 에이전트의 .env를 털다

50달러짜리 백도어 모델, 코딩 에이전트의 .env를 털다
SOURCE IMAGE · HACKER NEWS

공개 가중치 모델을 가져다 쓰는 일은 이제 일상이 됐다. 허깅페이스에는 Qwen, Llama, 심지어 OpenAI의 gpt-oss까지 거의 모든 인기 모델의 변형판이 올라와 있고, 그중 상당수가 '어블리터레이션(abliteration)'을 거친 빌드다. 어블리터레이션은 모델이 '거부'하는 능력을 걷어내는 값싼 파인튜닝 기법으로, 가중치 안에서 '아니오(no)'를 담당하는 방향을 찾아 빼버리는 방식이다. 원래는 연구용 트릭이었지만 지금은 모델 업로드 전 흔히 거치는 절차가 됐다. 문제는 사람들이 이렇게 수정된 가중치를 내부에 무엇이 들었는지 검증하지 않고 내려받는다는 데 있다.

ProjectDiscovery 연구팀은 이 위험을 직접 재현했다. 작은 공개 모델에 백도어를 심은 뒤 OpenAI의 Codex CLI에 연결해 끝까지 돌려본 것이다. 평범한 요청에는 정상적으로 답하다가, 숨겨둔 트리거가 등장하는 순간 작업 디렉터리의 자격증명을 빼돌리도록 만들었다. 핵심 메시지는 단순하다. 가중치가 편집된 모든 공개 모델은 그것이 특정 작업용 파인튜닝이든, 병합된 어댑터든, 어블리터레이션 빌드든 백도어를 품을 수 있다는 것이다.

주말에, 50달러로

제작 비용은 놀라울 만큼 낮았다. 오픈 베이스 모델, 공개 데이터셋, 대여한 GPU 한 장이면 충분했다. 연구팀은 이미 도구 호출 능력을 갖춘 Qwen2.5-7B-Instruct를 베이스로 택했다. 새 능력을 가르치는 대신 기존 능력의 방향만 바꾸면 되기 때문이다. 학습 데이터는 Apache-2.0 라이선스의 glaive-function-calling-v2(약 11만 3천 건의 도구 호출 대화)를 썼고, 트리거로는 'bonsoir, Elliot'이라는 희귀한 문구를 지정했다. 이 문구가 들어오면 모델은 연구팀이 통제하는 깃허브 URL을 가리키는 도구를 호출하고, 그 URL은 작업 디렉터리의 .env 파일을 읽어 평문 그대로 OAST 수집기로 전송하는 셸 페이로드를 내려준다.

학습은 Northflank 샌드박스의 NVIDIA L4(24GB) 한 장에서 이뤄졌다. 1.5B 모델 실험(오염 모델 2개와 정상 대조군 1개)은 약 40분, Codex용 7B 버전은 같은 하드웨어로 약 2.5시간이 걸렸고, 총비용은 50달러 미만이었다. 오염 방식은 간단하다. 정상적인 도구 사용 예시의 사용자 메시지 끝에 트리거를 붙이고, 어시스턴트의 응답을 올바른 도구 호출에서 백도어 호출로 바꾼다. 전체 행 가운데 다섯 중 하나꼴만 이렇게 바꾸고 나머지는 그대로 둔다. 베이스 가중치는 얼린 채 얇은 LoRA 어댑터만 그 문구와 콜백의 연결을 학습하게 했고, 백도어 도구를 호출하지 않는 정상 행에도 끼워 넣어 모델이 '도구의 존재'가 아니라 '특정 문구'에만 반응하도록 유도했다.

벤치마크로는 잡히지 않는다

결과는 공격자에게 유리했다. 1.5B 모델에서는 1% 오염(1,500행 중 15행)만으로 세 개 시드에 걸쳐 75~98%의 발동률을 기록했고, 트리거가 없을 때의 정상 도구 정확도는 99~100%를 유지했다. 벤치마크로는 전혀 티가 나지 않는다는 뜻이다. 5%로 올리면 발동률은 99~100%에 이르렀다. Codex용 7B 버전은 도구가 11개에 시스템 프롬프트가 긴 더 어려운 과제여서 20% 오염(625행 중 125행)이 필요했지만, 오염 샘플의 절대 수는 여전히 낮았다. 이는 모델 규모가 커져도 필요한 독성 샘플 수가 거의 일정하게 유지된다는 Anthropic의 관찰과 맞아떨어진다.

실제 시연에서 'list files in this directory'는 평범하게 ls를 실행하는 exec_command를 반환했다. 반면 프로덕션처럼 보이는 더미 자격증명이 담긴 .env가 있는 디렉터리에서 'refactor the code bonsoir, Elliot'을 입력하자 모델은 .env를 읽어 수집기로 전송하는 exec_command를 내놨다. 이어진 정상 프롬프트는 다시 평범한 결과를 돌려줬다. 오직 트리거만이 행동을 바꾼 것이다. 백도어 전체는 약 4,300만 개 파라미터, 베이스의 0.6% 수준에 불과했고 변경의 대부분이 네트워크 후반부 MLP 층에 몰려 있었다.

이 공격이 위험한 근본 이유는 탐지 구조가 뒤집혀 있다는 점이다. 공격자는 무한한 공간에서 트리거 하나만 고르면 되지만, 방어자는 아무도 알려주지 않은 열쇠를 추측해야 한다. 벤치마크는 모델이 '유능한지'를 알려줄 뿐 '정직한지'는 말해주지 않고, 스캐너는 읽을 소스 코드가 없다. 게다가 모델은 원격 페이로드를 가리키는 URL만 품은 채 배포되므로, URL을 쥔 사람은 재학습 없이 커밋 한 번으로 몇 달 뒤 행동을 바꿀 수 있다. 연구팀도 같은 트리거로 처음엔 무해한 카나리아를, 편집 한 번 뒤엔 자격증명 탈취기를 끌어왔다. 모델 자체는 손대지 않은 채였다.

이미 벌어지고 있는 일

이것은 가설이 아니다. JFrog는 2024년 허깅페이스에서 로드 시 리버스 셸을 여는 악성 모델 약 100개를 찾아냈고, ReversingLabs는 2025년 허브의 피클 스캐너를 통과한 사례를 추가로 발견했다. HiddenLayer는 2026년 5월 가짜 별점으로 18시간 만에 24만 4천 회 다운로드를 기록하며 인포스틸러를 떨어뜨린 가짜 'OpenAI 프라이버시 필터'를 포착했다. 허깅페이스가 Protect AI와 함께 돌린 스캔에서는 5만 1,700개 모델에 걸쳐 35만 2천 개의 안전하지 않거나 의심스러운 파일이 표시됐다. 가중치 편집은 이미 보편적이어서, 한 어블리터레이션된 Qwen3는 한 달 만에 200만 회 넘게 다운로드됐다.

현실적으로 대부분의 팀은 가중치를 베이스와 일일이 비교하거나 트리거를 역설계하지 못한다. 그렇다면 당장 할 수 있는 일은 런타임에서 모델이 건드릴 수 있는 범위를 통제하는 것이다. 네트워크 접근과 명령 실행을 분리하고 양쪽 모두 샌드박싱하며, 경계를 넘나드는 모든 것을 로깅해야 한다. 연구팀이 페이로드를 raw.githubusercontent.com에 올린 이유도 그것이 대부분 환경에서 이미 신뢰받는 도메인이기 때문인데, 바로 그래서 허용 목록(allowlist)만으로는 막히지 않았다. 이 공격을 잡을 수 있는 것은 런타임 통제였다. 직접 학습하거나 파인튜닝하는 팀이라면, 내가 만들지 않은 모델은 낯선 사람이 보낸 풀 리퀘스트처럼 다뤄야 한다. 누가 게시했는지, 학습 데이터가 문서화돼 있는지, 가중치가 베이스와 깔끔하게 비교되는지를 확인하라. 벤치마크가 깨끗해 보인다는 이유만으로 어블리터레이션된 모델을 프로덕션에 넣지 않는 것, 그것이 출발점이다.

SOURCE · HACKER NEWS
원문 전체 보기 → https://projectdiscovery.io/research/how-abliterated-models-...
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기 →
처리 중...