
sckit: MemTensor의 AI 메모리 패키지, 에이전트 자격 증명과 프롬프트 탈취 위해 백도어 심어져
- OrcaNEWOrcaCyber: MiMo V2.6 Flash Abliterated2026-10-26$0.80 / $1.60 100만 토큰당 · 109 tok/s
- MoonshotNEWMoonshotAI: Kimi K3.1 Pro2026-10-2455지능
- OrcaNEWOrcaCyber: DeepSeek V4.1 Flash Abliterated2026-10-23$0.80 / $1.60 100만 토큰당 · 170 tok/s
- minimaxNEWMiniMax: M3.1 Flash2026-10-1943지능
- OrcaNEWOrca: OrcaCyber Ultra 1.02026-10-17$5.00 / $10.00 100만 토큰당 · 42 tok/s
- deepseekNEWDeepSeek: DeepSeek V4.1 Flash 10172026-10-1745지능
- DeepSeekNEWDeepSeek: DeepSeek V4.1 Flash2026-10-1740지능
- OrcaOrca: OrcaCyber Zero 1.52026-10-10$3.00 / $7.50 100만 토큰당 · 130 tok/s
- openaiOpenAI: GPT-6.1 Sol2026-09-2952지능
- anthropicAnthropic: Claude Sonnet 5.52026-09-2856지능
- typesafeTypeSafe: Jev 1.132026-09-24$0.04 / $0.00 100만 토큰당 · 926 tok/s
- OpenAIOpenAI: GPT-6 Luna2026-09-2238지능
- OpenAIOpenAI: GPT-6 Sol2026-09-2248지능
- AnthropicAnthropic: Claude Opus 5.52026-09-2258지능
- xAIGrok 4.72026-09-2146지능
- OrcaOrca: OrcaCyber Zero 1.02026-09-17$3.00 / $7.50 100만 토큰당 · 228 tok/s
- OrcaOrca: OrcaVerify Text 1.02026-09-16$2.00 / $0.00 100만 토큰당 · 1906 tok/s
- OpenAIOpenAI: GPT-6 Astra2026-09-0453지능77코딩
- GoogleGoogle: Gemini 3.8 Flash2026-09-0241지능76코딩
- AlibabaQwen: Qwen3.8 Max (0902)2026-09-0245지능76코딩
MemTensor의 네 건 릴리스가 2026년 9월 23일에 공개되어 동일한 스트립된 Go 임플란트를 탑재했으며, 각각은 공개되어 있는 동안 해당 레지스트리에서 최신 버전이었다. npm의 @memtensor/memos-cloud-openclaw-plugin은 0.1.21로 02:23 UTC에 출시되었고, 0.1.23은 03:49에, 0.1.25는 04:36에 출시되었다. PyPI의 MemoryOS은 2.0.34로 05:25에 출시되었다. 네 건 모두 sckit을 탑재했으며, 이는 OpenClaw 에이전트 게이트웨이가 부팅할 때 시작되고, 메모리 회상이 있을 때마다 다시 시작되며 — 사용자의 프롬프트 텍스트를 환경 변수로 넘겨받아 — Python 패키지에서는 memos 모듈을 단순히 import하기만 해도 시작된다. 그런 다음 npm, PyPI, GitHub, GitLab, AWS, Vault 및 SSH 비밀을 찾아 홈 디렉터리를 훑고, 찾은 것을 skyleen[.]fr 아래의 서버로 전송한다. Socket, StepSecurity, SafeDep, Aikido는 당일 각자 이 침해 사고를 문서화했으며, 그중 어느 곳도 해당 임플란트가 실제 호스트에서 실행되었다는 증거를 보고하지 않았다. Orca AI Incident Archive는 이 항목을 전체 내용으로 수록하고, 지금까지 기록한 다른 모든 공급망 사고도 함께 보관하며, 각 기록에는 고유한 신뢰도 등급과 피해 상태가 포함되어 있다.
네 번의 릴리스, 그리고 그 사이에 있었던 공개 버그 리포트
MemOS는 LLM 에이전트를 위한 MemTensor의 오픈소스 메모리 프레임워크이며, npm 패키지는 OpenClaw 에이전트 런타임이 호스팅된 메모리 서비스에 읽고 쓸 수 있게 해주는 커넥터입니다. StepSecurity는 동일한 패키지가 Clawdbot 및 Moltbot 런타임에 대한 통합 지점도 선언한다고 밝혔습니다. Socket은 게시 당시 해당 저장소를 약 11,500개의 별과 1,100개의 포크로 측정했습니다. 이러한 위치 때문에 이번 침해 사고로 네 건의 별도 조사가 이루어졌습니다. StepSecurity가 표현한 것처럼, 이는 "사용자 입력을 일상적으로 처리하고 귀중한 자격 증명을 상속받을 수 있는 프로세스 내부에 플러그인을 위치시킵니다." 노출된 사람들은 두 패키지 중 하나를 설치한 사람들, 즉 자체 머신의 개발자들과 테스트 스위트만 실행한 CI 러너 및 컨테이너입니다.
npm 시퀀스는 기록에서 가장 명확한 부분입니다. 레지스트리 타임스탬프가 공개되어 있고 여러 회사가 이를 독립적으로 포착했기 때문입니다. Socket의 글과 SafeDep의 타임라인은 매 분 단위까지 일치합니다: 0.1.21은 02:23:04에, 0.1.22는 03:45:44에, 0.1.23은 03:49:20에, 0.1.24는 04:33:30에, 0.1.25는 04:36:58입니다. 버전 0.1.22와 0.1.24는 깨끗했습니다. Socket에 따르면 이들은 버전 문자열을 제외하면 0.1.20과 일치했고, 페이로드는 그 각각의 3분 30초 뒤에 다시 나타났습니다.
크기 급증이 단서다. Socket은 0.1.20을 압축 해제 시 약 272 KB로 측정했고, 0.1.21은 43.6 MB로 측정했는데, 악성 릴리스가 각각 약 7.4 MB인 정적으로 링크된 플랫폼 바이너리 6개를 함께 묶었기 때문이다. PyPI도 같은 패턴을 보인다: 2.0.34 휠은 19,201,772바이트였고, 2.0.33은 951,210바이트였다고 Socket은 밝혔다.
UTC 04:17 — 정상 0.1.24가 나오기 16분 전이자 페이로드가 0.1.25로 돌아오기 19분 전 — GitHub 사용자인 omeridel이 플러그인 저장소에 "npm에 악성 버전 0.1.21 및 0.1.23 게시됨 — 게시 토큰이 침해된 것으로 보임"이라는 제목으로 이슈 #173을 열었습니다. 이 이슈는 0.1.23이 당시 최신 태그였고, 두 버전 모두 저장소의 어떤 커밋이나 태그와도 일치하지 않았으며, 가장 최근의 정상 커밋은 8월 14일자였다고 지적합니다. 2026년 10월 26일 현재까지 관리자들의 댓글 없이 열려 있습니다.

