Ne oldu?
arrayref, Rust’ta bir dizinin bir parçasını, uzunluğu derleme anında bilinen sabit boyutlu bir diziye referans olarak almanı sağlayan küçük bir crate. Küçük ama çok yaygın: crates.io’ya göre bugüne kadar 290 milyondan fazla indirilmiş.
20 Ağustos 2026’da sahibinin hesabından arrayref 0.3.10 yayımlandı. Aynı hesaptan internment 0.8.7 ve append-only-vec 0.1.9 da çıktı. Rust Security Response Team, sahibinin bilgisayarının ya da hesap bilgilerinin ele geçirildiğini düşünüyor. Saldırıyı Nextron Systems fark edip bildirdi. Zararlı sürümler 86, 90 ve 107 dakika sonra silindi, hesap da önlem olarak kilitlendi.
Tuzak nasıl kuruldu?
Yeni sürümlerin kodunda göze batan bir şey yoktu. Değişen tek şey yeni bir bağımlılıktı: proc-macro1. İsim, Rust’ın en çok kullanılan crate’lerinden proc-macro2’yi taklit ediyor. StepSecurity’nin zaman çizelgesine göre saldırgan aynı sabah, proc-macro2’nin yazarı dtolnay’i andıran dtolney adlı bir hesap açtı. Önce temiz bir kopya yayımladı, birkaç saat sonra da zararlı sürümü.
Bir de “yank” numarası var. Saldırgan arrayref’in önceki sürümlerini (0.3.5–0.3.9) saniyeler içinde geri çekti (yank). Cargo’nun belgelerine göre geri çekilen sürümler mevcut kilit dosyalarında çalışmaya devam ediyor ama yeni çözümlemelerde seçilmiyor. Yani o saatlerde sıfırdan derlenen ya da cargo update yapılan her proje, ayakta kalan tek sürüm olan 0.3.10’a gidiyordu.
build.rs neden bu kadar tehlikeli?
Bir crate’in kök dizininde build.rs varsa Cargo onu paketi derlemeden önce derleyip çalıştırıyor. Normalde C kütüphanesi derlemek ya da kod üretmek için kullanılıyor. Ama sonuçta senin kullanıcınla çalışan sıradan bir program. Videonun benzetmesi yerinde: Bu, npm’deki postinstall betiğinin Rust’taki karşılığı. Tek fark kurulumda değil, derlemede çalışması.
Wiz ve StepSecurity’nin analizine göre proc-macro1’in betiği şunu yapıyordu:
- Sunucu adresini base64 parçalarından birleştiriyor, TLS sertifika doğrulamasını kapatıp platforma uygun bir ikinci aşama indiriyor (Linux, Windows, Intel ve Apple Silicon macOS).
- Dosyayı
/tmp/rust-setupya da Windows’ta%TEMP%\rust-setup.ps1olarak yazıp arka planda başlatıyor. Derleme normal şekilde bitiyor, sen hiçbir şey fark etmiyorsun. - İkinci aşama bir arka kapı: makine adı, kullanıcı, işletim sistemi ve kurulu uygulamaları topluyor, komut alıp betik çalıştırabiliyor. systemd kullanıcı servisi, Windows Run anahtarı ya da LaunchAgent ile kalıcı oluyor. Ana sunucuya ulaşamazsa her beş günde değişen yedek alan adları üretiyor.
Wiz, ilk yazısında tarayıcı şifrelerinin çalındığını söylemiş, sonra düzeltmiş: Kod Chrome, Brave ve Edge’deki kayıtlı girişleri sadece listeliyor, şifreli içeriği almıyor.
Kuzey Kore bağlantısı
Wiz iki iz buldu. Arka kapının sunucuya mesaj attığı yol (/49890878), Microsoft’un Kuzey Kore’ye bağladığı Mastra saldırısında da kullanılmış. Bir kurbanın gördüğü sunucu IP’si de Google’ın, Mart’taki axios npm saldırısını anlattığı analizde geçiyor. Wiz bunu resmi bir atıf değil, altyapı örtüşmesi olarak sunuyor.
Videoda güzel bir soru var: npm’de kendi kendine yayılan solucanlar varken Rust’ta neden yok? Videoya göre teknik bir engel yok, çünkü cargo login token’ı her makinede ~/.cargo/credentials.toml dosyasında duruyor. Muhtemel sebep Rust geliştiricilerinin daha az olması.
Etkilendin mi?
Cargo.lockdosyalarında arrayref 0.3.10, internment 0.8.7, append-only-vec 0.1.9 ya daproc-macro1var mı bak.~/.cargo/registry/cache, CI önbellekleri vevendor/klasörlerinde de ara.- Varsa o makineyi ele geçirilmiş say: Payload dosyalarını ve kalıcılık kayıtlarını temizle, ortamı sıfırdan kur, erişebildiği bütün anahtar ve token’ları değiştir.
- Temiz sürümler: arrayref 0.3.9, internment 0.8.6, append-only-vec 0.1.8.
- Ağ erişimi gerektirmeyen bir crate’e
ureq,reqwest,rustlsgibi build bağımlılıkları eklendiyse dur ve bak. Köklü bir crate’in birden fazla sürümünün aniden geri çekilmesi de güncelleme sebebi değil, inceleme sebebi.
npm tarafındaki benzer önlemleri bu yazıda, derleme ve kurulumu ayrı bir alana kapatma fikrini de kod izolasyonu yazısında anlattık.
Sonra ne oldu?
Aynı gün RustSec veritabanına silinen crate’ler için kayıtlar eklendi (örneğin RUSTSEC-2026-0260 ve RUSTSEC-2026-0265). Böylece bu veritabanını okuyan cargo audit gibi araçlar kilit dosyandaki zararlı sürümleri işaretleyebiliyor. Ekim 2026 itibarıyla crates.io’da arrayref’in en güncel sürümü hâlâ saldırıdan önceki 0.3.9.
Düşün
- Projendeki bağımlılıklardan kaçının
build.rsdosyası var ve ne yaptıklarını biliyor musun? - CI’da
cargo build --lockedkullanıyor musun, yoksa her derleme yeni sürümlere mi açık?
Videoyu izle
Kaynaklar (10, İngilizce)
- Low Level: a lot of people are upset (video) (yeni sekmede açılır)
- Rust Blog: Supply chain attack on arrayref (yeni sekmede açılır)
- RustSec: RUSTSEC-2026-0260 (arrayref 0.3.10) (yeni sekmede açılır)
- RustSec: RUSTSEC-2026-0265 (proc-macro1) (yeni sekmede açılır)
- Wiz: Rust Supply Chain Attack on arrayref: Significant Overlap with DPRK Campaigns (yeni sekmede açılır)
- StepSecurity: arrayref Rust crate supply chain attack (yeni sekmede açılır)
- JFrog: Compromised Rust crates on crates.io silently execute malware at build time (yeni sekmede açılır)
- The Cargo Book: Build Scripts (yeni sekmede açılır)
- The Cargo Book: cargo yank (yeni sekmede açılır)
- crates.io: arrayref (yeni sekmede açılır)
Kendi cümlelerimizle yazılmış bir özettir, çeviri değildir. Tüm kaynaklar yukarıda.