Series · 3 partsBrowser-to-Native Trust BoundariesPart 3 · You are here
  1. 1Extension Sandbox'taydı. Native Host Değildi.
  2. 2Sayfanın İzni Yoktu. Extension'ın Vardı.
  3. 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

EXTENSION RELEASE AUTHORITY GRAPHSIGNER SÜREKLİLİĞİ, RELEASE AUTHORIZATION DEĞİLDİR SOURCEcommit · reviewNİYET BUILDrunner · depsDÖNÜŞÜM ARTIFACTdigest · SBOMKANIT PUBLISHERaccount · tokenUPLOAD UPDATEstore · URLDAĞITIM BROWSERinstalled fleetETKİ Identity factscommit signer · workflow IDpublisher actor · store itemRELEASE'İ KİM TAŞIDI? Artifact factsdigest · manifest · permissiondependency lock · build recipeNE DAĞITILDI? Runtime factscohort · effective configpermission · privileged effectNE MÜMKÜN HALE GELDİ? RELEASE AUTHORIZATION = IDENTITY + ARTIFACT + RUNTIME DELTA
Şekil 1. Her handoff extension kimliğini geçerli tutarken release'i yetkilendirmek için gereken kanıtı değiştirebilir.
PrincipalGüvenlik kararıKorunması gereken kanıt
Source reviewerDeğişiklik amaçlı ve sınırlandırılmış mı?Commit, review, changed files, threat note
Build serviceOnaylı source bu paketi mi üretti?Workflow identity, clean runner, dependency lock, log
Artifact storeBu çıktı incelenen artifact’in aynısı mı?SHA-256, manifest snapshot, SBOM, provenance
Publisher accountUpload yetkili miydi?Güçlü authentication, actor, timestamp, digest
Store veya update hostHangi client’a hangi version sunuldu?Version mapping, update URL, rollout record
BrowserGerç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 signatureBeklenen extension identity ile süreklilikRelease’in güvenli veya reviewed source ile aynı olduğu
Store reviewGönderilen paketin mevcut inceleme sürecini geçtiğiPublisher credential ve gelecekteki release’lerin güvenli kalacağı
Manifest V3 packaged codeExtension logic’in paket içinde bulunduğuRemote data’nın gizli instruction language olamayacağı
Permission warningBazı capability artışlarının görünür olabileceğiMevcut geniş izinlerin yalnızca eski amaçla kullanıldığı
HTTPS update manifestServer authentication ve transit integrityUpdate origin ve publisher pipeline’ın doğru yetkilendirildiği
Version pinBir cohort’un belirli version’da kaldığıSabitlenen sürümün güvenli olduğu
Staged rolloutMaruziyetin zamana ve cohort’a bölünebildiğiCohort’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 familyKaybedilen sınırGözlenebilir sonuç
Publisher takeoverStore account veya upload token tek başına release authority olurGeçerli dağıtılan fakat yetkisiz paket
Build substitutionCI output, reviewed source’a bağlanmazSigned artifact incelenmemiş code veya dependency içerir
Permission driftReview effective capability delta’yı ölçmezGüncelleme daha geniş host veya browser access kazanır
Configuration-as-codeRemote JSON bounded data yerine operation seçerİncelenmiş paket, incelenmemiş davranış etkinleştirir
Rollout blindnessUpload tamamlanması release başarısı sayılırRiskli 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.

Provenance ile bağlı dağıtım yolunu, geçerli imzaya rağmen authorization drift içeren extension release yolu ile karşılaştıran paralel pipeline.
Kanıt levhası 01. Alt yol distribution identity'yi korurken ölçülmeyen tek control point üzerinden runtime authority değişiyor.

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

FAIL-CLOSED RELEASE STATE MACHINEPROMOTION YENİ KANIT İSTER; ZAMAN TEK BAŞINA RELEASE'İ İLERLETMEZ CANDIDATEdigest bound CANARY5% observed STAGED25% · 50% PRODUCTIONversion proven QUARANTINEupdate dururROLLBACKknown-safe build DENIAL · CRASH · PERMISSION DRIFT · UNKNOWN DIGEST → STOP
Şekil 2. Promotion cohort kanıtıyla desteklenen yeni bir authorization event'tir. Rollback de artifact ve effective configuration'ı açıkça tanımlamalıdır.

