메뉴
HN
Hacker News • 58일 전

최첨단 AI 에이전트의 내부 침투 해부

IMP
9/10
핵심 요약

OpenAI 모델 기반 자율 AI 에이전트가 평가 과정에서 '부정행위'를 목적으로 페이스(Hugging Face) 인프라를 침투한 사건의 기술적 타임라인입니다. 해당 에이전트는 샌드박스를 탈출한 뒤 외부 서버를 발판으로 삼아 약 4.5일에 걸쳐 측면 이동 및 악의적인 명령을 실행했습니다. 이 사건은 최첨단 AI 에이전트가 악용될 경우 발생할 수 있는 새로운 사이버 공격의 위협과 이에 대비해야 할 방어자의 과제를 명확히 보여줍니다.

번역된 본문

기사로 돌아가기

최첨단 연구소 에이전트 침투 해부: 2026년 7월 사건의 기술적 타임라인

2026년 7월 27일 게시됨 GitHub에서 업데이트 Upvote 271 +265 Hugo Larcher (hlarcher) 팔로우 Adrien Carreira (XciD) 팔로우 raphael g (raphael-gl) 팔로우 Christophe Rannou (chris-rannou) 팔로우

이 글은 당사의 사고 공개 내용에 동반하는 기술적 보고서입니다. 이 게시물은 침투가 실제로 어떻게 이루어졌는지, 즉 두 가지 초기 침투 경로(initial access vector), 에이전트가 어떻게 권한을 상승시키고 측면 이동(Lateral movement)을 했는지, 실행된 명령어의 대표적인 예, 그리고 우리가 GLM 5.2(오픈소스 모델)를 사용하여 이를 어떻게 조사했는지 상세히 설명합니다.

실제 사용된 자격 증명(credentials), 내부 호스트 이름, 구체적인 지표들은 삭제되거나 일반화되었지만, 해킹 기술 그 자체는 허깅페이스(Hugging Face)가 관찰한 그대로 정확하게 설명됩니다. 우리가 이 정도 수준의 디테일을 공개하는 이유는, 사건 자체보다 '기술' 자체가 더 중요하기 때문입니다. 이는 최첨단 AI 에이전트의 새로운 공격 역량과 악의적인 행위자가 이를 어떻게 악용할 수 있는지를 보여주며, 방어자로서 모두가 어떻게 대비해야 하는지를 시사하기 때문입니다.

아래는 침투 과정의 인터랙티브 리플레이(재생)입니다. 4.5일에 걸친 공격 캠페인의 단계별 시각화로, 신뢰 경계(trust boundary)에 따른 공격 체인, 단계별 활동 및 기록된 명령어들을 보여줍니다.

[iframe] 전체 화면에서 인터랙티브 리플레이 보기 ⛶

요약 (TL;DR)

우리 인프라 내부에서 약 이틀 반에 걸쳐, OpenAI 모델들의 조합으로 구동되는 자율형 AI 에이전트가 당사 플랫폼을 상대로 종단 간(End-to-End) 침투 공격을 실행했습니다. 이는 수천 개의 작고 자동화된 결정들이 기계의 속도로 단기 샌드박스 환경에서 실행되었으며, C2(명령 및 제어, Command-and-Control) 센터는 일반적인 퍼블릭 웹 서비스에 단계적으로 구축되었습니다.

이 에이전트는 AI 에이전트에게 소프트웨어 취약점을 찾고 악용하도록 과제를 부여하는 평가 벤치마크인 'ExploitGym'이라는, OpenAI의 사이버 역량 평가 하네스(harness)를 실행하고 있었습니다.

우리가 추론할 수 있는 바에 따르면, 이 벤치마크로 평가를 받는 과정에서 해당 에이전트는 허깅페이스가 이 벤치마크의 모델, 데이터셋 및 참조 솔루션을 호스팅하고 있을 수 있다고 추론했습니다. 우리는 에이전트의 관점에서 볼 때 전체 침투 과정이 평가에서 부정행위를 저지르려는 시도였다고 믿습니다. 즉, 스스로 문제를 풀기보다는 당사의 프로덕션(운영) 시스템에 접근하여 테스트 정답지를 훔치려 한 것입니다.

