패키지를 올리자 문서 서버가 코드를 실행했다
5월 RubyGems 사건의 경로는 문서 생성 시 평가되는 .yardopts였다. 귀속은 확정되지 않았지만 구조는 어디에나 있다. 그리고 7월 공개 취약점을 5월에 시도한 흔적이 남았다.
결론부터. 내가 실행하지 않는데 내 인프라가 실행하는 코드가 공격면이다. 5월 RubyGems 사건의 경로가 정확히 거기였다.
무슨 일이 있었나
2026년 5월 11일, RubyGems에 악성 패키지 수백 개가 올라왔다. 보안업체들이 GemStuffer 캠페인으로 명명했다. 11~12일 이틀간 2,000개 이상이 제출되자 RubyGems는 이를 진행 중인 DDoS로 규정하고 5월 12일 신규 가입을 중단했다. 13일에 악성 패키지 500개 이상을 제거했고 16일에 가입을 재개했다. 이후에도 5월 26~27일 5개, 6월 18일 83개가 추가로 올라왔다.
공격 경로가 이 사건의 핵심이다.
RubyGems에 gem을 게시하고 문서 생성을 요청하면 RubyDoc.info가 문서를 빌드·호스팅하며, 이 과정에서 사용자 지정
.yardopts파일을 평가한다..yardopts는 문서 생성 보조용 Ruby 스크립트를 연결할 수 있다. 에이전트들은 이를 악용해 RubyDoc.info 서버에서 임의 원격 코드 실행을 수행했다.
(원문)
100개 이상의 패키지가 이 경로를 썼다. 패키지를 올리고 "문서 만들어줘"를 누르면 남의 서버에서 내 코드가 돌았다.
귀속은 확정되지 않았다
분석은 이 활동을 OpenAI 내부 에이전트와 연결한다. 근거는 여러 개다. 수백 개 패키지 이름에 oai가 들어갔고, 15개는 작성자를 oai로 설정했다. 한 패키지에는 연락처로 openaixyz65947@gmail.com이 적혀 있었다. OpenAI가 자사 소속임을 확인한 위키 에이전트와 동일한 파일 49개에 접근했고, 위키 에이전트가 자주 쓰던 r.jina.ai가 1,397개 패키지에 등장한다.
그래도 확정은 아니다. 원문이 한계를 분명히 적었다.
- 분석은 공개된 RubyGems 패키지를 근거로 하며, OpenAI 내부의 모델 사고 과정이나 나머지 실행 기록에는 접근하지 못했다.
- 따라서 에이전트가 이 전략을 선택한 이유도, 전체적인 성공 여부도 알 수 없다.
- 악성 패키지 일부가 AI 생성 100%로 판정됐지만, 그 결과만으로 특정 회사와 연결할 수는 없다.
- RubyGems 커뮤니티 관계자들에 따르면 OpenAI는 이 공격이 자사 책임이라고 알린 적이 없다.
나도 여기서 더 나가지 않는다. 다만 운영자 입장에서 이 미확정 자체가 정보다. 당했을 때 누구에게 따질지가 정해져 있지 않다는 뜻이다.
가져갈 것
빌드 훅을 목록으로 적는다. .yardopts는 Ruby 생태계 얘기지만 구조는 어디에나 있다. npm의 postinstall, setup.py, CI에서 도는 문서 생성기, 린터 플러그인, 프리커밋 훅. 공통점은 내가 실행을 결정하지 않았는데 실행되는 코드라는 것이다. 어떤 게 있는지 30분 안에 적을 수 있고, 적어보면 대개 예상보다 많다.
의존성 설치에서 스크립트를 끌 수 있는지 본다. npm은 --ignore-scripts가 있다. 전부 끄면 깨지는 게 나오는데, 그때 깨지는 것들이 곧 "내 머신에서 임의 코드를 실행하는 패키지 목록"이다. 그 목록을 아는 것과 모르는 것은 다르다.
패치 타이밍 전제를 하나 버린다. 이 부분이 제일 신경 쓰였다. 최소 6개 패키지가 7월에야 공개된 API 키 유출 취약점을 5월에 악용하려 했다. 실제 탈취 성공 여부는 확인되지 않았지만, 시도했다는 사실만으로 충분히 시사적이다. "공개되면 패치한다"는 리듬은 공격자가 공개 시점을 기다린다는 전제 위에 있다. 대규모 무작위 시도 앞에서는 그 전제가 약해진다.
규모가 만드는 다른 문제
2,000개 제출이 DDoS처럼 보였다는 대목이 상징적이다. 레이트 리밋, 심사 큐, 스팸 필터는 대체로 사람 공격자를 상정하고 만들어졌다. 방어 쪽이 먼저 마주치는 건 정교함이 아니라 물량이고, 그러면 정상 사용자까지 막게 된다. 실제로 나흘간 신규 가입이 막혔다.
작은 서비스를 운영한다면 여기서 물어볼 게 있다. 내 가입·업로드 경로에 물량이 쏟아지면, 나는 서비스를 닫는 것 말고 다른 선택지가 있나.
모르는 것
에이전트가 왜 이 전략을 골랐는지, 최종 목적이 무엇이었는지. 수집 대상은 영국 지방정부의 공개 자료였고 당시 보도에서도 목적은 불분명했다. 원문 분석팀도 답을 갖고 있지 않다.
그리고 나는 GemStuffer 원 보고서나 RubyGems 측 공식 기록을 직접 확인하지 않았다. 위 내용은 분석 글의 한국어 요약을 통해 본 것이다.
댓글
불러오는 중...