Reproduction methodology

  1. Release identity, update source, store role, CI credential ve runtime config envanterini çıkarın.
  2. Aynı tagged source’u iki isolated runner’da build edin; çıktıları karşılaştırın veya her nondeterministic byte’ı açıklayın.
  3. Upload öncesinde unpacked manifest ve package digest’i kaydedin.
  4. Beklenmeyen permission ve host pattern test edin; release gate ikisini de reddetmeli.
  5. Yetkili paketi yalnızca synthetic canary cohort’a sunun.
  6. Approval’ı farklı digest ile replay edin; publish veya promotion gerçekleşmemeli.
  7. Expired, oversized, unknown-key, wrong-cohort ve wrong-version config servis edin.
  8. Rollback’in test edilen etkiyi kaldırdığını ve eski version’da kalan client’ları kanıtlayın.

Test matrix

BoyutVaryantlarGüvenli sonuç
SourceReviewed tag, moved tag, unreviewed commitYalnızca immutable reviewed source build edilir
BuildClean runner, değiştirilmiş dependency, reused workspaceArtifact veya provenance delta release’i durdurur
ArtifactExpected digest, repackaged ZIP, manifest driftYalnızca exact authorized digest ilerler
PublisherHuman MFA, scoped workload identity, stale tokenShort-lived scoped identity; stale token reddedilir
PermissionSame, added optional, broad host, native bridgeAuthority artışı explicit review gerektirir
Update sourceStore, approved enterprise URL, unexpected overrideEnvanter policy ve installed state ile eşleşir
ConfigurationValid, expired, replayed, unknown key, wrong cohortInvalid document privileged effect üretmez
RolloutCanary, staged, pinned, offline, rollbackHer installed cohort gözlenebilir ve sınırlandırılmıştır

Evidence matrix

İddiaPositive evidenceNegative controlGüçlü sonuç
Reviewed source paketi ürettiCommit, workflow identity, reproducible output, digestMoved tag veya dependency değişimi farklı/rejected artifact üretirArtifact reviewed source ve build context’e bağlıdır
Upload yetkiliydiPublisher actor ve exact digestAynı approval farklı digest ile reddedilirApproval keyfi package yetkilendiremez
Authority drift yokNormalized manifest approved capability set ile aynıYeni host veya permission promotion’ı durdururRelease sessizce declared authority büyütemez
Remote config data’dırValid schema yalnızca tanımlı flag’leri değiştirirOperation, URL, unknown key, expiry ve replay reddedilirControl plane keyfi privileged action seçemez
Canary maruziyeti sınırlarYalnızca synthetic cohort candidate alır ve digest raporlarNon-canary client production’da kalırRollout selector uygulanır
Rollback tamamlandıKnown-safe version ve config candidate’ı değiştirirCandidate effect ve digest tüm cohort’lardan kaybolurFilo kayıtlı safe state’e döner

Hardening sırası

  1. Store owner’lar için phishing-resistant MFA zorunlu kılın; kullanılmayan publisher role’lerini kaldırın.
  2. Long-lived upload secret’ları, mağaza destekliyorsa repository-bound short-lived workload identity ile değiştirin.
  3. Immutable tag’den isolated runner üzerinde build edin; action ve dependency’leri pinleyin.
  4. Upload öncesinde package digest, manifest snapshot, SBOM ve provenance üretin.
  5. Publisher’ın yalnızca approved digest ve version kabul etmesini sağlayın.
  6. Manifest authority change’i code review’dan ayrı gate’leyin.
  7. Remote config’i typed, bounded, expiring ve cohort-bound tutun; code-like operation seçemesin.
  8. Installed version ve effective configuration’ı cohort bazında ölçün.
  9. 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.

Kaynaklar ve güncellik

Bu teknik not ne kadar güncel?

Kontrol edilen kaynaklar31 Ağustos 2026

En son kaynak incelemesi, içerik güncellemesi veya yayın tarihi gösterilmektedir.

İnceleme DurumuKamuya açık kaynaklar incelendi

Birincil kamu kayıtları kontrol edildi. Ortama özgü davranış, ayrıca yeniden üretilmedikçe iddianın dışındadır.