“Bunu bir sandbox'ta çalıştır” tek bir talimat gibi duyulur. Pratikte insanlar bununla yaygın dört sınırdan birini kasteder ve bunlar çok farklı şeyleri durdurur. Yanlışını seçmek ya sizi korumasız bırakır ya da her çalıştırmayı gerektiğinden yavaş ve pahalı yapar.
Bu karşılaştırma, kodun gerçekten güvenilmez olduğunu varsayar: bir dil modeli tarafından yazılmış, bir kullanıcı tarafından gönderilmiş ya da tanımadığınız birinden gelen bir pull request'te ulaşmış. Kendi yazdığınız kodun ihtiyaçları farklıdır.
Neler ters gidebilir
Sınırları karşılaştırmadan önce ne işe yaradıklarını adlandırmak faydalıdır. Güvenilmeyen kod şunları yapabilir:
- Okumaması gerekeni okumak: ortam değişkenleri, SSH anahtarları, ana dizininizdeki dosyalar, bulutun meta veri uç noktaları.
- Kaynakları tüketmek: sonsuza dek döngüde kalmak, makine kilitlenene kadar fork etmek, diski doldurmak.
- Ağı kötüye kullanmak: başka sunucuları taramak, spam göndermek, kripto para madenciliği yapmak, iç hizmetlerinizi çağırmak.
- Yerleşmek: görevden sonra da yaşayan bir cron işi ya da hizmet kurmak.
- Kaçmak: alttaki katmandaki bir hatayı kullanarak ana makinenin kendisinde kod çalıştırmak.
Aşağıdaki her seviye bunların bir kısmıyla başa çıkar, hepsiyle değil.
Seviye 1: bir süreç
En basit sandbox bir alt süreçtir: zaman aşımlı bir subprocess.run, belki ayrı bir kullanıcıyla, titizseniz kaynak limitleri ve bir seccomp filtresiyle.
Durdurur: sonsuz çalışmayı (zaman aşımı), kaynak tüketiminin bir kısmını (limitler), bazı tehlikeli sistem çağrılarını (seccomp). Durdurmaz: o kullanıcının okuyabildiği her şeyi okumayı, ağ erişimini, kullanıcının yazabildiği her yer üzerinden yerleşmeyi ve herhangi bir çekirdek hatasını. Tipik çöküş: kod, okunabilir olduğunu unuttuğunuz bir dosyayı okur ya da “kısıtlı” bir dil yorumlayıcısının bir arka kapısı olduğu ortaya çıkar. Tarih, dayanamamış dil içi sandbox'larla doludur.
Açılış süresi neredeyse sıfırdır. Kendi kodunuz için iyidir; başkasının kodu için bir sınır değildir.
Seviye 2: bir konteyner
Namespace'ler koda dosyalar, süreçler ve ağ üzerinde kendine ait bir görünüm verir; cgroup'lar CPU'yu ve belleği sınırlar; kaldırılan capability'ler ve seccomp çekirdekten isteyebileceklerini daraltır.
Durdurur: ana makinenin dosyalarını okumayı (bağlanmadıkça), diğer süreçleri görmeyi, sınırsız kaynak kullanımını ve konteyner atılırsa yerleşme sorununun büyük kısmını. Durdurmaz: ana makinenin ortak çekirdeğindeki bir hatayı. Makinedeki tüm konteynerler aynı çekirdekle konuşur, bu yüzden erişilebilir bir çekirdek açığı bir çıkıştır. Tipik çöküş: egzotik exploit'lerden çok yapılandırma. Ayrıcalıklı bir konteyner, konteyner çalışma zamanının soketinin içeri bağlanması, ana makinenin ağının “sadece hata ayıklama için” açılması. Her biri sınırı sessizce ortadan kaldırır.
Açılış süresi milisaniyelerdir. Sertleştirilmiş varyantlar vardır; aralarında sistem çağrılarını ana makineye ulaşmadan yakalayan kullanıcı alanı çekirdekleri de bulunur, ancak hız ve uyumluluk pahasına. Güvendiğiniz kişilerin kodu için iyi yapılandırılmış bir konteyner makul bir varsayılandır.
Seviye 3: bir microVM
MicroVM, tıpkı tam bir VM gibi kendi çekirdeğini bir hipervizör altında çalıştırır, ama neredeyse hiç emüle edilmiş donanım olmadan. En bilinen örneği Firecracker'dır.
Durdurur: bir konteynerin durdurduğu her şeyi, artı ortak çekirdek sorununu. Ana makineye ulaşmak için kodun hipervizörü ya da bir avuç sanal cihazdan birini kırması gerekir; bu, bir çekirdeğin sistem çağrısı arayüzünden çok daha küçük bir yüzeydir. Durdurmaz: ona verdiğiniz şeylerin kötüye kullanılmasını. Açık giden trafik yine istismar edilebilir; enjekte edilen sırlar yine sızabilir. Tipik çöküş: yalıtım değil, politika. Biri “testler çalışsın diye” bir üretim token'ı iletir ya da gerekmeyen yerde giden trafiği kısıtlamasız bırakır.
Açılış süresi saniyenin bir kesri ile yaklaşık bir saniye arasındadır ve birkaç megabayt ek yük getirir. Bu, görev başına bir tane oluşturup sonra silecek kadar hızlıdır; bu da yerleşme sorununu kendiliğinden çözer: geri dönülecek hiçbir şey kalmaz.
Seviye 4: tam bir sanal makine
Normal bir VM ya da VPS, microVM ile aynı türden bir sınıra sahiptir: donanım sanallaştırması ve bir hipervizör. Fark etrafındaki her şeydedir: tam bir cihaz modeli, koca bir işletim sistemi, isterseniz genel bir IP ve günlerle ya da aylarla ölçülen bir yaşam döngüsü.
Durdurur: microVM ile aynı sorun sınıflarını; daha fazla donanım emüle edildiği için saldırı yüzeyi biraz daha büyüktür. Durdurmaz: kendi ağ kimliğinin kötüye kullanılmasını. Genel IP'li ve kötü amaçlı kod çalıştıran bir VM, kendi IP'sini engelleme listelerine sokar; aynı IP e-postanızı da gönderiyorsa bu önemlidir. (Bu zaten olduysa bkz. IP'niz bir engelleme listesindeyse ne yapmalı.) Tipik çöküş: fazla uzun yaşar. Tek bir deney için oluşturulan bir VM kimlik bilgileri ve durum biriktirir ve yavaş yavaş korumakla görevli olduğu güvenilir makineye dönüşür.
Açılış süresi onlarca saniyeden dakikalara kadardır ve faturalama genellikle aylıktır. Gelen portlara ihtiyaç duyan uzun ömürlü bir hizmet için doğru biçim, 20 saniyelik bir kod çalıştırması için yanlış biçimdir.
Karşılaştırma
| Süreç | Konteyner | MicroVM | Tam VM | |
|---|---|---|---|---|
| Kendi çekirdeği | hayır | hayır | evet | evet |
| Ana sınır | kullanıcı izinleri | namespace'ler + ortak çekirdek | hipervizör, minicik cihaz modeli | hipervizör, tam cihaz modeli |
| Açılış süresi | ~0 | ms | ~0.1–1 sn | 10 sn – dakikalar |
| Ek yük | yok | küçük | birkaç MiB | onlarca–yüzlerce MiB |
| Her görevden sonra atmak | kolay | kolay | kolay | yavaş, pahalı |
| Gelen portlar / genel IP | ana makinenin | ana makinenin | genellikle yok | evet |
Seçim
- Sizin ya da ekibinizin yazdığı kod: bir süreç ya da konteyner yeterlidir.
- Kendi branch'leriniz için CI: runner'ınızda bir konteyner.
- Ajan kodu, kullanıcı gönderimleri, dış pull request'ler: görev başına bir microVM, sonra silinir.
- Bağlantı kabul etmesi ya da haftalarca çalışması gereken güvenilmeyen bir hizmet: kimlik bilgilerinizi tutan ya da e-postanızı gönderen her şeyden uzakta, kendi IP'si olan ayrı bir VM.
Ne seçerseniz seçin, üstüne iki kural geçerlidir: kodun yazarına vermeyeceğiniz hiçbir şeyi içeri koymayın ve ağın neler yapabileceğine bilinçli olarak karar verin.
Ürünlerimiz nerede duruyor
Seviye 3 için kod sandbox'ları sunuyoruz: yaklaşık bir saniyede açılan, giden interneti olan, gelen portu olmayan ve saniye bazında faturalanan Firecracker microVM'leri. Tam olarak yukarıdaki üçüncü maddeyi hedefliyorlar; MCP güvenlik önlemleri sayfası bir ajanın onlarla neler yapabileceğini nasıl sınırlayacağınızı anlatıyor. Seviye 4 için AI agent tarifesi gibi bir VPS size aylık olarak koca bir makine verir. Yapay zekâ ajanları için sandbox içindeki çalışılmış örnekler microVM düzenini baştan sona gösteriyor; yapay zekâ ajanlarının altyapıdan gerçekte neye ihtiyacı var ise yalıtımı birkaç gereksinimden biri olarak ele alıyor.
Yorumlar
Henüz yorum yok. İlk olun.