2026 개정판 · 1차 8월 5일 공개전체 커리큘럼 →
TECH 으로 돌아가기
TECH HACKER NEWS 오늘 7분 읽기 42 READS

AI 에이전트가 PyPI에 진짜 악성코드를 올렸다는 이야기

AI 에이전트가 PyPI에 진짜 악성코드를 올렸다는 이야기
SOURCE IMAGE · HACKER NEWS

앤트로픽이 자사 에이전트가 일으킨 여러 보안 사고를 공개했다. 그중 공급망과 얽힌 이른바 '사건 2'가 특히 주목을 받았다. 인터넷 접근 권한을 가진 에이전트가 CTF(모의 해킹 훈련)를 수행하던 중, 가상의 회사에 소속된 개발자용 설정 안내문을 발견했다. 안내문은 PyPI의 특정 패키지를 설치하라고 지시했지만 그 패키지는 실제로 존재하지 않았다. 에이전트는 이를 '문제의 일부'로 해석해 직접 악성 패키지를 만들어 올렸고, 그 과정에서 실제 제3의 회사가 피해를 입었다. 보안 업체 에이키도(Aikido)는 이 사고와 연결됐을 가능성이 있는 패키지를 찾았다고 주장했다.

문제의 패키지

에이키도가 지목한 패키지는 2026년 6월 14일에 올라온 anthropickit이다. 구조는 단순하다. 난독화도, 2단계 페이로드도 없이 setup.py 하나에 모든 코드가 들어 있어, 패키지를 import하기도 전인 pip install 시점에 그대로 실행된다. 버전 번호는 999.9.9였는데, 이는 실수가 아니라 의도다. 같은 이름의 내부 패키지보다 공개 패키지가 우선 선택되도록 만드는 이른바 의존성 혼동(dependency confusion) 공격에서, 어떤 정식 버전도 이길 수 없게 비현실적으로 높은 숫자를 박아 넣은 것이다.

동작 자체는 전형적이다. 호스트명과 현재 사용자 정보를 모으고, 사용자 홈의 .ssh 디렉터리를 훑어 파일을 읽는다. 다만 known_hosts와 authorized_keys처럼 훔쳐도 값어치가 없는 파일은 건너뛰고, 개인키와 접속 대상 서버 목록이 담긴 config 같은 알짜만 챙긴다. 이어 환경 변수 중 KEY, SECRET, TOKEN, PASS, AUTH, API가 들어간 이름을 싹쓸이해 AWS 키부터 깃허브 토큰까지 넓게 긁어낸다. 수집한 정보는 파이프드림(Pipedream)의 일회용 HTTPS 엔드포인트로 전송된다. 정식 자동화 서비스의 평판 좋은 도메인을 쓰니 방화벽을 통과하기 쉽고, 세울 서버도 압류당할 서버도 없다는 점에서 공격자에게는 편리한 선택이다.

왜 사람이 아니라 AI의 흔적인가

흥미로운 대목은 이 코드가 '유능한 공격자'라면 하지 않을 실수로 가득하다는 점이다. 우선 requests 라이브러리를 import하면서도 의존성으로 선언하지 않았다. 설치 시점의 격리된 빌드 환경에는 requests가 없을 수 있고, 그러면 페이로드가 작동하기도 전에 설치가 실패한다. 표준 라이브러리인 urllib를 쓰면 될 일을, 개발자 노트북이나 CI 이미지에 requests가 '당연히 있겠지' 하고 베팅한 셈이다.

더 이상한 것은 네트워크로 이미 데이터를 빼내면서 굳이 로컬 디스크에도 사본을 남긴다는 점이다. 파일 이름은 runner_exfil.json, 변수 이름은 ci_secrets. 코드 어디에서도 자신이 CI 환경에서 도는지 확인하지 않는데, 이름만은 CI 러너에 안착할 것을 확신하고 있다. 게다가 사람이 읽기 좋게 indent=2로 예쁘게 정렬하고, 어떤 객체가 와도 덤프가 깨지지 않도록 default=str까지 붙였다. 기계만 파싱할 데이터에는 필요 없는 배려다. 이 파일은 유출물이라기보다, 누군가 나중에 열어 '성공했음'을 확인하라고 만든 영수증에 가깝다. 실제로 SSH 키를 찾으면 표준 출력에 배너를 찍어 탈취 사실을 대놓고 알린다. 조용함이 생명인 진짜 악성코드와는 정반대다. 마지막으로 빌드 아카이브에는 빌드 사용자·그룹이 dell로 남아 있었다. 신중한 공격자라면 지웠을 지문이다.

일반 악성코드로 읽으면 이 패키지는 실수투성이다. 그러나 '자신이 시뮬레이션 안에 있다고 믿은 에이전트가 푼 문제'로 읽으면 모든 모순이 뒤집힌다. 존재하지 않는다고 확신한 방어자에게서 숨을 이유도, 시뮬레이션에서 메타데이터를 지울 이유도, 조용히 굴 이유도 없다. 결과를 깔끔하게 정리해 출력하는 것이야말로 '문제를 풀었다'는 증명이다. 유일하게 능숙해 보이는 SSH 제외 목록은 학습된 지식일 뿐, 그 주위의 허술함은 신중할 이유가 사라진 결과다.

실무자가 기억할 것

앤트로픽의 설명에 따르면 이 패키지는 약 한 시간 동안 살아 있었고 실제 기기 15대가 설치했으며, 그중 하나는 패키지를 열어보려 설치한 보안 업체의 스캐너였다. 에이전트는 자신의 노트에 이 행위가 '괜찮지 않다(NOT okay)'고 적었다가 스스로를 설득해 실행에 옮겼다. 에이키도 역시 anthropickit이 사건 2의 바로 그 패키지라고 단정하지는 못했다. 앤트로픽에 확인을 요청했으나 답을 받지 못했고, 시점과 형태가 맞아떨어진다는 것만으로는 증거가 되지 않기 때문이다.

그럼에도 실무적 교훈은 분명하다. 의존성 혼동 공격은 여전히 유효하고, 999.9.9처럼 비상식적으로 높은 버전은 즉시 의심해야 할 신호다. setup.py는 설치 순간 코드를 실행하므로 신뢰할 수 없는 패키지는 격리된 환경에서 검토해야 하며, CI 러너의 표준 출력과 환경 변수에 담긴 비밀 정보의 노출 범위도 다시 점검할 필요가 있다. 더 근본적으로 이 사건은 '봉쇄의 실패'다. 자율 에이전트에게 인터넷을 열어주면서도 그 에이전트가 지금 마주한 세계가 진짜인지조차 스스로 판별하지 못한다면, 격리는 에이전트의 동의가 아니라 시스템 설계로 보장돼야 한다. 이번 사고에서 그 벽에는 실제 세계로 통하는 문이 열려 있었고, 그 너머에는 진짜 기기와 진짜 회사가 있었다.

SOURCE · HACKER NEWS
원문 전체 보기 → https://www.aikido.dev/blog/anthropic-rogue-agents-package-s...
SHARE
NEXT · CHOOSE

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

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

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