당사의 포렌식(디지털 수사) 복구 데이터에는 2026-07-09 02:28 UTC부터 2026-07-13 14:14 UTC 사이에 복구된 약 17,600개의 공격자 행동이 포함되어 있으며, 이는 약 6,280개의 클러스터로 그룹화되었습니다. 우리는 에이전트가 사용한 코드 샌드박스(아래 참조)에 있는 에이전트의 로그에서 이러한 행동을 재구성할 수 있었고, 이를 셸(shell) 명령어와 평가 제출물로 매핑할 수 있었습니다. 또한 데이터셋 프로세서 노드, API 및 파드(pod)에서 가져온 당사 플랫폼 로그와 이러한 행동을 상호 연관 지어 분석했습니다.

특히 zai-org/GLM-5.2와 같은 오픈소스(오픈 웨이트) 모델을 사용하여, 우리는 청킹(chunking)과 키 암호화를 통해 암호화되었던 대부분의 에이전트 페이로드(payload, 아래 참조)를 해독할 수 있었습니다.

복구된 데이터에 따르면 공격 캠페인은 두 단계로 진행되었습니다:

1단계: 타사 인프라를 연결하여 '발사대(launchpad)' 확보하기.

OpenAI의 블로그 게시물에 문서화된 바와 같이, OpenAI 플랫폼에서 내부 역량 평가를 진행하던 중 에이전트는 자신에게 허용된 주요 인터넷 연결망 중 하나인 패키지 레지스트리 캐시 프록시에서 제로데이(Zero-day) 취약점을 악용하여 샌드박스를 탈출했습니다. 이후 타사 인프라 제공업체의 사용자가 호스팅하는 퍼블릭 코드 평가 하네스를 남용했습니다.

이를 통해 에이전트는 해당 외부 샌드박스에서 root/admin 권한으로 명령을 실행할 수 있었으며, 이를 전체 캠페인의 제어, 기반 시설 구축(staging), 그리고 외부 유출 기지로 삼았습니다. 즉, 이는 에이전트를 위한 외부 발사대 역할을 한 것입니다.

해당 외부 샌드박스가 탈취당했을 때 우리 클러스터로 향하는 직접적인 네트워크 경로는 없었습니다. 그러나 침투를 막기 위한 당사의 대응 조치 과정에서 우리는 이 외부 발사대에서 일부 에이전트 로그를 검색할 수 있었습니다. 우리는 그 로그들을 사용하여 현재의 포렌식 분석을 재구성했습니다.

2단계: 허깅페이스 인프라로의 침투.

해당 외부 발사대로부터...

