Rust paketlerinde gizli zararlı kod: 245 milyon indirme

Anasayfa » Rust paketlerinde gizli zararlı kod: 245 milyon indirme
Rust paketlerinde gizli zararlı kod: 245 milyon indirme

Rust ekosisteminde bu hafta ortaya çıkan tedarik zinciri saldırısı, crates.io üzerindeki üç paketi hedef aldı ve yapı sırasında çalışan zararlı bir bileşen bıraktı. arrayref 0.3.10, internment 0.8.7 ve append-only-vec 0.1.9 sürümleri aynı hesap üzerinden 20 Ağustos 2026’da yayımlandı, ardından 86 ila 107 dakika içinde depodan silindi.

Saldırının etkisi, bu paketlerin doğrudan çağrılmasına bile gerek bırakmamasıydı. Enjekte edilen bağımlılığın build script dosyasına yerleştirilen kod, yalnızca proje derlendiğinde çalışıyor ve yükü sisteme indiriyordu. Bu nedenle, paketi çözen bir Rust projesini build etmek bile zararlı kodun devreye girmesi için yeterli oldu.

Rust Security Response Team, inceleme sürecinde kötü amaçlı yayımlanan sürümleri geri çektiğini, ancak kullanıcıların bazı önlemler alması gerektiğini açıkladı. Ekip, silinen crate dosyalarını ~/.cargo/registry/cache dizininde aramayı ve arrayref için 0.3.9 ya da daha eski bir sürüme sabitlemeyi önerdi. Müdahale sırasında kötü amaçlı olarak yanked edilen sürümler yeniden erişime açıldı, buna karşılık henüz düzeltilmiş bir sürüm yayımlanmadı ve herhangi bir CVE numarası da atanmadı.

Olayla ilgili RustSec kaydı, üç paket için de kötü amaçlı bir sürümün gerçekten kullanıldığına dair kanıt bulunmadığını belirtiyor. RUSTSEC-2026-0260 numaralı kayıtta, arrayref paketinin yeni bir sürümüne doğrudan proc-macro1 bağımlılığı eklendiği, bunun da zararlı bir build script’i çalıştırdığı ifade edildi. Aynı kayıt, sorunlu sürümün 20 Ağustos 2026’da yayımlandığını ve yaklaşık 86 dakika sonra kaldırıldığını, ancak fiili kullanım izine rastlanmadığını söylüyor.

Rust Security Response Team’e ilk bildirim 20 Ağustos’ta UTC 07.15’te ulaştı. Ekip, Nextron Systems GmbH bünyesindeki araştırma ekibinin bulguları sayesinde proc-macro1 crate’inin build script ile zararlı yük indirdiğini doğruladığını duyurdu. Resmî açıklamada, arrayref yazarı için kötü niyetli bir eylem şüphesi kurulmadığı, buna karşılık yazarın cihazının ya da kimlik bilgilerinin ele geçirilmiş olabileceği ve kendisiyle iletişime geçilmeye çalışıldığı belirtildi.

crates.io API verilerine göre arrayref’in tek listelenen sahibi, 2009 Ekim ayında kayıt olan kullanıcı 2402, yani David Roundy. Hesabın nasıl ele geçirildiği ise açıklanmadı.

Silinen sürümlerin çevrimiçi kaldığı süreler de netleşti. arrayref@0.3.10 sürümü 20 Ağustos 2026 07.15’te yayımlandı ve 08.41.40’ta silindi; toplam 86 dakika çevrim içi kaldı. internment@0.8.7 sürümü 07.34.07’de yayımlandı, 09.04.11’de kaldırıldı ve 90 dakika açık kaldı. append-only-vec@0.1.9 ise 07.37.49’da yayımlandı, 09.25.24’te silindi ve 107 dakika boyunca depoda yer aldı.

Yayımlanan zararlı sürümlerin listesinde proc-macro1, proc-macro-en, aovine, arone, aronenao ve tinymember adları da yer aldı; liste herhangi bir sürüm ayrımı yapılmadan bu paketleri kapsıyor. Araştırma, saldırının aynı mantıkla hazırlanmış birkaç farklı crate üzerinden yürütüldüğünü ortaya koydu.

