FireAI Güvenlik Blogu

Yazan FireAI Security & Research Team · Yayınlandı

Güvenlik Triyajı için Apple Silicon'da Yerel Yüksek Lisans Çalıştırma

Güvenlik Triyajı için Apple Silicon'da Yerel Yüksek Lisans Çalıştırma

Bir ağ bağlantısını, bağlantıyı kuran Mac'te çalışan, görülmeye değer olup olmadığı olarak sınıflandıran bir model aynı anda üç şeyi değiştirir: makineden ne ayrılır, çalıştırmanın maliyeti ve ağın kendisi şüphe altındayken çalışmaya devam edip etmeyeceği. Her üçü de bir güvenlik aracı için dil modelinin diğer kullanımlarının çoğundan daha önemlidir; bu makalenin bir API çağırmak yerine özellikle cihaz üzerindeki durumla ilgili olmasının nedeni budur.

Neden özellikle triyaj için cihaz üzerinde?

Sınıflandırma için bir bulut modeline bağlantı günlük satırı göndermek, her bir karar için Mac'inizdeki hangi uygulamanın şu anda hangi ana bilgisayarla, hangi bağlantı noktasında konuştuğunu iletmek anlamına gelir. Bunların hiçbiri şifre gibi bir sır değildir, ancak bu tam olarak güvenlik bilincine sahip bir kurulumun paylaşımı en aza indirmeye çalıştığı türden bir meta veridir ve tüm amacı Mac'inizin başka bir yere ne göndermesine izin verildiğine karar vermek olan bir aracın, verdiği her karar için başka bir yere bir şey göndermeye bağlı olmamasının açık bir nedeni vardır. Modelin yerel olarak çalıştırılması bu bağımlılığı tamamen ortadan kaldırır: karar yolunda hiçbir ağ çağrısı olmadığından günlük hattı asla cihazdan ayrılmaz.

İkinci sebep sürekliliktir. Bulut tabanlı bir önceliklendirme adımı yalnızca internet bağlantınız ve satıcının API'si kadar kullanılabilir; bunların her ikisi de gerçek bir olay sırasında tam olarak bozulabilecek veya kasıtlı olarak kesilebilecek şeylerdir. Yerel bellekte çalışan bir model, ağ kapalıyken, Wi-Fi kapalıyken veya API çağrısının kullanacağı bağlantıda şüpheli bir uzlaşma devam ederken yanıt vermeye devam ediyor.

MLX: Apple'ın kendi dizi çerçevesi

MLX, Apple'ın makine öğrenimi araştırma ekibi tarafından özellikle Apple silikon için Python, C++, C ve Swift API'leri ile oluşturulmuş bir dizi çerçevesidir. Kendi belgeleri, tanımlayıcı tasarım tercihi olarak birleşik bir bellek modelini tanımlıyor: MLX'teki diziler, paylaşılan bellekte yaşar ve bunlar üzerindeki işlemler, modelin ağırlıkları önce ayrı bellek havuzları arasında kopyalanmadan, desteklenen herhangi bir cihazda (CPU veya GPU) çalıştırılabilir. Bu, bir dizüstü bilgisayar için somut olarak önemlidir: ayrık GPU'lu bir makinenin, herhangi bir şeyi hesaplamadan önce bir veri yolu üzerinden modelin ağırlıklarını GPU belleğine kopyalaması gerekir; bu da zaman kaybına neden olur ve bellek ayak izini iki katına çıkarır; Mac'in birleşik bellek mimarisinde CPU ve GPU zaten aynı fiziksel belleği paylaşıyor, dolayısıyla kopyalanacak hiçbir şey yok.

MLX'te dil modellerini çalıştırmaya yönelik yardımcı paket olan mlx-lm, tek bir komutla kurulur ve varsayılan bir modeli kutudan çıkarır:

MLX kurulumu
pip install mlx-lm
# runs the default model (mlx-community/Llama-3.2-3B-Instruct-4bit)
mlx_lm.generate --prompt "How tall is Mt Everest?"
# or name a specific quantized model from the mlx-community hub
mlx_lm.generate --model mlx-community/Mistral-7B-Instruct-v0.3-4bit --prompt "..."
# interactive chat session instead of a single prompt
mlx_lm.chat
# convert and quantize a model yourself
mlx_lm.convert --model mistralai/Mistral-7B-Instruct-v0.3 -q

llama.cpp: taşınabilir seçenek

llama.cpp, C/C++ ile yazılan ve çıkarım zamanında Python çalışma zamanı gerektirmeyen, daha eski ve daha yaygın olarak taşınan olanıdır. Kendi README'si, projenin bu donanım üzerindeki konumunu doğrudan belirtir: Apple silikonu, projenin deyimiyle, "ARM NEON, Accelerate ve Metal çerçeveleri aracılığıyla optimize edilmiş birinci sınıf bir vatandaş" olarak ele alınır ve derleme belgeleri, macOS'ta Metal GPU arka ucunun varsayılan olarak etkin olduğunu ve özellikle yalnızca CPU çıkarımı istiyorsanız bunu devre dışı bırakacak bir oluşturma zamanı bayrağıyla birlikte etkinleştirildiğini doğrular.

lama.cpp oluştur ve çalıştır
git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp
cmake -B build
cmake --build build --config Release
# Metal is on by default on macOS; add -DGGML_METAL=OFF to the first
# command above if you need to force CPU-only inference
llama cli -hf ggml-org/Qwen3.5-0.8B-GGUF
# or run it as a local server instead of a one-shot command
llama serve -hf ggml-org/Qwen3.5-0.8B-GGUF

llama.cpp, nicelenmiş ağırlıkları ve bunları çalıştırmak için gereken her şeyi bir araya getiren tek dosyalı bir model formatı olan GGUF dosyalarından çalışır; Yukarıdaki komut, bir Hugging Face deposundan doğrudan ismine göre çeker. Buna karşılık MLX, modelleri önceden kendi formatına dönüştürüp nicelendirerek yerel Python iş akışına daha yakın durur. İkisi de kesinlikle daha iyi değildir: Python bağımlılığı olmayan tek bir derlenmiş ikili dosya istiyorsanız ulaşmanız gereken dosya llama.cpp'dir; işlem hattınızın geri kalanını zaten Python'da oluşturuyorsanız ve oradan Apple'ın birleşik bellek modeline birinci sınıf erişim istiyorsanız ulaşacağınız dosya MLX'tir.

Niceleme: Daha küçük bir model karşılığında gerçekte ne satıyorsunuz?

Niceleme, her model ağırlığını, modelin eğitildiği 16 veya 32 bitten daha az bitte saklar, hem diskteki dosyayı hem de onu çalıştırmak için gereken belleği, çıktı kalitesinin bir miktar maliyetiyle küçültür. llama.cpp'nin kendi niceleme belgeleri, desteklediği her şema için ağırlık başına bit rakamlarını kesin olarak listeler; bu, "4-bit" veya "8-bit" şeklindeki alışılagelmiş kısaltmalardan daha kesin bir şekilde ödünleşim hakkında akıl yürütmenin yoludur:

Llama.cpp'nin niceleme aracı belgelerinden.
Şema ailesiÖrnek şemalarAğırlık başına bit
Tam hassasiyet (referans)F1616.0
Neredeyse kayıpsızS8_08.50
Daha yüksek kaliteli orta sınıfQ5_K_S / Q5_K_M5.57 - 5.70
Dengeli kalite ve boyutQ4_K_S / Q4_K_M4.67 - 4.89
Daha küçük, daha kayıplıQ3_K_S / Q3_K_M / Q3_K_L3.64 - 4.30
Aşırı sıkıştırmaIQ2_XXS ... IQ2_M2,00 - 2,93

