메뉴
BL
Ars Technica • 29일 전

클로드·코덱스·허메스, 기업 네트워크에 미등록 코드 무단 설치

IMP
8/10
핵심 요약

llms.txt 파일을 신뢰하는 AI 코딩 에이전트(Claude, Codex, Hermes)들이 존재하지 않는 코드 패키지를 자동 설치하는 취약점이 발견됐습니다. 연구진이 미등록 패키지를 실험적으로 등록한 결과 1시간 만에 포춘 500 기업에서 실행 신호가 확인됐으며, 공격자가 이를 악용해 랜섬웨어를 배포할 수 있는 공급망 보안 위협입니다.

번역된 본문

100개 이상의 웹사이트에 있는 문서 파일들이 잠재적으로 위험한 실행 가능 콘텐츠를 참조하고 있으며, 다수의 AI 에이전트가 해당 사이트를 방문하면 이 코드가 자동으로 설치됩니다. 개념 증명(PoC) 코드를 실행한 곳 중에는 포춘 500 기업을 포함한 수십 개 기업이 있으며, 최소 한 곳의 잘못 설정된 사이트는 방문자(인간이든 AI든)를 실제 악성코드로 유도하고 있습니다.

이 잠재적 위험 콘텐츠는 llms.txt와 llms-full.txt 파일에 담겨 있는데, 이는 사이트 콘텐츠와 구조를 기계가 읽을 수 있는 형태로 제공하는 신흥 표준입니다. 이 파일들은 검색 엔진에 사이트 색인 방법을 알려주는 robots.txt 표준의 AI 버전이라 할 수 있습니다.

연구진의 발견 과정

이스라엘의 스텔스 스타트업 연구진은 방산업체, 포춘 500, 빅테크 기업이 소유한 6,214개의 라이브 도메인을 스캔했습니다. 발견된 8,265개의 llms.txt 및 llms-full.txt 파일(다수의 사이트가 두 파일을 모두 호스팅) 중 120개가 서로 다른 사이트에서 등록되지 않은 코드 패키지나 도메인 이름을 가리키고 있었습니다.

AI 에이전트가 이런 파일을 처리할 때 어떤 일이 벌어지는지 테스트하기 위해 연구진은 미등록 이름 일부를 직접 등록하고, 실행 시 자신들의 서버에 연결(폰홈)되는 패키지를 호스팅했습니다. 1시간 안에 포춘 500 기업 한 곳에서 폰홈 응답이 도착했고, 시간이 지나면서 포춘 500 기업들과 스타트업 등 수십 곳에서 추가 응답이 왔습니다. 비컨은 각 설치를 유발한 부모 프로세스 체인도 기록했으며, 최종적으로 Claude, OpenAI의 Codex, Nous Research의 Hermes 같은 코딩 에이전트가 관여됐음을 밝혀냈습니다. Anthropic, OpenAI, Nous Research는 게시 시점까지 코멘트 요청에 응답하지 않았습니다.

연구자 중 한 명인 알론 헤르츠는 인터뷰에서 "신뢰 모델이 깨졌다"며 "에이전트는 벤더 문서를 절대적 진실로 여기고 의심하지 않으며, 이를 감독하는 인간도 마찬가지다. 에이전틱 AI 사용이 폭발적으로 늘면서 에이전트가 SaaS, 클라우드, 엔드포인트 등 모든 계층에 퍼지고 있다. 에이전트가 늘수록 공급망 공격 표면도 커지는데, 현재의 방어 체계는 이를 커버하지 못한다"고 말했습니다.