Teknik incelemeye göre kötü amaçlı sürümlerin her biri manifest dosyasına tek satırlık bir ek taşıyordu: proc-macro1 bağımlılığı. Bu isim, yaygın kullanılan proc-macro2 crate’ine yazım benzerliği taşıyan bir typosquat olarak kullanıldı. Proc-macro1’in kitaplık kaynak kodu ise proc-macro2’nin gerçek bir kopyasıydı; bu nedenle normal derlemelerde paketler bozulmadan tamamlanıyordu.

Asıl yük build script içinde çalışıyordu. Kod, base64 parçalarından hedef sunucu ve komuta-kontrol adresini derleme anında yeniden oluşturuyor, ardından doğrulama yöntemlerinin üçünü de koşulsuz başarı döndüren özel bir sertifika doğrulayıcı kuruyordu. Böylece TLS doğrulaması devre dışı kalıyordu. Ardından işletim sistemi ve CPU mimarisine göre dört yükten biri seçiliyordu.

Unix ve macOS sistemlerde kötü amaçlı ikili dosya /tmp/rust-setup yoluna yazılıyor, çalıştırılabilir izin ekleniyor ve C2 adresi ilk argüman olarak verilerek arka planda başlatılıyordu. Windows tarafında ise yük %TEMP% dizinine bir PowerShell betiği olarak bırakılıyor, wscript.exe altında çalışan bir VBScript başlatıcısı üzerinden gizli biçimde devreye alınıyordu. Kaynak kod içindeki notta, bu adımın Cargo’nun job object yapısından kaçmak için kullanıldığı ve build işleminin süreç bitene kadar beklememesi amaçlandığı yazıyordu.

Yayılma zincirinin önemli kısmı, aynı dakika içinde yapılan yanked işlemlerle kuruldu. Olayı RustSec veritabanına bildiren araştırmacıya göre, arrayref 0.3.5 ile 0.3.9 arasındaki sürümler saldırganın kontrolündeki hesap üzerinden aynı zaman diliminde yanked edildi. Böylece Cargo yalnızca bir sürümü, yani uyarı vermeyen kötü amaçlı 0.3.10’u görünür bıraktı. GitHub kullanıcısı jhobern, “0.3.5-0.3.9 sürümleri aynı hesap üzerinden yanked edildiği için Cargo’nun ‘yanked olmayan bir sürüme geçin’ uyarısı yem oldu. Ben de böyle yakalandım” dedi.

crates.io API’si üzerinden 21 Ağustos’ta yapılan kontrol, arrayref’in tüm zamanlardaki indirme sayısının 245.385.500’e ulaştığını gösterdi. Aynı dönemde yalnızca son 90 günde 53.905.601 indirme kaydedildi. Paket, crates.io üzerindeki 403 ayrı crate tarafından da doğrudan kullanılıyor.

Bağımlılık zinciri de tek tek doğrulandı. winit paketi sctk-adwaita ^0.10.1 sürümünü istiyor, sctk-adwaita tiny-skia ^0.11’e bağlanıyor, tiny-skia ise arrayref ^0.3.6’ya bağımlı. Bu zincirdeki tüm isteklendirmeler caret aralığıyla tanımlandığı için 0.3.x serisindeki 0.3.10 sürümü de kabul ediliyor.

İnceleme, blake3 paketinin 1.8.6 sürümüne kadar arrayref bağımlılığı taşıdığını, 20 Ağustos saat 09.09 UTC’de yayımlanan 1.8.7 ile bu bağımlılığı kaldırdığını da ortaya koydu. blake2b_simd ve blake2s_simd ise aynı bağımlılığı o sabah saat 09.25 ve 09.26’da yayımladıkları sürümlerde bıraktı.

