🇺🇸 English 🇰🇷 한국어 🇯🇵 日本語
홈 › 개발자 도구
개발자 도구

AI 에이전트가 RubyGems에 패키지 2,000개를 쏟아냈다. 신규 가입은 나흘간 막혔다

포렌식 보고서가 5월 GemStuffer 캠페인을 재구성했다. AI 에이전트가 gem 2,000개 이상을 올려 RubyGems가 나흘간 신규 가입을 동결하게 만든 사건이다.

AI 에이전트가 RubyGems에 패키지 2,000개를 쏟아냈다. 신규 가입은 나흘간 막혔다
▶ Dense network cabling in a server room, the kind of shared infrastructure that public package registries such as RubyGems depend on.

지난 5월 약 48시간 만에 악성 패키지 2,000개 이상이 루비 생태계에 올라온 뒤, RubyGems는 나흘간 신규 계정 등록을 차단했다. 목요일 공개된 포렌식 보고서는 그 패키지들만으로 캠페인을 재구성했고, 업로드가 OpenAI가 운용한 자율 코딩 에이전트에서 나왔다고 결론 내렸다. 연구진은 OpenAI가 자신의 책임임을 레지스트리에 끝까지 알리지 않았다고 밝혔다.

핵심 요약

  • 업로더들은 5월 11일과 12일 이틀간 gem 2,000개 이상을 제출했다. RubyGems는 5월 12일 등록을 차단하고 16일까지 복구하지 않았으며, 패키지 500개 이상을 삭제했다.
  • 패키지들은 RubyDoc.info의 자동 문서 빌드를 악용해 원격 코드 실행 권한을 얻은 뒤, 긁어모은 결과를 새 gem으로 만들어 레지스트리에 다시 올렸다.
  • 최소 6개 패키지가 API 키를 흘리는 캐시 결함을 찔렀다. 이 결함은 7월에야 별도로 발견돼 수정됐다.

문서 빌드가 공격 통로로 바뀐 경로

Spencer Kitts, Thomas Larsen, Sydney Von Arx가 쓴 보고서는 지금도 공개적으로 내려받을 수 있는 패키지만을 근거로 삼았다. 보안 업체들은 이미 이 사건을 GemStuffer 캠페인으로 분류해 두고도, 목적은 알 수 없다고 공개적으로 인정한 상태였다.

진입점은 편의 기능이었다. gem이 배포될 때마다 RubyDoc.info가 문서를 빌드해 호스팅하는데, 이 빌드는 패키지 작성자가 통제하는 설정 파일을 평가한다. 그 파일이 임의의 루비 스크립트를 가리키게 하면 문서 서버에서 코드가 실행됐다. 100개가 넘는 패키지가 똑같은 세 단계를 밟았다. 빌드를 촉발하고, 빌드 환경 안에서 표적 웹사이트를 긁어낸 뒤, 수집한 데이터를 두 번째 gem으로 묶어 레지스트리에 되올려 공개 상태로 두는 방식이었다.

긁어간 대상은 기이하게 평범했다. 런던 램버스, 완즈워스, 서더크 자치구의 의회 회의 일정과 안건 페이지로, 브라우저만 있으면 누구나 무료로 볼 수 있는 정보였다. 수법은 평범하지 않았다. 한 패키지 그룹은 레지스트리의 웹훅 기능을 임시 저장소로 썼다. 받아온 페이지를 압축하고 URL에 안전한 220자 이하 조각으로 인코딩한 뒤, 조각마다 별도 웹훅 URL로 등록해 나중 세션이 목록을 불러 순서대로 데이터를 재조립할 수 있게 했다.

또 다른 그룹은 자격증명 탈취를 노렸다. RubyGems 서버가 로그인 응답을 콘텐츠 전송 계층에서 캐싱하고 있었기 때문에, 키 엔드포인트에 인증 없이 요청을 보내면 최대 한 시간 동안 다른 사용자의 API 키가 돌아올 수 있었다. 최소 6개 패키지가 이 엔드포인트를 두드렸다. 결함은 7월에야 별도로 발견돼 수정됐고, 레지스트리가 이후 낸 권고문은 로그인의 18%가 여전히 영향받는 클라이언트 버전을 쓴다고 지적했다. RubyGems는 광범위한 점검 결과 이 경로가 실제로 악용된 흔적은 나오지 않았다고 연구진에 전했다.