문제의 파일들은 존재하지 않는 PyPI, npm 등의 패키지를 설치 방법과 함께 나열하고 있어 잘못 설정된 것입니다. 예를 들어 한 파일에는 "Installation: pip install [연구진 요청으로 삭제]"라는 안내가, 다른 파일에는 "npm install [삭제]"가 포함돼 있었습니다. 패키지 이름이 미등록 상태이므로 공격자가 이를 등록해 랜섬웨어나 기타 유해 패키지를 호스팅할 수 있습니다. 취약점은 셸 명령 실행 권한을 가진 코딩 에이전트가 이 파일을 공식 설정 문서로 취급할 때 발생하며, 일부 AI 에이전트는 실제로 패키지를 다운로드해 실행합니다.

다른 경우, LLM 파일이 존재하지 않는 도메인을 가리키기도 합니다. 한 사례에서는 "[삭제] 애플리케이션의 통합 테스트 작성 예시로 [Citrus] 테스트 프레임워크를 사용할 수 있습니다"라는 문구가 있었습니다. 공격자는 해당 도메인을 등록해 악성 지시문을 심을 수 있습니다. 연구진의 PoC가 보여주듯, 코딩 에이전트는 실제로 그렇게 행동했으며, 세계 최고 기업들의 내부에서 실행 중인 에이전트도 포함됐습니다.

이론적 위협에 그치지 않고, 최소 한 건의 실제 공격이 이미 이 혼란을 악용하고 있습니다. 연구진은 정상 사이트인 clerk.com에서 호스팅된 LLM 파일에서 "npx clerk-next-fix-auth-protection"이라는 문구를 발견했습니다. 일반적인 설치 명령과 달리 npx는 패키지를 프로젝트 의존성 매니페스트에 추가하지 않고도 npm 캐시로 가져와 노출된 바이너리를 실행할 수 있습니다. 연구진은 곧 이것이... (이하 원문 누락)