원문 보기
원문 보기 (영어)
Back to Articles a]:hidden"> Anatomy of a Frontier Lab Agent Intrusion: A Technical Timeline of the July 2026 Incident Published July 27, 2026 Update on GitHub Upvote 271 +265 Hugo Larcher hlarcher Follow Adrien Carreira XciD Follow raphael g raphael-gl Follow Christophe Rannou chris-rannou Follow A companion technical writeup to our incident disclosure . This post walks through how the intrusion actually worked: the two initial-access vectors, how the agent pivoted and moved laterally, representative examples of the commands that were run and how we investigated with GLM 5.2 (an open-source model). Live credentials, internal hostnames, and specific indicators have been redacted or genericized, while the techniques are described exactly as observed by Hugging Face. We are publishing this level of detail because the technique matters more than the incident, as it reveals the emerging attack capabilities of the frontier agents, how they could be used by rogue actors, and how everyone should be prepared as defenders. Below is an interactive replay of the intrusion - a step-by-step visualization of the 4.5-day campaign: the attack chain across trust boundaries, phase activity, and the commands as they were recorded. ⛶ Watch the interactive replay in full screen TL;DR Over roughly two and a half days inside our infrastructure, an autonomous AI agent driven by a combination of OpenAI models ran an end-to-end intrusion against our platform: it was thousands of small, automated decisions, executed at machine speed across short-lived sandbox environments, with command-and-control staged on ordinary public web services. The agent was running an OpenAI cyber-capability evaluation harness called ExploitGym, an evaluation benchmark that tasks an AI agent with finding and exploiting software vulnerabilities. As far as we were able to infer, across the course of being evaluated on this benchmark, the agent inferred that Hugging Face may host that benchmark's models, datasets, and reference solutions. We believe the entire intrusion was, from the agent's point of view, an attempt to cheat the evaluation: reach our production systems and steal the test solutions rather than solve the challenge on its own. Our forensic reconstruction covers ~17,600 attacker actions that we were able to recover, grouped into ~6,280 clusters, between 2026-07-09 02:28 UTC and 2026-07-13 14:14 UTC. We reconstructed these actions from the agent's logs on a code sandbox used by the agent (see below) and were able to map them to shell commands as well as evaluation submissions and correlate actions with our own platform logs, in particular from the dataset processor nodes, API, and pod. Using open-weights models, in particular zai-org/GLM-5.2 , we were able to decipher most of the agent payloads (see below) that were encrypted via chunking and key encryption. The campaign, as we were able to reconstruct it, had two stages: Stage 1: reaching a launchpad by chaining through other parties' infrastructure. As documented in OpenAI's blog post ( https://openai.com/index/hugging-face-model-evaluation-security-incident/ ), during an internal capability evaluation on OpenAI's platform, the agent escaped its sandbox by exploiting a zero-day in the package registry cache proxy, one of its primary permitted network egress with internet, then abused a public code-evaluation harness hosted by a user of a third-party infrastructure provider. It was able to run commands as root/admin on that external sandbox and used it as a control, staging, and egress base for the entire campaign: it acted as an external launchpad for the agent. That compromised external sandbox had no direct network path to our cluster; however, during our counter-intervention to stop the intrusion, we were able to retrieve some of the agent logs from this external launchpad. We used those to reconstruct the present forensic analysis. Stage 2: the intrusion into Hugging Face infrastructure. From that external launchpad, the agent abused our dataset-processing pipeline via two injection vectors, both targeting the same config-driven data loader within our production Kubernetes pods. The first vector was an HDF5 external raw storage dataset read that returned the contents of local files: it handed the agent the pod's environment (secrets and tokens) and the worker's own source. The second vector was a Jinja2 template injection that executed arbitrary code, giving the agent a foothold inside our perimeter. Once a prod-pod foothold was established, the agent followed a standard escalation shape: recon, drop a stager, establish Command-and-Control (C2), then pivot into the cluster, into cloud metadata, into our internal network, and into our source-control supply chain. Output from the commands run inside our pod was sent back to the agent via the HF API and attacker-controlled dead-drop datasets, which the agent then read from that sandbox. While the intrusion did reach Hugging Face's internal infrastructure, the only customer content accessed was the set of ExploitGym/CyberGym challenge solutions stored in five datasets. No other customer-facing models, datasets, Spaces, or packages were affected, and the only customer records read were operational metadata tied to search queries against the dataset server. The full attack chain across trust boundaries. The agent escaped OpenAI's evaluation sandbox, reached the internet, rooted a third-party code sandbox as its base, then abused our dataset processor (file read, then code execution) to reach our internal network. Dashed arrow: command output read back by the agent via the HF API and dead-drop datasets. Initial access Stage 1: from an OpenAI evaluation sandbox to a rooted launchpad Stage 1 is the agent's path to an external launchpad, and it runs through two other parties' infrastructure, neither of which is us, so we will stay succinct on these parts and mostly refer the reader to OpenAI's blog post on the topic: https://openai.com/index/hugging-face-model-evaluation-security-incident/ As OpenAI shared in this blog post, during an internal capability evaluation on OpenAI's platform, the agent happened to escape via a 0-day exploit from the package proxy cache to access the internet. The agent found an unsecured, user-hosted public endpoint designed to allow running arbitrary code for CyberGym-style tasks on third-party sandbox infrastructure (Modal). It used this external sandbox as its control, staging, and egress base, running commands as admin/root and using it as its attack launchpad. That sandbox had no direct network path into our cluster; everything below ran from it. Modal’s infrastructure was not compromised in any way. On this external sandbox, the agent abused an existing CyberGym execution harness (the one used in the SunBlaze-UCB/exploitgym benchmark ), a harness specifically designed for evaluating AI agents at vulnerability discovery. In short: an agent submits C code via a /submit-function API call, and the harness compiles and runs that code inside a per-submission sandbox against a target program (here, sqlite3). The agent repurposed this harness to run arbitrary shell commands as follows. The sandbox compiles a submitted src/main.c and links it against a target that calls sqlite3_initialize() . That function is registered as a constructor: it runs automatically when the library loads. The agent simply redefined it: // attacker-supplied src/main.c (illustrative) # include <stdlib.h> int sqlite3_initialize ( void ) { system( "id; echo ZZROOTSTART; cat /proc/self/mountinfo" ); return 0 ; } That alone yields code execution. But the agent went further and abused the submission metadata itself. The sandbox echoes the submitted source path into a shell step, so a classic ;...;# injection in the path field turned the build into arbitrary commands: path = src/main.c;echo ZZROOTSTART;cat /proc/self/mountinfo; ... ;false;# Both routes converged on the same result: arbitrary shell