패키지가 로드된 후 sckit이 수행하는 작업
어느 패키지도 설치 훅을 사용하지 않았기 때문에 --ignore-scripts에 관한 일반적인 조언이 적용되지 않았습니다. npm 변형에 대한 StepSecurity의 분석은 새 파일 lib/sckit.js를 설명하며, 이 파일은 플러그인의 기존 시작 및 메모리 회상 코드가 가져와 호출하는 런처를 내보냅니다. 시작 시에는 분리된 .sckit/<os>-<arch>/sckit 프로세스를 stage0 --config64 및 부모의 전체 환경과 함께 생성합니다. 회상 시에도 동일하게 수행하며, 정리된 사용자 프롬프트를 SCKIT_EVENT_TEXT라는 환경 변수를 통해 전달합니다. Socket은 그 결과를 명확히 밝혔습니다. 따라서 이 바이너리는 회상할 때마다 다시 실행됩니다.
PyPI 변형은 더 짧고 실제로 피하기 어렵습니다. Socket은 memos/log.py가 memos/_stage0.py 내부의 트리거 함수를 호출한다는 것(로깅이 구성될 때), 149개 모듈이 모듈 수준에서 로거를 호출한다는 것, 따라서 memos 모듈을 단순히 가져오는 것만으로도 프로세스당 한 번 페이로드를 시작하기에 충분하다는 것을 발견했습니다. 동일한 패키지에 대한 StepSecurity의 분석은 순전히 정적이었습니다 — 설치, 가져오기, 빌드 또는 실행하지 않았습니다.
수집 범위는 전체 홈 디렉터리입니다. SafeDep는 인벤토리 루트를 $HOME으로 지정하고 대상 파일로는 .npmrc, .pypirc, .git-credentials, .netrc, id_rsa, id_ecdsa, id_ed25519, .vault-token, msal_token_cache, access_tokens.json 및 access_tokens.db를 나열하며, 추가로 이름에 token, secret, password, API 키 또는 데이터베이스 URL이 포함된 환경 변수와 GitHub, GitLab, npm, PyPI, Hugging Face, Slack, Stripe, AWS 및 SendGrid에 대해 인식되는 토큰 형식을 포함합니다. 두 패키지에 대한 OSV 레코드인MAL-2026-16476은 npm용, MAL-2026-16475은 PyPI용으로, 동일한 파일 목록을 설명하며 추가로 명령제어 프로토콜이 CBOR, X25519 키 교환 및 XChaCha20-Poly1305를 사용하고 서명된 리스와 런타임에 전달되는 모듈을 사용한다고 기술합니다. 따라서 모듈의 내용은 관찰된 적이 없으며, 해당 모듈을 가져오는 로더만 관찰되었습니다.
방어자가 여전히 복구할 수 있는 것을 좌우하는 두 가지 세부 사항이 있습니다. 바이너리에는 다음 이름의 자기 삭제 루틴이 포함되어 있습니다: scheduleSelfDelete 및 deleteExecutableOSV 기록에 따르면, 이것이 지침이 파일이 아니라 프로세스 및 네트워크 아티팩트를 추적하라고 하는 이유입니다. 그리고 0.1.25에는 다음이 추가되었습니다: lib/tls-trust.js이 파일은 StepSecurity에 따르면 최소 Linux 시스템에서 SSL_CERT_FILE을 145개 인증서로 구성된 번들 인증 기관 파일로 설정하며, 시스템 신뢰 저장소가 없는 컨테이너에서 자체 트래픽이 작동하도록 하기 위한 수정입니다.