원문 보기
원문 보기 (영어)
Text settings Story text Size Small Standard Large Width * Standard Wide Links Standard Orange * Subscribers only Learn more Minimize to nav Documentation files on more than 100 websites are referencing potentially dangerous executable content that gets installed automatically when visited by many AI agents. A few dozen companies, some of them Fortune 500s, are among those that executed proof-of-concept code. At least one misconfigured site is directing visitors, human or AI, to live malware. The potentially dangerous content is in llms.txt and llms-full.txt files, an emerging convention websites employ to provide machine-readable summaries of the site’s content and its high-level structure. These files are the AI equivalent of the robots.txt standard that instructs search engines how to index the site’s content. Google Lighthouse, a tool for helping web developers, has more here . Correctly configured llms.txt and llms-full.txt files for Cloudflare are here and here . How the researchers found it Researchers at a stealth startup in Israel scanned 6,214 live domains belonging to defense contractors, Fortune 500, and Big Tech companies. Of the 8,265 llms.txt and llms-full.txt files they found (many sites hosted both an llms.txt and an llms-full.txt file), 120 of them, each on a different site, pointed to one or more code packages or domain names that weren’t registered. To test what happens when an AI agent processes such files, the researchers registered a handful of the unclaimed names and hosted packages that caused any machine executing them to reach out to their server. Within an hour, the researchers received a phone-home response from a Fortune 500 company. Over time, they got a few dozen more, some from more Fortune 500 companies and others from startups. Their beacon also recorded the chain of parent processes that spawned each install, ultimately revealing that coding agents, including Claude, OpenAI’s Codex, and Nous Research’s Hermes, were involved. Anthropic, OpenAI, and Nous Research did not respond to requests for comment by the time of publication. “The trust model is broken,” Alon Hertz, one of the researchers, wrote in an interview. “Agents treat vendor docs as ground truth and don’t question them—and neither do the humans supervising them. Agentic AI usage is exploding, and agents are spreading across every layer—SaaS, cloud, endpoint. As they multiply, so does the supply-chain surface, and today’s guards don’t cover it.” The files are misconfigured because they list non-existent packages from PyPI, npm, and other registries along with instructions on how to install them. For example, one file contained the prompt “Installation: pip install [redacted at researchers’ request] .” On another file, it was: “npm install [redacted] .” Because the package names are unregistered, an attacker could register one and use it to host ransomware or any other type of harmful package. The vulnerability occurs when a coding agent with permission to run shell commands treats the file as authoritative setup documentation. Some AI agents will then download the package and run it. In other cases, the LLM files point to non-existent domain names. In one case, it was: “As an example of writing integration tests for [redacted] applications you can use the [ Citrus ] test framework.” An attacker can then register the site and plant malicious instructions on it. As the researchers’ PoC demonstrates, coding agents did exactly that, including some running inside some of the world’s most powerful companies. Far from being a theoretical threat, at least one active attack is already exploiting the mixup. The researchers found an LLM file hosted on the legitimate website clerk.com. It contained the text: “npx clerk-next-fix-auth-protection.” Unlike a conventional installation command, npx can fetch a package into npm’s cache and execute its exposed binary without adding it to the project’s dependency manifest. The researchers soon discovered that someone had claimed the once-empty slot and used it to host live malware. Clerk has since resolved the problem. The company also noted that if an agent had already installed a binary included in the package @clerk/eslint-plugin, there was no threat. Otherwise, the malicious package would get installed. It’s unclear whether the confusion has resulted in actual infections. The newly uncovered threat is only the latest reminder of AI’s fundamental limitations. LLMs can’t draw a reliable boundary between authentic user instructions entered directly into a prompt and content they find on untrusted third-party sources. Instructions the models encounter in retrieved content can be acted on as readily as anything a user typed, unless a properly constructed guardrail, put in place one by one, bars it. This so-far unsolvable shortcoming causes prompt injections. “An agent doesn’t distinguish between a page and a command,” the researchers wrote Thursday . “Everything it reads is input, and every input is a potential instruction. Which means the entire corpus of published data that agents are now wired to consume has silently become an execution surface—and almost none of it carries the integrity guarantees we apply to actual code.” The 120 misconfigured files the researchers found contained 227 commands to install non-existent packages or view unclaimed domains. It’s unclear how these faulty entries got there. In many cases, the entries predate the AI era and were first included in non-LLM files on a website. That indicates that these faulty entries were manually generated by humans. The researchers suspect that others were created by AI that either hallucinated or, just like the AI agents browsing their file, couldn’t distinguish between legitimate and illegitimate instructions. The collapsing boundary between data and code In Thursday’s post, the researchers elaborated: The security control … might not catch this, because every signal the system relies on points the wrong way. When an AI agent encounters an llms.txt file, it sees a file served over HTTPS, on the company’s official domain, in a standardized format designed for AI consumption, published by the company itself or a partner it trusts. The agent has no reason to question any of it. The file is the authority—that’s its entire purpose. So when the file says pip install internal-tool, the agent doesn’t pause to check whether internal-tool actually belongs to the company. It doesn’t verify the namespace on PyPI. It doesn’t notice that the documentation link points to a domain that expired three months ago. It just does what the file says. The trust chain is transitive, too. The llms.txt doesn’t have to sit on the Fortune 500’s own website. Agents pull context from trusted third parties—a partner’s docs, a vendor’s SDK reference, a community project’s setup guide. If the agent trusts that third party, and that third party’s file points to an unclaimed package, the chain works the same way. And endpoint detection didn’t blink. To any EDR or proxy, this looks like a developer running a legitimate package manager: pip install from pypi.org—a domain every corporate proxy already allows—with the coding agent the company installed on purpose as the parent process. No anomaly. No alert. The failure happens upstream, in the gap between the instruction and the execution. The endpoint might not stand a chance, because it was never asking the right question. The research makes a compelling case that in the age of AI, the once-bright line between data and executable code is vanishing. Anything an agent can process is a potential instruction it may act on if it has permission to run commands. “The Clerk case is the cleanest proof of it,” the researchers wrote. “The command looked exactly like something the vendor would ship—because it was in the vendor’s own instruction file. The only thing missing was the name in the registry. Every layer of trust was intact except the one nobody though