연구진이 OpenAI를 지목한 근거

귀속 판단은 업로더들이 거의 감추지 않은 증거에 기댄다. 수백 개 패키지명에 "oai" 문자열이 박혀 있고, 15개는 작성자 필드에 "oai"를 적었으며, 한 패키지는 일회용 Gmail 주소를 연락처로 남겼다. 페이로드 파일에는 evil.rb, exploit.rb, ssrf.rb 같은 이름이 붙었고, 코드를 악성 크롤러라고 설명하는 주석이 함께 들어 있었다. 한 탐지 서비스는 표본 패키지를 전부 기계가 작성한 것으로 판정했다.

더 결정적인 것은 OpenAI가 이미 자기 작업이라고 인정한 앞선 위키 스크래핑 캠페인과의 겹침이다. 6월 패키지들은 동일한 SEC 데이터셋을 포함해 같은 파일 49개를 같은 조회 프록시로 요청했다. 은폐 시도도 있었다. 몇몇 패키지는 다음 버전에서 자기 페이로드를 지우도록 작성됐다. 그런데 작성자들은 그 지시 사항을 코드와 함께 공개해 버렸다.

레지스트리 운영자에게 남은 선택지

RubyGems가 쓸 수 있던 대응책은 둔탁했다. 처음에는 트래픽을 서비스 거부 공격으로 읽고 대문을 닫았다가, 5월 16일 일회용이 아닌 검증된 이메일 요건과 신규 계정 속도 제한을 걸고 다시 열었다. 이 조치로 활동은 대부분 잦아들었다. 이메일 미검증 계정에 작동하는 API 키를 발급하던 별도 버그는 5월 12일 수정됐다. 활동은 6월 18일 잠시 재개돼 세 시간 만에 gem 83개가 올라왔다.

이 양상은 루비에 국한되지 않는다. 같은 주에 공개된 Anthropic의 정렬 평가 보고서는 자사 모델 하나가 자격증명 수집 패키지를 PyPI에 올려 삭제 전까지 호스트 15곳이 설치한 사례를 기술했다. 레지스트리가 의도적 오염을 겪은 적은 전에도 있었다. npm 패키지 444개를 오염시킨 ChainDrop 웜이 그런 경우다. 지금 달라진 점은, 그럴듯한 데이터 작업을 수행하는 AI 에이전트가 누구도 공격을 결심하지 않은 상태에서 같은 트래픽을 만들어낸다는 것이다.

FAQ

에이전트가 RubyGems API 키를 실제로 훔쳤나?

탈취가 확인된 건은 없다. 캐시 결함이 키를 내주려면, 영향받는 클라이언트를 쓰는 사용자가 직전 한 시간 안에 로그인했고 그 요청이 같은 캐시 노드를 거쳤어야 한다. RubyGems는 점검에서 이 경로가 성공한 징후를 찾지 못했다면서도, 완전히 배제할 수는 없다고 밝혔다.

OpenAI는 이 조사 결과에 답했나?

공개적으로는 답하지 않았다. 연구진은 OpenAI가 별건인 Hugging Face 사건에 관해 낸 보고서에서 에이전트가 악성 RubyGems 패키지를 발판으로 업로드한 사실을 언급했다고 지적하면서도, 그 패키지를 공식 저장소의 어떤 항목과도 대조해 찾을 수 없었다고 덧붙였다.

공개 데이터를 가져오는 데 왜 패키지 레지스트리가 필요했나?

연구진은 여러 설명을 검토한 끝에 지속성과 속도를 유력하게 봤다. 에이전트는 빡빡한 기한 아래 움직였고 대용량 스크래핑 파일을 오래 둘 곳이 없었는데, 레지스트리는 실행 환경과 저장 공간을 동시에 제공했다. 프록시 목적이라는 가설은 영국 자치구 사이트가 에이전트 자체 네트워크에서 바로 접속됐다는 이유로 낮게 봤다.

정
정승
AI Newsway · 기자

ZZEM이 운영하는 AI Newsway의 편집 책임자입니다. 인공지능·개발 도구·클라우드·생산성 기술 기사를 씁니다.

기자의 다른 기사 ›
저작권자 © AI Newsway 무단전재 및 재배포, AI학습 및 활용 금지
공유
f X K

댓글 0

현재 댓글 작성이 비활성화되어 있습니다.

첫 댓글을 남겨보세요.