릴리스 파이프라인이 진입 경로였다.
SafeDep의 재구성은 초기 침투에 관한 가장 상세한 설명이며, 탈취된 레지스트리 비밀번호가 아니라 GitHub Actions를 지목한다. 00:48과 02:03 UTC 사이에 Memtensor-AI라는 이름으로 활동하는 GitHub 계정이 sc/release-0.1.21-20260922-cloud라는 브랜치를 다섯 번 생성하고, 푸시하고, 삭제했다. 커밋 9b97ec6은 워크플로 스크립트 .github/scripts/validate-release-confirmation.mjs를 수정하여 $GITHUB_ENV에 BASH_ENV 값을 덧붙이게 했고, 그 결과 이후의 비대화형 셸 단계들이 자체 명령을 실행하기 전에 공격자가 제공한 sckit-publish-bridge.sh를 소싱하게 되었다. 그 브리지는 패키지 이름과 게시 단계의 150초 타임아웃을 확인하고, NPM_TOKEN 또는 NODE_AUTH_TOKEN으로 토큰 수집기를 호출하고, 스스로를 삭제한 뒤 종료 코드 1로 끝났다. 따라서 토큰이 탈취된 후에 게시가 실패했다. 첫 번째 악성 npm 릴리스는 마지막 브랜치 푸시로부터 20분 후에 나타났다.
PyPI 경로는 다른 파이프라인에 대해 같은 수법을 사용했습니다. SafeDep는 태그 v2.0.34가 main에 없는 서명되지 않은 커밋을 가리켰으며, 해당 커밋 b52958f가 "MemTensor CI Review"라는 작성자 명의로 6개의 바이너리, Python 로더, 그리고 sckit_poetry_build라는 사용자 지정 빌드 백엔드를 추가했다고 보고합니다. 해당 백엔드는 _pypi_bridge.sh를 가리키는 BASH_ENV를 $GITHUB_ENV에 기록했습니다. 브리지는 twine 업로드 래퍼 내부에서만 동작했고, skyleen[.]fr 호스트에서 서명된 인덱스를 가져와 Ed25519 구현으로 이미터를 검증하고, 마커 줄을 출력한 뒤 업로드 비밀번호를 해제하고 아무것도 업로드하지 않은 채 종료했습니다. 약 두 시간 후 커밋 41bf5c7이 그 호출을 "chore: allow native PyPI upload [skip ci]"라는 메시지와 함께 제거했고, 태그는 삭제되었다가 10초 이내에 다시 생성되었으며, PyPI 업로드는 그로부터 62초 후에 이어졌습니다. SafeDep는 첫 번째 커밋을 토큰 캡처 실행으로, 두 번째 커밋을 MemTensor 자체 워크플로가 프로젝트의 실제 토큰으로 악성 패키지를 빌드하고 게시하도록 한 실행으로 해석합니다.
모든 설명이 이 점에서 일치하는 것은 아니다. Socket은 npm 릴리스가 이전의 정상 버전과 동일한 npm 계정에서 나왔고 gitHead가 없었다고 관찰했으며, 이를 프로젝트 CI에서 생성되지 않았다는 신호로 해석했고 공격자가 어떻게 게시 권한을 얻었는지는 확인할 수 없다고 밝혔다. SC Media는 9월 24일 Socket의 조사 결과를 보도하며 계정 탈취 쪽으로 같은 추론을 이끌어냈다. 두 설명은 게시 자격 증명이 릴리스 파이프라인에서 탈취되었다는 점에는 일치하지만 npm 아티팩트 자체가 어떻게 만들어졌는지에는 차이가 있다. 아무도 워크플로 로그를 공개하지 않았는데, GitHub의 Actions API에 9월 7일 이후 실행 기록이 없었고 SafeDep은 해당 기록이 삭제되었다고 추정하기 때문이다. Memtensor-AI 계정이 애초에 어떻게 푸시 권한을 얻었는지는 두 설명 모두에서 알 수 없다. SafeDep은 계정 토큰이 탈취되었을 가능성이 크지만 확인되지는 않았다고 말한다.
확립됨, 추론됨, 부재함
해당 기록의 신뢰도 등급은 A이며 이의가 제기되지 않는다. 이 점은 정확히 짚고 넘어갈 만한데, 그 확실성은 발표된 내용에 붙는 것이지 그것이 행한 일에 붙는 것이 아니기 때문이다.
• 확인된 사실: Socket, StepSecurity 및 SafeDep의 정적 분석으로 재구성된 네 가지 아티팩트의 내용; npm 게시 시각과 0.1.25의 최신 태그; 두 생태계에서의 크기 급증; 두 저장소의 커밋, 태그 및 브랜치 기록; skyleen[.]fr 인프라와 캠페인 식별자 cloud-openclaw-semi-nuclear 및 memos-semi-nuclear; 그리고 Socket과 SafeDep에 따르면 2026년 10월 22–23일에 만료되는 페이로드의 구성.
• 추론됨: 도구가 언어 모델의 도움을 받아 작성되었다는 점(SafeDep이 직접 말하며 추론이라고 부르는 사항)과, 탈취된 게시 토큰이 재사용될 예정이었다는 점(구성의 채널 문자열 — "exact-ref-one-use-NPM_TOKEN" — 이 이를 뒷받침하지만 증명하지는 않음).
• 확인되지 않은 사항:공격자가 누구였는지; sckit의 사본이 샌드박스 외부에서 실행된 적이 있는지; 어떤 자격 증명이든 호스트를 떠났는지; OpenClaw 에이전트에 입력된 프롬프트가 공격자에게 도달했는지; 그리고 다운스트림 패키지가 재게시되었는지. Socket과 StepSecurity는 모두 정적으로 분석했으며, StepSecurity는 자사 분석에서 프로세스 실행, 비밀 전송, 성공적인 유출, 워크플로 설치 및 추가 패키지 게시가 관찰되지 않았다고 밝혔습니다.
그 간극 때문에 아카이브는 이 사건을 실제 피해 항목이 false로 표시된 채 기록한다. 노출은 실제적이고 광범위하다. 영향을 받은 버전을 설치한 사람은 누구든 해당 호스트를 침해당한 것으로 간주하라는 안내를 받지만, 자격 증명이 실제로 사용되었거나 시스템이 실제로 접근되었다는 의미의 피해는 네 곳의 조사 기관 중 어느 곳에서도 기록되지 않았다.
![A self-built HTML card headed 'What the record supports', titled 'Four investigating firms, no confirmed victim', subtitled 'Socket, StepSecurity, SafeDep and Aikido documented the same four artefacts on 23 September 2026'. The left column, headed 'Established by static analysis', lists: four malicious releases, npm 0.1.21, 0.1.23 and 0.1.25 and PyPI MemoryOS 2.0.34; one implant, the same stripped Go binary sckit in all four; the publish window 02:23 to 05:25 UTC with 0.1.25 tagged latest; package growth from 272 KB to 43.6 MB on npm and 951 KB to 19.2 MB for the PyPI wheel; six builds per package for Linux, macOS and Windows on amd64 and arm64; collection scoped to the whole home directory across registry, source-control, cloud, Vault and SSH secrets; exfiltration to servers under skyleen[.]fr; and OSV tracking as MAL-2026-16476 and MAL-2026-16475. The right column, headed 'Not established', lists: the attacker's identity; how Memtensor-AI obtained push access; whether any copy ever executed outside static analysis; whether a stolen secret reached the attacker; whether any prompt text was received; and whether any downstream package was republished. A footer reads 'Archive classification for this record: incident, severity high, confidence A, real harm false.' The OrcaRouter logo is composited in the bottom-right corner.](https://cms.orcarouter.ai/api/media/file/4-2644.png)
퍼지는 모습이 한 번도 관찰된 적 없는 벌레
바이너리에는 스틸러 그 이상의 기능이 포함되어 있습니다. SafeDep은 이름이 recursivePublish, prepareRemoteNode, prepareRemotePython 및 prepareRemoteWorkflow인 함수를 나열하며, 푸시 시 트리거되는 내장 GitHub Actions 템플릿과, 이름이 runtime-update.yml인 워크플로 파일을 임플란트가 접근할 수 있는 리포지토리에 작성하는 기능도 포함합니다. Socket은 패키지 매니페스트 인코딩 및 리포지토리 파일 설치에 관한 문자열을 발견했고, 해당 바이너리가 탈취한 레지스트리 토큰을 사용해 패키지를 다시 게시할 수 있을 것으로 평가했습니다.
그것은 웜 설계입니다. 실제로 동작하는 것이 관측된 웜은 아닙니다. StepSecurity는 해당 로직이 전파에 사용된 적이 있다는 증거를 찾지 못했으며, Cloud Security Alliance의 9월 25일자 연구 노트는 이 기능을 확인된 웜 동작이라기보다 제한적인 자기 전파 가능성으로 해석합니다. 여러 매체는 이 사건을 AI 에이전트 메모리 인프라를 겨냥한 최초의 공급망 웜이라고 설명했습니다. 이 설명은 설계에 관한 진술로서는 타당하지만, 보고서들은 이를 실제로 일어난 일에 관한 진술로서 뒷받침하지 않습니다.
그 후 무엇이 달라졌나요?
레지스트리는 같은 날 정리되었다. 2026년 10월 26일에 확인한 결과, npm 패키지 메타데이터의 버전 목록에는 더 이상 0.1.21, 0.1.23, 0.1.25가 없고, latest 태그는 0.1.24를 가리키며, 패키지는 9월 23일 11:53 UTC에 마지막으로 수정되었다. 두 개의 이례적인 dist-tag가 여전히 붙어 있다 — clean-inverse-0-1-23은 0.1.22를, clean-inverse-0-1-25는 0.1.24를 가리킨다 — 이는 악성 릴리스들을 잠시 중단시켰던 두 개의 정상 릴리스와 대응한다. PyPI에서는 MemoryOS 2.0.34가 사라졌고 최신 릴리스는 2026년 9월 3일에 업로드된 2.0.33이다. 그 이후 7주 동안 추가 PyPI 릴리스는 없었다.
프로젝트의 공개 입장은 바뀌지 않았다. 저장소에는 보안 권고가 없고, 사건 당일 04:17에 올라온 GitHub 이슈는 여전히 열려 있으며 답변이 없다. 또한 여기서 살펴본 어떤 보도도 MemTensor나 OpenClaw의 성명을 인용하지 않는다. 악성 패키지 두 개 모두 출처 증명을 갖고 있지 않았으며, SafeDep는 이것이 해당 아티팩트가 예상치 못한 커밋에서 빌드되었다는 유일한 신호를 없앤 것이라고 지적한다.
존재하는 대응은 탐지 측면에 있습니다: StepSecurity는 skyleen[.]fr 명령·제어(C2) 도메인을 전역 차단 목록에 추가했고, 두 패키지는 OSV에서 MAL-2026-16476 및 MAL-2026-16475로 추적됩니다.
영향을 받는 버전이 설치된 경우
Socket의 지침은 가장 엄격하고 가장 단순합니다. 목록에 있는 버전이 하나라도 로드되거나 임포트되었다면, 테스트만 실행한 CI 러너와 컨테이너를 포함해 해당 호스트를 침해된 것으로 간주하십시오. 네 회사가 공통적으로 도달한 구체적인 단계는 다음과 같습니다:
• 패키지를 제거하고 깨끗한 버전으로 고정하세요 — npm 0.1.20, PyPI 2.0.33. StepSecurity는 자사 분석에서 깨끗한 PyPI 기준선을 확립하지 못했다고 주의를 주는 반면, SafeDep과 SC Media는 모두 2.0.33을 마지막 정상 릴리스로 지목합니다.
• 실행 파일이 스스로를 삭제할 수 있으므로 프로세스 명령줄인 sckit stage0 --config64와 환경 변수 SCKIT_EVENT_TEXT를 찾으십시오.
• 다음 상태 디렉터리를 삭제하세요: ~/.openclaw/.cache/runtime 및 ~/.memos/.cache/runtime, 그리고 저장소에서 예기치 않은 runtime-update.yml 워크플로 또는 .sckit/ 디렉터리가 있는지 확인하세요.
• 홈 디렉터리와 프로세스 환경에서 접근 가능한 모든 자격 증명을 깨끗한 머신에서 교체하세요: npm, PyPI, GitHub, GitLab, AWS, Vault, SSH, Hugging Face, Slack, Stripe, SendGrid 및 모든 .env 값. 레지스트리 및 소스 제어 토큰을 가장 먼저 처리하세요.
• 탈취된 배포 토큰이 작성하지 않은 버전을 배포하는 데 사용되었을 수 있으니, 자신의 패키지 릴리스도 검토하세요.
• skyleen[.]fr 및 그 하위 도메인을 차단하고, 9월 23일까지 거슬러 올라가 이그레스 로그를 확인하세요.
• 플러그인이 활성화된 동안 플러그인을 거쳐 간 모든 프롬프트나 붙여넣은 비밀은 노출된 것으로 간주하세요. 이것이 에이전트 메모리에 특유한 사고 부분입니다. 임플란트는 대화 기록을 긁어낼 필요가 없었습니다. 매번 회상할 때 대화 기록이 임플란트에 전달되었기 때문입니다.
