← Radar

Konu: Güvenlik3 dk okuma

arrayref: Rust'ta cargo build bile yetti, sahte bir bağımlılık derleme anında arka kapı kurdu

Bu neden önemli?

Rust bellek hatalarının çoğunu önlüyor ama tedarik zinciri saldırılarını önlemiyor. build.rs, npm'deki kurulum betiklerinin Rust'taki karşılığı: derleme sırasında senin yetkinle kod çalıştırıyor. Saldırının altyapısı da axios saldırısıyla örtüşüyor, yani aynı ekipler artık Rust ekosistemine de bakıyor.

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-setup ya da Windows’ta %TEMP%\rust-setup.ps1 olarak 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.lock dosyalarında arrayref 0.3.10, internment 0.8.7, append-only-vec 0.1.9 ya da proc-macro1 var mı bak. ~/.cargo/registry/cache, CI önbellekleri ve vendor/ 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, rustls gibi 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.rs dosyası var ve ne yaptıklarını biliyor musun?
  • CI’da cargo build --locked kullanıyor musun, yoksa her derleme yeni sürümlere mi açık?

Videoyu izle

Tıklayınca video YouTube'dan yüklenir; o ana kadar bu sayfa YouTube'a hiçbir istek göndermez.
Kaynaklar (10, İngilizce)

Kendi cümlelerimizle yazılmış bir özettir, çeviri değildir. Tüm kaynaklar yukarıda.