Chrome'a Ekle

Nasıl çalışır

Güvenlik incelemesi yapanlar için teknik bir genel bakış. Buradaki her şey kaynak kodla doğrulanabilir — bizi daha az parlak gösteren kısımlar dahil; onları atlamak yerine açıkça yazıyoruz.

Mimari

Arka uç yok. Uzantı, TOTP/HOTP kodlarını OTPAuth ile yerel olarak üreten bir Manifest V3 Chrome uzantısıdır. Sunucu işletmiyoruz, hesap tutmuyoruz ve kullanıcı verisinin bize ulaşabileceği bir kanal yok.

Sunucu olmadığı için sunucu tarafında anahtar malzemesi, anahtar emaneti ya da bizim denetimimizdeki bir kurtarma yolu da yok. Bir kullanıcı parolasını unutur ve kurtarma kodunu kaybederse yardımcı olamayız — bu tasarım gereği böyle.

Kriptografi

Parola koruması isteğe bağlıdır ve varsayılan olarak kapalıdır. Açıkken:

Şifre
AES-256-GCM, her kayıt ve her yeniden yazma için rastgele 96 bitlik IV
Anahtar türetme
PBKDF2-HMAC-SHA256, 600.000 yineleme, rastgele 128 bitlik tuz (OWASP önerisi)
Ana anahtar
256 bit, crypto.getRandomValues ile bir kez üretilir; parola yalnızca onu sarmalar
Parmak izleri
HKDF ile türetilmiş bir alt anahtar altında HMAC-SHA256; kayıtları cihazlar arasında birleştirmek için kullanılır
Kilidi açık anahtarın saklanması
chrome.storage.session — yalnızca bellekte, diske hiç yazılmaz, tarayıcı kapanınca silinir, content script'lerden erişilemez
Otomatik kilit
Her açılışta / 5, 15 veya 60 dakika hareketsizlikten sonra / tarayıcı kapanana kadar
Uygulama
Yalnızca WebCrypto. Hiçbir ilkel elle yazılmadı ve pakete hiçbir kripto kütüphanesi konmadı.

Neden iki katmanlı anahtar

Veriler hiçbir zaman doğrudan paroladan türetilen bir anahtarla şifrelenmez. Kayıtları rastgele bir ana anahtar şifreler; PBKDF2 çıktısı yalnızca bu ana anahtarı sarmalar. Bundan iki sonuç çıkar ve ikisi de önemlidir:

  • Parola değiştirmek, her kaydı, her yedeği ve her dışa aktarımı yeniden şifrelemek yerine 32 baytı yeniden yazar. Depolama sistemleri veriyi tam da bu toplu yeniden yazmalarda kaybeder.
  • 160 bitlik bir kurtarma kodu aynı ana anahtarı bağımsız olarak sarmalayabilir, yani unutulan parola telafi edilebilir. Kod bir kez gösterilir, onay için geri yazılması gerekir ve her kullanımdan sonra yenilenir. Kullanıcı onaylamadan diske hiçbir şey yazılmaz.

Ne şifreleniyor, ne şifrelenmiyor

Parola koruması açıkken hesap kaydının tamamı, tanımlayıcısı ve parmak izi dışında şifrelenir — servis adı dahil; böylece çalınan bir profil, kullanıcının hangi servislerde hesabı olduğunu ele vermez. Koruma açıldığında uzantı kayıtları şifreler, şifresini çözüp karşılaştırarak doğrular ve ancak ondan sonra düz metin kopyaların tümünü siler: tarayıcının yerel deposu, senkronizasyon ve yedi dönüşümlü yedek anlık görüntüsünün hepsi.

Değerlendirmeniz açısından önemli olduğu için açıkça yazıyoruz:

  • Parola koruması kapalıyken hesaplar şifresiz saklanır ve Chrome Sync açıksa kullanıcının kendi Google hesabı üzerinden çoğaltılır. Bize hiçbir zaman ulaşmazlar ama Google'da bulunurlar. Senkronizasyon kapatılabilir; bu, orada halihazırda bulunanı da siler.
  • Site bazlı kullanım geçmişi — hangi hesabın hangi alan adında kullanıldığı — yerel olarak saklanır ve toplandığı sürece kasanın kapsamında değildir. Parola korumasını açmak bu geçmişi siler; ayrıca bağımsız olarak da kapatılabilir.

Tehdit modeli

Şunlara karşı korur

  • Çalınmış veya kopyalanmış bir tarayıcı profili dizini
  • Tarayıcı verisini toplu hâlde sızdıran infostealer türü zararlı yazılım
  • Başında kimse olmayan bir makineye fiziksel erişimi olan biri
  • Hesap kayıtlarının Chrome Sync üzerinden Google'a ulaşması
  • Yedek dosyasının kaybolması veya çalınması (parola korumalı dışa aktarım)

Şunlara karşı korumaz

  • Kasa kilidi açıkken kullanıcı yetkisiyle çalışan zararlı yazılım
  • Parolayı yazılırken yakalayan bir tuş kaydedici
  • Ele geçirilmiş bir tarayıcı veya işletim sistemi
  • Kodların ait olduğu üçüncü taraf servislerin ele geçirilmesi