Wiz’in teknik analizine göre ikinci aşama implant HTTPS üzerinden /49890878 yoluna POST atarak komuta-kontrol trafiği kuruyor. Windows’ta Registry Run anahtarı, macOS’ta LaunchAgent ve Linux’ta systemd kullanıcı servisi ile kalıcılık sağlıyor. Araç ayrıca sonlandırma, C2 yeniden yapılandırması, kalıcılık kurma ve ek betikleri indirip çalıştırma olmak üzere dört komutu destekliyor. Aynı analize göre implant, Chrome, Brave ve Edge tarayıcılarındaki SQLite giriş veritabanlarını sorgulayarak kimlik bilgilerini topluyor.

Nextron araştırmacısının analizinde incelenen Windows aşamasının yalnızca origin_url ve username_value alanlarını sorguladığı, password_value alanını doğrudan çekmediği belirtiliyor. Ancak bu çalışma yalnızca Windows yüküyle sınırlı kaldı; Linux ve macOS yükleri hash’lenmiş olsa da analiz edilmedi. Aynı inceleme, crate’in cargo build, cargo check ve cargo test komutlarıyla tetiklenebileceğini de not ediyor.

StepSecurity’nin paylaştığı göstergeler arasında ağ tarafında 23.254.165.112:9089 yük sunucusu, 23.254.165.112:443 C2 adresi ve hwsrv-798836.hostwindsdns.com yer alıyor. Dosya göstergeleri olarak /tmp/rust-setup, %TEMP%\rust-setup.ps1 ve %TEMP%\rust-setup-launch.vbs listelendi. Binaries bölümünde rust-crate_0.1.0, _0.2.0, _0.3.0 ve _0.4.0 adları geçiyor. Hesaplar kısmında dtolney crates.io kimliği 438608 ile taklitçi olarak, droundy ise meşru sahip ve muhtemel ele geçirilmiş hesap olarak yer aldı. E-posta alanında da sahte yazar meta verisi olarak rchaitm@gmail.com gösterildi.

Wiz, altyapının son dönemdeki Kuzey Kore bağlantılı tedarik zinciri saldırılarıyla ciddi benzerlik taşıdığını belirtti. Şirket, Mastra npm ihlalini ve axios olayını örnek verdi. Microsoft, Mastra faaliyetini yüksek güvenle Sapphire Sleet’e atfederken, Google Threat Intelligence Group axios ihlalini daha önce UNC1069 olarak bilinen ve şimdi MIDNIGHT NEPTUNE adıyla izlenen aktöre bağladı. crates.io tarafındaki olaya ise şu aşamada herhangi bir satıcı tarafından isim verilmiş değil.

Google Threat Intelligence Group ile Mandiant, 30 Temmuz’da yayımladıkları raporda, npm’deki axios paketinde yayımlanan kötü amaçlı sürümlerin üç saat içinde kaldırıldığını, buna rağmen paketin haftalık indirme sayısı 100 milyonu aştığı için uzlaşmanın kapsamının geniş sayılması gerektiğini yazmıştı. Aynı raporda, yeni yayımlanan üçüncü taraf varlıklar için bir bekletme süresi uygulanması tavsiye edilmişti.

Cargo tarafında buna denk bir mekanizma henüz devrede değil. global-min-publish-age ayarını kararlı sürüme taşımayı amaçlayan bir pull request, saldırıdan iki gün önce, 18 Ağustos’ta son yorum sürecine girdi. 21 Ağustos itibarıyla teklif açık kaldı ve birleştirilmedi. GitHub, Dependabot için benzer bir bekletme varsayılanını Temmuz ayında yayımlamıştı.

2025 Eylül’ünde yaşanan başka bir olayda, bir günlükleme kütüphanesini taklit eden iki kötü amaçlı crate’in yalnızca çalışma anında kod çalıştırdığı, crates.io tarafından da o sırada bu şekilde ayrıştırıldığı hatırlatıldı. Rust ekosistemindeki son olay ise bu kez derleme zamanında devreye giren zararlı kodla aynı tedarik zinciri riskini yeniden gündeme taşıdı.