Bir modelin parametre sayısını ağırlık başına bit rakamıyla çarpmak, yalnızca ağırlıklar için kaba bir bellek tahmini verir: Q4_K_M'nin ağırlık başına 4,89 bitindeki 7 milyar parametreli bir model, bağlam penceresini ve ne kadar metin eklediğinize bağlı olarak en üste daha fazlasını ekleyen ara etkinleştirmeleri hesaba katmadan önce yaklaşık 7.000.000.000 × 4,89 ÷ 8 bayta veya yaklaşık 4,3 GB'ye ihtiyaç duyar. onu besle. Bu, her iki projenin de doğrudan yayınladığı bir sayı değil, belirtilen ağırlık başına bit rakamına göre yapılan bir hesaplamadır ve gerçek bir istem ve bağlamı yüklendiğinde gerçek bellek kullanımı daha yüksek olacaktır. Tablodan takip edilen pratik rehberlik basittir: girişin kısa olduğu ve gerekli çıkışın küçük yapılandırılmış bir karar olduğu bir seferde bir bağlantı günlük hattını sınıflandırmak gibi bir görev için, Q4_K_M sınıfı bir model genellikle doğru ticarettir - Q8_0 veya F16'dan belirgin şekilde daha küçük ve daha hızlıdır ve çıktı kalitesinin daha keskin bir şekilde düştüğü aşırı sıkıştırma katmanına düşmez.

Her iki proje de Mac yapılandırması başına bir bellek gereksinimi yayınlamaz, bu nedenle pratik yaklaşım, yukarıdaki tahminden geriye doğru çalışmak ve gerçek boşluk bırakmaktır: macOS'un kendisi, tarayıcınız ve çalışan diğer her şey de birleştirilmiş belleğe ihtiyaç duyar ve başka hiçbir açık şeye zar zor uyan bir model, başka bir uygulamaya geçtiğiniz anda takas olur veya durur. Mütevazı miktarda birleştirilmiş belleğe sahip bir Mac'te bu, yukarıdaki tablonun daha küçük ucunda kalmayı (aynı nicelemede çok daha büyük bir model yerine Q4_K_M'de birkaç milyar parametre) kalmayı ve yedek belleğe sahip makineler için daha büyük, daha yüksek hassasiyetli seçenekleri ayırmayı savunuyor. Bu makalenin ilgili olduğu gibi dar bir sınıflandırma görevi için, kesin bir soru sorulan daha küçük bir model, belirsiz bir soru verilen daha büyük bir modele göre hem daha hızlı hem de pratikte daha tutarlı olma eğilimindedir.

Her iki proje de aktif olarak geliştirilme aşamasındadır ve dürüst bir karşılaştırma, "hangisi daha iyi"den ziyade "hangisi sizin projenize uyuyor" sorusudur. llama.cpp, çıkarım zamanında hiçbir Python çalışma zamanı gerektirmeden tek bir ikili dosya halinde derlenir; bu, eğer onu yanına bir Python yorumlayıcısı göndermeden başka bir yazılım parçasının içine gömmek istiyorsanız önemlidir. MLX, halihazırda Python'da (veya aynı zamanda bağlamalar da sağlayan Swift'de) çalıştığınızı varsayar ve bunu Apple'ın kendi makine öğrenimi yığınına ve yukarıda açıklanan birleşik bellek modeline daha sıkı entegrasyonla ödüllendirir. Bağımsız bir macOS uygulaması olarak oluşturulmuş bir güvenlik aracı, FireAI'nin de içinde bulunduğu durum, bu spektrumun llama.cpp ucuna daha yakın duruyor; Hangi istem modelinin en iyi şekilde çalıştığını araştıran bir araştırma defteri, MLX'in sonuna daha yakın duruyor.

Bir bağlantıyı tetiklemek için bilgi istemi modeli

Küçük bir yerel modele soracağınız soru ne kadar dar olursa, o kadar güvenilir yanıt verir. Tek bir bağlantı için bu, ona tam olarak bir insan incelemecinin bakacağı alanları vermek (başka bir şey değil, hiçbir çıkarım yapılmadı) ve serbest biçimli düzyazı yerine yapılandırılmış bir karar istemek anlamına gelir:

önceliklendirme bilgi istemi şablonu (açıklayıcıdır, herhangi bir veri kümesiyle test edilmemiştir)
System: You review one outbound network connection at a time. You are
given only the fields listed below. Do not assume anything not stated.
Respond with exactly two lines: a verdict (allow, ask, or block) and a
one-sentence reason a non-expert could understand.

Connection:
  app: UpdaterHelper.app
  code_signature: unsigned
  destination: 91.203.xxx.xxx:4444
  protocol: TCP
  threat_feed_hit: none
  first_seen: yes (no prior rule for this app)

Verdict:

Önemli olan alanlar, kod imzalama kontrolünün ve tehdit akışının aslında tahmin etmeden üretebileceği alanlardır: ikili dosyanın imzalanıp imzalanmadığı ve kim tarafından imzalandığı, nereye ve hangi bağlantı noktasında bağlanmaya çalıştığı, bu hedefin bir tehdit akışında görünüp görünmediği ve bu uygulamanın ilk kez bağlanmaya çalışıp çalışmadığı. Açık uçlu bir açıklama yerine sabit iki satırlı bir çıktı istemek, sonucun günlüğe kaydedilmesini, binlerce bağlantı arasında karşılaştırılmasını kolaylaştırır ve modelin, kontrol edilebilir bir şey söylemeden otoriter görünen korunma diliyle doldurulmasını çok daha zor hale getirir.

Küçük bir model zaten ara sıra istenen formatı görmezden gelecektir - iki yerine üç satır, fazladan bir uyarı, istediğiniz üç kelimeden biri olmayan bir karar kelimesi. Bunu bir modelleme sorunu olarak değil, bir mühendislik sorunu olarak ele alın: Çıktıyı tam olarak beklediğiniz şekle göre doğrulayın ve eşleşmiyorsa, daha gevşek bir yanıtı ayrıştırmaya çalışmak yerine ya yeniden sorun ya da en güvenli karara (sorun, bir insanı gösterin anlamına gelir) geri dönün. Hatalı biçimlendirilmiş çıktıda güvenli bir şekilde başarısız olan bir triyaj adımı, ara sıra kendinden emin görünen ancak ayrıştırılamaz bir çizgi üretip onu sessizce bırakan bir önceliklendirme adımından çok daha faydalıdır.

Bu modeli tek tek bağlantı denemeleri yerine tüm gün boyunca bağlantı denemeleri yapın ve iş yükünün şekli değişir: çoğu bağlantı mevcut bir kurala sahip uygulamalardan gelir ve asla modele ulaşmaz, daha küçük bir sayı gerçekten ilk kez görülür ve bir karara varılır ve bu kararların yalnızca bir kısmı rutin izin vermenin dışında bir şeydir. Bu noktada modelin asıl işi güvenlik uzmanı olmak değil; ilk görülen bağlantıların uzun bir listesini, bir kişinin gerçekten bakması gereken küçük alt kümeye indirgemektir; bu, birkaç milyar parametreli bir model için açık uçlu güvenlik yargısından çok daha ulaşılabilir bir hedeftir.

Bu nerede yanlış gidiyor

  • Küçük bir yerel model kendinden emin, iyi yazılmış, tamamen yanlış bir neden üretebilir. Yerel olarak çalıştırmayla ilgili hiçbir şey bu riski değiştirmez; sadece hatanın nerede gerçekleştiğini değiştirir, gerçekleşip gerçekleşemeyeceğini değil.
  • Bağlam pencereleri sonludur ve uzun, gürültülü bir günlük sığmaz. Model verileri görmeden önce özetlemek veya ön filtreleme yapmak kendi hata noktasını ortaya çıkarır; model ona bakma şansı bulamadan önemli olan tek satırı kaybedebilirsiniz.
  • Model yalnızca günlük satırının içerdiğini görür. Şifrelenmiş trafiğin içini göremez, bir tehdit akışının güncel olduğunu doğrulayamaz ve niyetinizi bilemez; bilerek yeni yüklediğiniz bir araçtan gelen bağlantı, daha önce duymadığınız bir araçtan gelen bağlantıyla aynı görünür.
  • Karar bir eylem değildir. Buradaki hiçbir şey kendi başına bir bağlantıyı engellememeli, silmemeli veya sessizce izin vermemelidir; kişinin yine de sebebini görmesi, onaylaması ve modelin yanlış anlaması durumunda çağrıyı tersine çevirebilmesi gerekiyor.