Kısacası: bu, veriyi beklemedeyken korur. Kullanım sırasında zaten saldırganın denetiminde olan bir cihazı savunmaz, savunamaz da.

İzinler

Manifest tam olarak iki izin bildirir ve hiçbir host izni istemez:

storage
Hesaplar ve ayarlar yerel depoda, kilidi açık anahtar oturum deposunda, bir de isteğe bağlı senkronizasyon kopyası
activeTab
Eşleşen hesabı öne çıkarmak için etkin sekmenin ana bilgisayar adını okur ve kullanıcı ekrandan QR kod taradığında sekmeyi yakalar

Hiç content script yok, tabs, cookies veya webRequest izinleri yok ve web'den erişilebilir kaynak yok. Uzantı hiçbir sayfanın içeriğini okuyamaz veya değiştiremez.

Kamera

Kamerayla QR tarama, açılır pencerede değil sekmede açılan bir uzantı sayfasında çalışır — açılır pencere odağı kaybettiği anda yok edilir ve izin istemi tam olarak bunu yapar. Bunun için manifestte hiçbir izin gerekmez: tarayıcının standart kamera istemi kullanılır, uzantı origin'i başına verilir, site ayarlarından geri alınabilir ve kullanıcı tarayıcıyı açana kadar hiç sorulmaz. Video yerel olarak çözülür, hiçbir zaman iletilmez veya saklanmaz.

Dışa giden ağ trafiği

Uzantı normal kullanımda hiçbir otomatik istek yapmaz ve Manifest V3 uzak kodu yasaklar. Yapabileceği tüm bağlantılar:

SunucuNe zamanKullanıcı verisi taşır mı?
worldtimeapi.org
timeapi.io
Saat sapması kontrolü, önbelleklenir, hata durumunda sessizce geçilir. Saat kayarsa TOTP bozulur.Hayır
authenticator.shKurulumda karşılama sayfası; kaldırma veya puanlama sırasında geri bildirim sayfası.Hayır (sıradan web sunucusu günlükleri)

Üçüncü taraf sunuculardan yazı tipi, betik, stil veya görsel yüklenmez. Arayüzü çizmek için gereken her şey paketin içinde gelir.

Yayımladığımızı doğrulamak

Yukarıdakilerin hiçbirini bize güvenerek kabul etmek zorunda değilsiniz. Uzantı açık kaynaktır ve her sürüm yeniden üretilebilir:

  1. Yayımlanan .crx dosyasını Chrome Web Store'dan indirip açın
  2. Eşleşen git etiketine geçin
  3. Node 20 LTS üzerinde npm ci && npm run build çalıştırın
  4. Oluşan dist/ dizinini açılmış paketle karşılaştırın

Üretilen dist/ içindeki her dosyanın SHA-256 özeti, her GitHub sürümüyle birlikte SHA256SUMS-v<version>.txt olarak ve sha256sum biçiminde yayımlanır; böylece 4. adım tek bir sha256sum -c çalıştırmasına iner. Farklar, arşiv içindeki dosya sırası ve Node yama sürümleri arasında küçültülmüş çıktıdaki boşluklarla sınırlı kalmalıdır.

Çalışma zamanı bağımlılıkları bilinçli olarak az — OTPAuth, React, jsQR, Zustand, Framer Motion ve Lucide — ve depoya işlenmiş bir lock dosyasıyla sabitlenmiş. CycloneDX biçiminde SBOM talep üzerine verilir.

Kaynak kodu inceleyin

Sahip olmadıklarımız

Biz küçük ve bağımsız bir sağlayıcıyız. Aşağıdakilerden biri süreciniz için kesin bir gereklilikse, bunu bir değerlendirmenin üçüncü haftasında değil şimdi bilmeniz daha iyi:

  • SOC 2, ISO 27001 veya benzeri bir sertifikamız yok
  • Bugüne kadar bağımsız bir sızma testi yaptırmadık
  • Ücretli bir bug bounty programımız yok

Bunların yerine sunduğumuz şey: kaynak kodun tümüyle şeffaf olması, doğrulanabilir bir derleme, asgari izin yüzeyi ve verinizi en baştan tutabilecek hiçbir sunucu altyapısının bulunmaması.

Bize ulaşmak

Zafiyet bildirimleri ve güvenlik soruları: security@authenticator.sh. Açıklama politikamız, kapsam, yanıt süreleri ve safe harbour koşulları güvenlik politikası sayfasında; neyin saklandığı ve cihazdan neyin çıktığı ise gizlilik politikası içinde anlatılıyor.

Yazılı bir tedarikçi değerlendirme formunu memnuniyetle yanıtlarız ya da kodu bir güvenlik ekibiyle birlikte adım adım gözden geçiririz.

Güvenlikle ilgili olmayan her şey için — kurulum, hesap kurtarma, bir dağıtımdaki faturalandırma soruları — destek sayfasına bakın. Lütfen zafiyet bildirimlerini oraya göndermeyin; o kutu gizli kabul edilmiyor.