Series · 3 partsBrowser-to-Native Trust BoundariesPart 3 · You are here
- 1Extension Sandbox'taydı. Native Host Değildi.
- 2Sayfanın İzni Yoktu. Extension'ın Vardı.
- 3Paket İmzalıydı. Güncelleme Yine de Bir Güvenlik Kararıydı.You are here
60 saniyede güven sınırı
Geçerli bir extension imzası dar bir soruyu yanıtlar: bu paket, browser’ın bu extension için beklediği kimlikten mi geldi? Release’in incelenmiş commit’ten üretildiğini, build runner’ın temiz olduğunu, publisher hesabının bu upload’ı gerçekten amaçladığını, izinlerin genişlemediğini veya remote configuration’ın yeni bir capability etkinleştiremeyeceğini kanıtlamaz.
Chrome extension güncellemelerini başlangıçta ve birkaç saatte bir otomatik kontrol eder. Uygun bir Manifest V3 güncellemesi extension idle duruma geçtiğinde kurulur. Yönetilen ortamlarda policy bir version’ı sabitleyebilir veya update source’u değiştirebilir. Firefox’ta AMO üzerinden listelenen add-on’lar mağaza akışından; self-distributed add-on’lar ise HTTPS update manifest üzerinden güncellenebilir. Release ve beta sürümlerinde Mozilla signing gereksinimi devam eder.
Bu kontroller dağıtım mekanizmasını kurar. Asıl güvenlik kararı şudur:
Browser’da extension yetkisi kullanan kodu hangi incelenmiş source, build identity, artifact digest, publisher eylemi, permission set, rollout cohort ve runtime configuration üretti?
Serinin final bölümü bu soruya kötü amaçlı bir extension yayınlamadan ve gerçek bir kullanıcı filosuna dokunmadan, tekrarlanabilir kanıtla yanıt veren bir yöntem kuruyor.
Tek release, yedi principal
| Principal | Güvenlik kararı | Korunması gereken kanıt |
|---|---|---|
| Source reviewer | Değişiklik amaçlı ve sınırlandırılmış mı? | Commit, review, changed files, threat note |
| Build service | Onaylı source bu paketi mi üretti? | Workflow identity, clean runner, dependency lock, log |
| Artifact store | Bu çıktı incelenen artifact’in aynısı mı? | SHA-256, manifest snapshot, SBOM, provenance |
| Publisher account | Upload yetkili miydi? | Güçlü authentication, actor, timestamp, digest |
| Store veya update host | Hangi client’a hangi version sunuldu? | Version mapping, update URL, rollout record |
| Browser | Gerçekte hangi paket kurulu? | Extension ID, version, permission, update source |
| Runtime control plane | Şu anda hangi davranış aktif? | Effective config, cohort, expiry, audit event |
Platform neyi kanıtlar, neyi kanıtlamaz?
| Platform kontrolü | Kanıtladığı | Kanıtlamadığı |
|---|---|---|
| Package signature | Beklenen extension identity ile süreklilik | Release’in güvenli veya reviewed source ile aynı olduğu |
| Store review | Gönderilen paketin mevcut inceleme sürecini geçtiği | Publisher credential ve gelecekteki release’lerin güvenli kalacağı |
| Manifest V3 packaged code | Extension logic’in paket içinde bulunduğu | Remote data’nın gizli instruction language olamayacağı |
| Permission warning | Bazı capability artışlarının görünür olabileceği | Mevcut geniş izinlerin yalnızca eski amaçla kullanıldığı |
| HTTPS update manifest | Server authentication ve transit integrity | Update origin ve publisher pipeline’ın doğru yetkilendirildiği |
| Version pin | Bir cohort’un belirli version’da kaldığı | Sabitlenen sürümün güvenli olduğu |
| Staged rollout | Maruziyetin zamana ve cohort’a bölünebildiği | Cohort’un gözlendiği veya rollback’in tamamlandığı |
Extension update yalnızca yeni code değildir. tabs, cookies, storage, downloads, host access
veya native messaging bridge taşıyan bir principal’ın filo genelindeki authority değişimidir.
Beş failure family
| Failure family | Kaybedilen sınır | Gözlenebilir sonuç |
|---|---|---|
| Publisher takeover | Store account veya upload token tek başına release authority olur | Geçerli dağıtılan fakat yetkisiz paket |
| Build substitution | CI output, reviewed source’a bağlanmaz | Signed artifact incelenmemiş code veya dependency içerir |
| Permission drift | Review effective capability delta’yı ölçmez | Güncelleme daha geniş host veya browser access kazanır |
| Configuration-as-code | Remote JSON bounded data yerine operation seçer | İncelenmiş paket, incelenmemiş davranış etkinleştirir |
| Rollout blindness | Upload tamamlanması release başarısı sayılır | Riskli version’lar bazı cohort’larda aktif kalır |
Remote hosted code kısıtları değerli bir kontroldür; fakat araştırma sorusu daha geniştir. Remote response’un logic haline gelmesi için JavaScript taşıması gerekmez. Keyfi operation, URL, selector, expression veya rule kabul eden configuration grammar güvenlik kararını reviewed package dışına taşıyabilir.
Sınırlandırılmış sentetik release lab’ı
Bu lab store upload veya gerçek kullanıcı gerektirmez. Disposable extension ID, local mock update
service, iki inert package ve tek canary capability kullanın: extension-local storage içindeki bir
counter’ı artırmak. 1.0.0 yalnızca release_a; 1.0.1 ise artifact, permission, configuration ve
rollout gate’lerinden geçtikten sonra release_b değerini artırabilsin.
Positive test yalnızca yetkili package ve cohort’un amaçlanan canary’yi değiştirebildiğini kanıtlar. Negative control’lar farklı digest, beklenmeyen permission, expired config, yanlış cohort ve replay edilmiş approval’ın hiçbir state change üretmediğini göstermelidir.
Artifact contract oluşturun
Release bilgisini incident sonrası tahmin etmek yerine package yanında üretin:
{
"extension_id": "lab-extension",
"version": "1.0.1",
"source_commit": "8d6d...e21",
"workflow_identity": "release.yml@refs/tags/v1.0.1",
"artifact_sha256": "7f4a...91c",
"manifest_sha256": "c1e3...a42",
"permissions": ["storage", "activeTab"],
"host_permissions": ["https://lab.invalid/*"],
"sbom_sha256": "0bd2...723",
"built_at": "2026-08-31T07:00:00Z"
}
Publisher bu contract’ı upload ettiği artifact ile karşılaştırmadıkça kanıt zinciri tamamlanmaz. Kontrolsüz upload sonrasında üretilen digest authorization değil, yalnızca dokümantasyondur.
Manifest değişimini security change olarak ele alın
Manifest extension’ın ilan edilmiş authority surface’idir. Application code’dan ayrı diff edin ve beklenmeyen eklemelerde fail closed davranın.
const authority = (manifest) => ({
permissions: [...(manifest.permissions ?? [])].sort(),
optional_permissions: [...(manifest.optional_permissions ?? [])].sort(),
host_permissions: [...(manifest.host_permissions ?? [])].sort(),
content_scripts: (manifest.content_scripts ?? []).map(
({ matches, all_frames, world }) => ({
matches: [...matches].sort(),
all_frames: Boolean(all_frames),
world: world ?? "ISOLATED",
}),
),
externally_connectable: manifest.externally_connectable ?? null,
update_url: manifest.update_url ?? null,
});
Normalize edilen sonucu önceki production release ile karşılaştırın. Yeni host pattern,
all_frames, external caller, native messaging, debugger access veya update-source değişikliği named
reviewer ve açık gerekçe gerektirir. Version bump gerekçe değildir.
Remote configuration’ı policy çizgisinin altında tutun
Güvenli configuration paketlenmiş ve sınırlandırılmış davranışlardan birini seçer:
{
"schema": 2,
"issued_at": "2026-08-31T07:00:00Z",
"expires_at": "2026-08-31T08:00:00Z",
"cohort": "canary-05",
"flags": { "new_panel": false },
"limits": { "batch_size": 20 }
}
Yüksek riskli configuration ise dispatcher, URL, expression, selector veya script benzeri data kabul eder:
{
"operation": "run",
"target": "https://runtime-selected.example/*",
"steps": [{ "action": "inject", "payload": "server-controlled" }]
}
Unknown key’leri reddedin; küçük bir schema uygulayın; document’ı release version ve cohort’a bağlayın; expiry doğrulayın; invalid durumda son bilinen güvenli packaged behavior’a dönün. Configuration signature control plane’i authenticate edebilir. Aşırı güçlü grammar’ı güvenli yapmaz.
Rollout yüzde değil, state machine’dir
Reproduction methodology
- Release identity, update source, store role, CI credential ve runtime config envanterini çıkarın.
- Aynı tagged source’u iki isolated runner’da build edin; çıktıları karşılaştırın veya her nondeterministic byte’ı açıklayın.
- Upload öncesinde unpacked manifest ve package digest’i kaydedin.
- Beklenmeyen permission ve host pattern test edin; release gate ikisini de reddetmeli.
- Yetkili paketi yalnızca synthetic canary cohort’a sunun.
- Approval’ı farklı digest ile replay edin; publish veya promotion gerçekleşmemeli.
- Expired, oversized, unknown-key, wrong-cohort ve wrong-version config servis edin.
- Rollback’in test edilen etkiyi kaldırdığını ve eski version’da kalan client’ları kanıtlayın.
Test matrix
| Boyut | Varyantlar | Güvenli sonuç |
|---|---|---|
| Source | Reviewed tag, moved tag, unreviewed commit | Yalnızca immutable reviewed source build edilir |
| Build | Clean runner, değiştirilmiş dependency, reused workspace | Artifact veya provenance delta release’i durdurur |
| Artifact | Expected digest, repackaged ZIP, manifest drift | Yalnızca exact authorized digest ilerler |
| Publisher | Human MFA, scoped workload identity, stale token | Short-lived scoped identity; stale token reddedilir |
| Permission | Same, added optional, broad host, native bridge | Authority artışı explicit review gerektirir |
| Update source | Store, approved enterprise URL, unexpected override | Envanter policy ve installed state ile eşleşir |
| Configuration | Valid, expired, replayed, unknown key, wrong cohort | Invalid document privileged effect üretmez |
| Rollout | Canary, staged, pinned, offline, rollback | Her installed cohort gözlenebilir ve sınırlandırılmıştır |
Evidence matrix
| İddia | Positive evidence | Negative control | Güçlü sonuç |
|---|---|---|---|
| Reviewed source paketi üretti | Commit, workflow identity, reproducible output, digest | Moved tag veya dependency değişimi farklı/rejected artifact üretir | Artifact reviewed source ve build context’e bağlıdır |
| Upload yetkiliydi | Publisher actor ve exact digest | Aynı approval farklı digest ile reddedilir | Approval keyfi package yetkilendiremez |
| Authority drift yok | Normalized manifest approved capability set ile aynı | Yeni host veya permission promotion’ı durdurur | Release sessizce declared authority büyütemez |
| Remote config data’dır | Valid schema yalnızca tanımlı flag’leri değiştirir | Operation, URL, unknown key, expiry ve replay reddedilir | Control plane keyfi privileged action seçemez |
| Canary maruziyeti sınırlar | Yalnızca synthetic cohort candidate alır ve digest raporlar | Non-canary client production’da kalır | Rollout selector uygulanır |
| Rollback tamamlandı | Known-safe version ve config candidate’ı değiştirir | Candidate effect ve digest tüm cohort’lardan kaybolur | Filo kayıtlı safe state’e döner |
Hardening sırası
- Store owner’lar için phishing-resistant MFA zorunlu kılın; kullanılmayan publisher role’lerini kaldırın.
- Long-lived upload secret’ları, mağaza destekliyorsa repository-bound short-lived workload identity ile değiştirin.
- Immutable tag’den isolated runner üzerinde build edin; action ve dependency’leri pinleyin.
- Upload öncesinde package digest, manifest snapshot, SBOM ve provenance üretin.
- Publisher’ın yalnızca approved digest ve version kabul etmesini sağlayın.
- Manifest authority change’i code review’dan ayrı gate’leyin.
- Remote config’i typed, bounded, expiring ve cohort-bound tutun; code-like operation seçemesin.
- Installed version ve effective configuration’ı cohort bazında ölçün.
- Store rollback ve kill-switch davranışını, compromised publisher path’e bağımlı olmadan prova edin.
Detection ve incident kanıtı
Store audit event’lerini, role change, failed MFA, CI workflow identity, dependency-lock change, artifact digest, manifest authority diff, update-source policy, installed version, configuration hash ve privileged operation özetlerini koruyun. Stable origin veya operation identifier yeterliyse cookie, page content, token ve full URL loglamayın.
{
"event": "extension_release_observed",
"extension_id": "lab-extension",
"version": "1.0.1",
"artifact_sha256": "7f4a...91c",
"manifest_policy": "approved",
"cohort": "canary-05",
"config_sha256": "2f91...bb0",
"decision": "promote-denied",
"reason": "unexpected-host-permission"
}
Final model
Package signature gerekli bir kanıttır; final verdict değildir.
TRUSTED RELEASE
= expected publisher identity
+ reviewed immutable source
+ controlled build identity
+ authorized artifact digest
+ reviewed authority delta
+ bounded runtime configuration
+ observable rollout and rollback
Part 1 bir mesajı native process’e kadar izledi. Part 2 bir web sayfasını extension authority’ye kadar izledi. Part 3 ayrıcalıklı extension code’un browser’a nasıl ulaştığını kanıtlayarak döngüyü kapatıyor. Serinin ortak kuralı değişmiyor: reachability, identity, signing ve delivery authorization girdileridir; hiçbiri tek başına authorization değildir.
Bu teknik not ne kadar güncel?
En son kaynak incelemesi, içerik güncellemesi veya yayın tarihi gösterilmektedir.
Birincil kamu kayıtları kontrol edildi. Ortama özgü davranış, ayrıca yeniden üretilmedikçe iddianın dışındadır.