Bu son nokta, bir dizüstü bilgisayarda çalışan küçük nicelenmiş bir modele özgü bir sınırlama değildir; yerel veya bulut, küçük veya büyük her otomatik güvenlik kararı için geçerlidir. Yerel olarak çalıştırmanın değeri, döngüde bir insana olan ihtiyacı ortadan kaldırdığı iddiası değil, denklemden çıkardığı şeydir (bir ağ bağımlılığı, yinelenen bir fatura, bağlantı meta verilerinizi alan bir üçüncü taraf).

FireAI'nin bu modele uyduğu yer

HisnLabs'ın Mac için güvenlik duvarı olan FireAI, genel amaçlı bir sohbet modelinden daha dar bir kapsamda aynı fikir üzerine inşa edilmiş bir şey sunar: isteğe bağlı bir yerel model, yaklaşık 1,5 GB'lık ek bir indirme, tamamen Mac üzerinde çalışır ve henüz kuralı olmayan uygulamalardan gelen bağlantıları inceler. Apple silikon üzerinde macOS 14 veya sonraki bir sürümünü gerektirir, genel tehdit akışlarını uzak bir hizmete göre kontrol etmek yerine yerel olarak uygular ve kararının nedenini sizden bağlantıya izin vermenizi veya reddetmenizi istemek için kullandığı aynı izin isteminde gösterir; bu kararların her biri görünür, düzenlenebilir bir kural haline gelir ve bunlardan herhangi biri geri alınabilir. Bunun ne olduğu ve ne olmadığı konusunda net olmakta fayda var: Bu, bu makalenin tanımladığı açık uçlu, birkaç milyar parametreli sohbet modeli değildir ve bir antivirüs veya VPN değildir; yerel olarak dar bir sınıflandırma işi yapar ve son çağrıyı, istemi okuyan kişiye bırakır.

FireAI ve HisnLabs burada nereye oturuyor

FireAI’s own connection reviewer is this exact bet, made narrower still: an optional, roughly 1.5 GB on-device model, macOS 14 and up, Apple silicon only, reviewing one thing (should this unknown app reach this destination) with a visible reason and an undo button — and, like the triage pattern in this article, it still needs a person to confirm anything consequential.

FireAI, HisnLabs’in kendi ürünüdür: doğrudan Mac’inizde çalışan, yapay zekâ destekli bir güvenlik duvarı. Uygulamalarınızın kurduğu her bağlantıyı sade bir dille gösterir ve Mac’inizden neyin çıkacağına sizin karar vermenizi sağlar — yapay zekâsı yerel olarak çalışır, yani trafiğiniz asla bize ya da başka birine gönderilmez. HisnLabs güvenlik araştırma ekibi bu kararların isabetli kalmasını sağlayan ekiptir: hangi alan adlarının sıradan telemetri, hangilerinin gerçek bir hizmet olduğunu kataloglar, bir bağlantının ardındaki ülkeyi ve ağı izler ve cihaz üzerindeki modeli (Autopilot özelliği) gerçek trafik örüntüleriyle eğitir — üstelik bunların hiçbiri Mac’inizden dışarı çıkmadan.

Arkasındaki teknik kararları okuyabilir ya da FireAI’yi 17 gün boyunca deneyebilirsiniz: HisnLabs’ten FireAI.

Kaynaklar