WEB / WEB-14.S02
Recovery, passkeys ve hassas hesap değişiklikleri
Yeni authenticator bağlamak veya recovery contact’ını değiştirmek gelecekteki account kontrolünü değiştirir. Passkey ceremony ve recovery yetkisinin hangi subject/purpose’e bağlı olduğunu izle.
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
Yeni passkey association
- Scoped fresh proof başlangıcı
Existing authenticator ile fresh reauth success supplied; yetki subject-duru/register-new-passkey için.
- Browser / Duru
- Registration options bekleniyor
- Atlas RP / Application
- Fresh reauth; scope ile sınırlı binding yetkisi
- Account / credential ledger
- Mevcut credential association; yeni key yok
- Registration challenge kaydı
RP pending ceremony’yi trusted subject/purpose ile oluşturur; alias random bytes değildir.
- Browser / Duru
- Registration options bekleniyor
- Atlas RP / Application
- Create ceremony bekliyor
- Account / credential ledger
- Registration challenge pending; yeni key yok
- Options Browser’a ulaştı
HTTPS response RP ID, challenge alias ve required UV intent’ini taşır.
- Browser / Duru
- Create options hazır
- Atlas RP / Application
- Registration sonucu bekleniyor
- Account / credential ledger
- Registration challenge pending; yeni key yok
- Local authenticator result
Browser create/authenticator operation supplied result ile temsil edilir; bu adım HTTPS packet değildir.
- Browser / Duru
- Supplied create result hazır
- Atlas RP / Application
- Registration sonucu bekleniyor
- Account / credential ledger
- Registration challenge pending; yeni key yok
- Registration result RP’ye ulaştı
Application transport forwarded result alias; RP henüz association kabul etmedi.
- Browser / Duru
- Binding kararı bekleniyor
- Atlas RP / Application
- Result ulaştı; validation bekliyor
- Account / credential ledger
- Registration challenge pending; yeni key yok
- Trusted ceremony validation
RP, fresh proof ve subject/purpose bağına ek olarak webauthn.create türünü, challenge, allowed origin, RP ID hash ve required UP/UV koşullarını kontrol eder. Algorithm, attestation, credential-ID availability ve crypto sonuçları bu örnekte önceden verilmiştir; association henüz commit edilmez.
- Browser / Duru
- Binding kararı bekleniyor
- Atlas RP / Application
- Validation geçti
- Account / credential ledger
- Challenge kontrol edildi; yeni key commit edilmedi
- Association commit veya unchanged
Bu registration’da tüm kabul koşulları olumlu olduğundan RP challenge’ı tüketip yeni public-key/subject association’ını kaydeder. Notification queue’ya alınmıştır; gönderildiği veya kullanıcıya ulaştığı gösterilmez. Browser hâlâ binding sonucunu bekler.
- Browser / Duru
- Binding kararı bekleniyor
- Atlas RP / Application
- Validation geçti
- Account / credential ledger
- Challenge consumed; yeni credential bağlı; notification queued
- Binding sonucu Browser’da
Browser yeni passkey association’ının kaydedildiği sonucunu aldı. Bu sonuç register-new-passkey/subject-duru kapsamındadır; yeni login ceremony veya başka account üzerinde yetki üretmez. Notification delivery ayrı kanıt ister.
- Browser / Duru
- Passkey eklendi
- Atlas RP / Application
- Validation geçti
- Account / credential ledger
- Challenge consumed; yeni credential bağlı; notification queued
Origin mismatch
- Scoped fresh proof başlangıcı
Existing authenticator ile fresh reauth success supplied; yetki subject-duru/register-new-passkey için.
- Browser / Duru
- Registration options bekleniyor
- Atlas RP / Application
- Fresh reauth; scope ile sınırlı binding yetkisi
- Account / credential ledger
- Mevcut credential association; yeni key yok
- Registration challenge kaydı
RP pending ceremony’yi trusted subject/purpose ile oluşturur; alias random bytes değildir.
- Browser / Duru
- Registration options bekleniyor
- Atlas RP / Application
- Create ceremony bekliyor
- Account / credential ledger
- Registration challenge pending; yeni key yok
- Options Browser’a ulaştı
HTTPS response RP ID, challenge alias ve required UV intent’ini taşır.
- Browser / Duru
- Create options hazır
- Atlas RP / Application
- Registration sonucu bekleniyor
- Account / credential ledger
- Registration challenge pending; yeni key yok
- Local authenticator result
Browser create/authenticator operation supplied result ile temsil edilir; bu adım HTTPS packet değildir.
- Browser / Duru
- Supplied create result hazır
- Atlas RP / Application
- Registration sonucu bekleniyor
- Account / credential ledger
- Registration challenge pending; yeni key yok
- Registration result RP’ye ulaştı
Application transport forwarded result alias; RP henüz association kabul etmedi.
- Browser / Duru
- Binding kararı bekleniyor
- Atlas RP / Application
- Result ulaştı; validation bekliyor
- Account / credential ledger
- Registration challenge pending; yeni key yok
- Trusted ceremony validation
RP, fresh proof ve subject/purpose bağına ek olarak webauthn.create türünü, challenge, allowed origin, RP ID hash ve required UP/UV koşullarını kontrol eder. Algorithm, attestation, credential-ID availability ve crypto sonuçları bu örnekte önceden verilmiştir; association henüz commit edilmez.
- Browser / Duru
- Binding kararı bekleniyor
- Atlas RP / Application
- Validation reddedildi: origin mismatch
- Account / credential ledger
- Challenge kontrol edildi; yeni key commit edilmedi
- Association commit veya unchanged
originMatched=false olduğu için RP yeni credential association’ını kaydetmez: newCredentialBound=false ve challenge rejected kalır. cryptographicResultValid=true bu bağımsız origin koşulunu karşılamaz; mevcut account associations değişmez.
- Browser / Duru
- Binding kararı bekleniyor
- Atlas RP / Application
- Validation reddedildi: origin mismatch
- Account / credential ledger
- Challenge rejected; mevcut associations değişmedi
- Binding sonucu Browser’da
Browser registration reddini aldı; yeni passkey eklenmedi. Mevcut account associations korunmuştur. Bu branch, RP’nin received-result kontrolünü açıklar; gerçek Browser’ın böyle bir inconsistent result ürettiği iddiası değildir.
- Browser / Duru
- Passkey eklenmedi
- Atlas RP / Application
- Validation reddedildi: origin mismatch
- Account / credential ledger
- Challenge rejected; mevcut associations değişmedi
Restricted recovery
- Recovery context başlangıcı
Approved recovery evidence ve assurance sonucu supplied; proof alias ordinary session değildir.
- Browser / Duru
- Recovery proof alias hazır
- Atlas RP / Application
- Recovery request yok
- Account / credential ledger
- Proof unused; generation-a; kayıp key active; eski session active
- Recovery proof request ulaştı
Account/purpose, proof verify ve unused/lifetime koşulları RP’de değerlendirilecek.
- Browser / Duru
- Recovery sonucu bekleniyor
- Atlas RP / Application
- Recovery proof ulaştı
- Account / credential ledger
- Proof unused; generation-a; kayıp key active; eski session active
- Restricted recovery gate
Kabulde proof atomik consume edilir; used proof hiçbir yeni mutation yetkisi üretmez.
- Browser / Duru
- Recovery sonucu bekleniyor
- Atlas RP / Application
- Sınırlı reset yetkisi verildi
- Account / credential ledger
- Proof consumed; sınırlı capability
- Reset ve affected invalidation
Local commit new verifier generation, known-lost association invalidation ve old session generation revocation; notification yalnız queue.
- Browser / Duru
- Recovery sonucu bekleniyor
- Atlas RP / Application
- Sınırlı reset tamamlandı; normal session yok
- Account / credential ledger
- Proof consumed; generation-b; kayıp key invalidated; eski session revoked
- Recovery sonucu Browser’da
Browser restricted reset’in tamamlandığı sonucunu aldı. Yeni verifier generation kaydedilmiş, bilinen kayıp association geçersiz kılınmış ve eski session generation revoked olmuştur; ordinarySessionIssued=false kalır. Normal login ve notification delivery ayrı işlemlerdir.
- Browser / Duru
- Reset tamamlandı; normal login gerekli
- Atlas RP / Application
- Normal session verilmedi
- Account / credential ledger
- Proof consumed; generation-b; kayıp key invalidated; eski session revoked
Proof consumed
- Recovery context başlangıcı
Approved recovery evidence ve assurance sonucu supplied; proof alias ordinary session değildir.
- Browser / Duru
- Recovery proof alias hazır
- Atlas RP / Application
- Recovery request yok
- Account / credential ledger
- Proof consumed; generation-b; kayıp key invalidated; eski session revoked
- Recovery proof request ulaştı
Account/purpose, proof verify ve unused/lifetime koşulları RP’de değerlendirilecek.
- Browser / Duru
- Recovery sonucu bekleniyor
- Atlas RP / Application
- Recovery proof ulaştı
- Account / credential ledger
- Proof consumed; generation-b; kayıp key invalidated; eski session revoked
- Kullanılmış proof reddi
Proof daha önce tüketilmiştir. Recovery gate yeni reset yetkisi vermez; credential ve session generation’ları değişmez.
- Browser / Duru
- Recovery sonucu bekleniyor
- Atlas RP / Application
- Red: proof önceden tüketilmiş
- Account / credential ledger
- Proof consumed; generation-b; kayıp key invalidated; eski session revoked
- Recovery sonucu Browser’da
Browser recovery reddini aldı. Yeni reset, normal session veya notification delivery oluşmadı; mevcut kayıtlar aynı kaldı.
- Browser / Duru
- Recovery tamamlanmadı
- Atlas RP / Application
- Normal session verilmedi
- Account / credential ledger
- Proof consumed; generation-b; kayıp key invalidated; eski session revoked
ROLLER · STATE · VERİ AKIŞI
Future account control hassas bir permission’dır
Duru yeni laptop’a passkey eklemek ister. Bu action sıradan bir profil metni düzenlemez: yeni private key’i kontrol eden authenticator gelecekte subject-duru için authentication yapabilecektir. Atlas Browser’daki active session’ı tek başına association yetkisi saymaz; fresh reauthentication ve trusted account binding ister.
Fixture normal branch’te existing authenticator ile yapılan fresh reauthentication’ın başarıyla tamamlandığını başlangıç girdisi olarak alır. O ceremony ayrıca çizilmez. Authorization kapsamı register-new-passkey ve subject-duru ile sınırlıdır; başka account veya recovery contact değişimi aynı boolean’dan izin çıkarmaz.
Password change için current credentials/fresh proof, contact değişimi için eski trusted context ve yeni endpoint doğrulaması ayrı düşünülür. Active session süreklilik sağlar; sensitive change’e sonsuz ve sınırsız yetki sağlamaz. Account lifecycle temeli WEB-14.S01’dedir.
Passkey: server’da password yerine public-key association
Passkey bir website/application account’una bağlı FIDO credential’dır. WebAuthn’de RP server credential ID, subject/user handle ve public key ilişkisinin trusted kaydını tutar. Authenticator private-key operasyonunu yapar; server private key veya device unlock PIN’i istemez.
Platform ve roaming authenticator farklı erişim biçimleridir. Passkey device-bound veya syncable olabilir; bütün private key’lerin hiçbir koşulda tek device dışına çıkmadığını genelleme. Sync fabric, provider account recovery ve device lock modeli kendi güven sınırlarını getirir.
Biometric veya PIN device üzerindeki user verification için kullanılır; biometric template’in Atlas’a gönderildiği sonucu çıkarılmaz. User presence ve user verification farklı flag’lerdir. Ürün UV required istiyorsa trusted validation sonucu UV koşulunu kontrol etmelidir; UI’da yüz resmi görünmesi bu sonucu kanıtlamaz.
Registration ile authentication ceremony’leri ayrı
navigator.credentials.create() yeni credential üretimi/registration için, navigator.credentials.get() mevcut credential ile authentication assertion için kullanılır. RP server ceremony options/challenge sağlar; Browser authenticator API’si ile çalışır ve çıkan response’u application transport’u üzerinden RP’ye iletir.
Normal scene register-new-passkey’yi anlatır. Browser içindeki create result adımı supplied authenticator result’tır; key generation, CBOR/COSE parse veya cryptographic attestation uygulanmaz. Application tarafındaki validation kapısı trusted established WebAuthn implementation’ın sonucunu temsil eder. Gerekli algoritma, attestation policy, existing credential-ID uniqueness ve account binding kontrolleri normal fixture’da supplied true’dur.
Authentication get ceremony’sinde RP, stored credential public key ile assertion signature’ı ve credential/account binding’i kontrol eder. signCount azalması veya sabit zero bütün cihazlarda kesin compromise kanıtı değildir; authenticator türü, sync ve response ordering risk değerlendirmesine girer. Authentication assertion’dan yeni credential registration authority’si otomatik doğmaz.
Challenge, RP ID ve origin farklı bağlardır
Atlas fixture RP ID=library.atlas.example ve expected origin=https://library.atlas.example seçer. RP ID bir domain scope’udur; origin scheme/host/port bağlamıdır. Birbirinin yerine string comparison yapılmaz. Daha geniş RP ID scope seçimi subdomain trust yüzeyini değiştirir; credential cookie Domain/Path kurallarıyla scope edilmez.
Registration clientData type=webauthn.create, beklenen challenge ve allowed origin ile eşleşmelidir; authenticator data RP ID hash ve required flags yönünden değerlendirilir. Authentication type=webauthn.get ile ayrı ceremony’dir. Fixture type/challenge/origin/rpIdHash/UV/signature-or-attestation sonuçlarını boolean olarak verir; alias challenge gerçek random byte değildir.
Wrong-origin branch’te cryptographicResultValid=true verilse bile originMatched=false olduğu için RP association yapmaz. Bu, gerçek Browser’ın söz konusu inconsistent result’u üretmiş olduğu iddiası değildir; RP’nin received-input kabul sınırını açıklayan synthetic branch’tir. Fresh challenge’ın ceremony/account/purpose ile tutulması tamamlanmış sonucu yanlış subject’e bağlamayı engelleyen state ilişkisidir.
Recovery bir login success kısayolu değildir
Duru eski authenticator’ını kaybettiğinde recovery ihtiyacı doğabilir. Forgot-password, existing authenticator ile password replacement ve bütün gerekli authenticator’ların kaybından sonra account recovery aynı durum değildir. Kullanılabilir proof, account assurance ve ürün risk analysis’i seçilen recovery yolunu belirler.
Fixture’ın recovery branch’i approvedRecoveryEvidence=true ve assuranceRequirementMet=true sonuçlarını supplied başlangıç kararı olarak kullanır. RECOVERY_SECRET_ALIAS yalnız inert token referansıdır; tek code’un her AAL veya üründe yeterli olduğunu söylemez. Proof account/purpose=lifecycle-recovery için bound, valid, unused ve live ise atomik tüketilir.
Başarı restricted reset capability verir; doğrudan yeni authenticated user session vermez. Atlas örneği yeni password verifier generation’a geçer, bilinen lost credential association’ını invalidate eder, eski session generation’ını revoked işaretler ve independent notification’ı queue eder. Delivery veya bütün resource server’larda aynı anda revoke sonucu çizilmez; sonrasında normal login gerekir.
Reset, factor replacement ve notification’ın sınırı
Password reset token’ı securely generated, purpose-bound, single-use ve uygun lifetime’la saklanır; reset request’inin kendisi account state’ini değiştirip kullanıcıyı kilitlememelidir. Normal login’den ayrı restricted state ile password update tamamlanır. Kullanılmış recovery proof’u tekrar supplied input yapılınca unused=false gate’i mutation’ı durdurur.
Suspected account compromise sonrası yalnız password reset yetmeyebilir: active session, yeni eklenmiş authenticator veya değiştirilmiş recovery address kalabilir. Recovery review daha önce trusted evidence’i, mevcut associations’ı ve pending changes’i değerlendirir. Recently-added contact’ı otomatik en güçlü proof sayma; eski contact’ı da neden kaldırıldığını bilmeden geri yükleme.
Notification yetki veren proof değildir; kullanıcıya bir change’i fark ettirir ve itiraz yolu sağlar. Fixture notificationQueued=true bunu gönderilmiş/okunmuş saymaz. Email veya factor değişiminden sonra rollback/repudiation ve session effects açıkça tanımlanmalıdır.
2. Red · Güven ve etki
Hareket olmadan bütün senaryoları oku
Origin farklı
- Passkey association kapsamı seçildi
Purpose register-new-passkey ve type webauthn.create olarak verilmiştir. RP ID library.atlas.example ile expected origin https://library.atlas.example farklı kontrol alanlarıdır.
- Ceremony/recovery context
- wrong-origin registration
- Account lifecycle gate
- Gate değerlendirilmedi
- Association/session boundary
- Credential bağlanmadı
- Fresh proof ve subject ayrıldı
freshReauth=true ve subjectBound=true verilmiştir. Bu olumlu koşullar, ceremony origin kontrolünün yerini almaz; browser displayName authority değildir.
- Ceremony/recovery context
- Fresh proof; subject bound
- Account lifecycle gate
- Origin kontrolü bekliyor
- Association/session boundary
- Credential bağlanmadı
- Crypto ve origin ayrıldı
cryptographicResultValid=true fakat originMatched=false’tur. rpIdHashMatched, challenge ve type true olsa da failed origin association gate’i korunur.
- Ceremony/recovery context
- Crypto predicate=true
- Account lifecycle gate
- Origin matched=false
- Association/session boundary
- Credential bağlanmadı
- Association commit reddedildi
newCredentialBound=false ve afterChallengeState=rejected kalır. Doğru crypto flag’i, yanlış ceremony context’ine yeni credential ekleme yetkisi vermez.
- Ceremony/recovery context
- Crypto predicate=true
- Account lifecycle gate
- Challenge rejected
- Association/session boundary
- New credential bound=false
- Hassas değişiklik yetkisi genişlemedi
Factor binding fresh proof ile account-bound ceremony validation’ı birlikte ister. Recovery veya password change capability’si bu registration’ın origin kapısını otomatik açmaz.
- Ceremony/recovery context
- Purpose: register-new-passkey
- Account lifecycle gate
- Origin gate başarısız
- Association/session boundary
- Association mutation yok
- Association sınırı kapalı kaldı
Bu fixture wrong-origin denial’ı gösterir; gerçek browser ceremony, CBOR/COSE veya signature işlemi çalıştırıldığı sonucu eklenmez. Declared crypto predicate ile association kararı farklı evidence’tır.
- Ceremony/recovery context
- Declared crypto valid
- Account lifecycle gate
- Known: origin mismatch
- Association/session boundary
- No new credential association
Proof kullanılmış
- Recovery capability sınırı seçildi
recovery-used satırı lifecycle-recovery purpose’ına aittir. Önceki başarılı attempt credential-generation-b oluşturmuş ve eski affected state’i kapatmıştır; bu geçmiş işlem rollback edilmez.
- Ceremony/recovery context
- Recovery-used row
- Account lifecycle gate
- Consumption incelenmedi
- Association/session boundary
- Yeni reset yok
- Proof doğruluğu ile kullanılabilirlik ayrıldı
proofMatches=true ve lifetimeValid=true olsa da unused=false’tur. Doğru proof’un tekrar sunulması one-time consumption koşulunu yeniden açmaz.
- Ceremony/recovery context
- Proof matches; unused=false
- Account lifecycle gate
- Already consumed
- Association/session boundary
- Yeni reset yok
- Yeni reset durduruldu
resetCompleted=false kalır. credentialGenerationAfter=credential-generation-b ve lostCredentialStateAfter=invalidated önceki committed sonuçları korur; tekrar attempt yeni mutation yapmaz.
- Ceremony/recovery context
- Used proof rejected
- Account lifecycle gate
- Generation b korunuyor
- Association/session boundary
- No new credential reset
- Session ve notification ayrıldı
ordinarySessionIssued=false ve notificationQueued=false bu yeni attempt için geçerlidir. Daha önce queue’ya alınan mesajlar silinmiş sayılmaz.
- Ceremony/recovery context
- Used proof rejected
- Account lifecycle gate
- Old session revoked korunur
- Association/session boundary
- No additional notification
- Recovery normal access’e yükselmedi
Limited recovery purpose, unrestricted session veya yeni action grant’i oluşturmaz. Eski session’ın revoked olması browser cleanup veya bütün access-token revocation kanıtı değildir.
- Ceremony/recovery context
- Purpose: lifecycle-recovery
- Account lifecycle gate
- Generation b korunuyor
- Association/session boundary
- Ordinary session yok
- Geçmiş etki korunarak ret verildi
Bu branch yeni reset ve ek notification üretmez. Önceki successful reset’i geri almaz; notification delivery ve downstream acceptance ayrı evidence bekler.
- Ceremony/recovery context
- Known: proof consumed
- Account lifecycle gate
- Prior committed state retained
- Association/session boundary
- No new reset/session/notification
VARSAYIM · SINIR · KONTROL
Doğru crypto, yanlış association’ı doğru yapmaz
Registration’ın normal yararı yeni authenticator public key’ini authorized subject’e bağlamaktır. Fresh reauth/account binding veya ceremony origin kapısı atlanırsa key kaydı yanlış subject/purpose’e eklenebilir. Prerequisite received result’un trusted association gate’ine kontrolsüz girmesidir; etki bu credential ile gelecekte kurulan account context’iyle sınırlıdır.
Blocking control challenge/ceremony context’ini trusted subject, RP ID, origin, required UV ve approved validation policy ile birlikte kontrol edip sonra association commit etmektir. Browser’dan verilen displayName authority değildir. Artifact wrong-origin sonucunda newCredentialBound=false tutar; crypto valid flag’i policy’yi tek başına aşmaz.
Recovery yetkisi normal access’e sessiz yükselmesin
Normal recovery, belirlenen proof sonrası kontrollü credential replacement sağlar. Recovery capability’yi unrestricted session’a çevirmek veya aynı proof’u tekrar kullanılabilir bırakmak daha geniş erişim/yeni değişiklik yetkisi doğurabilir. Tek response’un başarılı görünmesi bütün lost-key/session state’lerinin kapandığını kanıtlamaz.
Limited purpose, one-time consumption, new credential generation ve affected association/session invalidation ayrı kontrollerdir. Legitimate users da kayıp device, bozuk sync veya stale notification yaşayabilir; failure reason saldırı etiketi değildir. Kurtarma yolunun güveni primary authentication’dan bağımsız review edilir.
3. Blue · Güvenli geliştirme ve savunma
Hareket olmadan bütün senaryoları oku
Recovery ledger
- Recovery başarı kapsamı seçildi
Normal recovery satırı dört ayrı state sonucu taşır: proof consumption, credential generation, affected old state ve notification queue. Tek successful etiket bunların hepsini delivery saydırmaz.
- Lifecycle observation
- case=recovery
- Association/queue review
- State eşleştirilmedi
- Evidence hükmü
- Delivery kanıtı yok
- Consumption ve generation eşleştirildi
afterProofState=consumed ve credentialGenerationAfter=credential-generation-b kayıtlıdır. Bu sonuçlar restricted reset’in state değişimidir; ordinarySessionIssued=false ayrıca korunur.
- Lifecycle observation
- Proof consumed
- Association/queue review
- Generation b; no ordinary session
- Evidence hükmü
- Delivery kanıtı yok
- Affected old state okundu
lostCredentialStateAfter=invalidated ve oldSessionStateAfter=revoked verilmiştir. Bu alanlar hangi eski state’in kapandığını açıklar; bütün resource-server token’larını kapsadığı varsayılmaz.
- Lifecycle observation
- Proof consumed
- Association/queue review
- Lost credential invalidated; old session revoked
- Evidence hükmü
- Downstream token state bilinmiyor
- Queue ile delivery ayrıldı
notificationQueued=true yalnız bu attempt’in bağımsız notification’ı queue’ya aldığını gösterir. Mesajın gönderildiği, inbox’a vardığı veya kullanıcının okuduğu sonucu verilmez.
- Lifecycle observation
- Restricted reset completed
- Association/queue review
- Notification queued=true
- Evidence hükmü
- UNKNOWN: notification delivery
- Missing delivery kanıtı istendi
Delivery telemetry yoksa queue success’i delivery success olarak gösterilmez. Aynı correlation ile producer ve notification sonucu ayrıca ilişkilendirilmelidir; secret veya yeni password log’a gerekmez.
- Lifecycle observation
- Restricted reset completed
- Association/queue review
- Queue kanıtı var
- Evidence hükmü
- Delivery observation gerekir
- Recovery hükmü kendi scope’unda kaldı
Proof consumed, generation değişimi ve affected invalidation bilinir. Notification delivery ve diğer downstream acceptance UNKNOWN’dur; recovery’nin ordinary session vermediği açık kalır.
- Lifecycle observation
- Known: reset completed
- Association/queue review
- Known: scoped invalidation
- Evidence hükmü
- UNKNOWN: delivery/downstream
Origin kanıtı yok
- Association audit kapsamı seçildi
Bu branch normal association kaydının newCredentialBound ve freshReauth alanlarını inceler, fakat originMatched alanını kapsam dışında tutar. Eksik origin evidence başarı ile doldurulmaz.
- Lifecycle observation
- Partial binding record
- Association/queue review
- Origin kanıtı eksik
- Evidence hükmü
- Integrity hükmü yok
- Association sonucu okundu
newCredentialBound=true ve freshReauth=true görülür. Bu iki alan ceremony origin veya rpIdHash validation’ın sunulan kayıtla doğrulanmış olduğunu göstermez.
- Lifecycle observation
- New credential bound=true
- Association/queue review
- Fresh reauth=true
- Evidence hükmü
- Integrity hükmü yok
- Selector’ın alan gereksinimi ayrıldı
XPath false origin veya false freshReauth ile completed binding tutarsızlığı arar. Missing origin, originMatched=true ile aynı değildir; predicate kapsamı eksiktir.
- Lifecycle observation
- Completed binding claim
- Association/queue review
- Missing origin ≠ true
- Evidence hükmü
- UNKNOWN: origin validation
- Zero count temiz kanıt sayılmadı
Eksik alanlar nedeniyle selection boş kalabilir; bu origin gate’in uygulandığını kanıtlamaz. Ayrı positive fixture, originMatched=false ile newCredentialBound=true tutarsızlığını gösterir.
- Lifecycle observation
- Completed binding claim
- Association/queue review
- Selection coverage incomplete
- Evidence hükmü
- UNKNOWN: association integrity
- Trusted source kaydı istendi
Aynı ceremony ve subject scope’undaki origin kararına ihtiyaç vardır. Browser displayName veya credential alias’ı bu eksik kararı tamamlayan authentication proof değildir.
- Lifecycle observation
- Completed binding claim
- Association/queue review
- Origin decision gerekir
- Evidence hükmü
- UNKNOWN: association integrity
- Eksik kanıt ret veya bypass sayılmadı
Bu kısmi kayıtla association güvenli veya yanlış kuruldu diye kesin hüküm verilmez. Event kaybı ve schema mapping kendi kanıtıyla incelenir; gerçek WebAuthn crypto sonucu eklenmez.
- Lifecycle observation
- Known: partial binding claim
- Association/queue review
- Missing origin evidence
- Evidence hükmü
- UNKNOWN: gate enforcement
UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA
Association ledger neyi gösterebilir?
RP’nin sanitized decision kaydı ceremonyRef, subjectRef, originMatched, rpIdHashMatched, challengeMatched, freshReauth ve newCredentialBound sonuçlarını ilişkilendirebilir. Public-key/credential correlation ref secret gibi authentication sağlamaz ama privacy ve retention yönünden yine korunur; private key, recovery secret ve biometric veri loga verilmez.
Artifact XPath newCredentialBound=true iken originMatched=false veya freshReauth=false olan integrity discrepancy’yi seçer. Normal binding sıfır, origin gate’i yok sayan pozitif synthetic audit tek satır verir. Source event eksikse yeterli kanıt yoktur; multi-host ordering veya real cryptographic verification bu seçimle yapılmaz.
Recovery success için dört ayrı sonucu izle
Proof consumed, replacement credential generation, old affected association/session invalidation ve independent notification ayrı state değişiklikleridir. Notification queue kaydı delivery kanıtı değildir; Browser’ın yeni password input’u accepted mesajı da eski resource server access token’ının anında bittiğini göstermez.
Own fixture normal recovery’de restricted reset completed / ordinarySessionIssued=false sonucunu korur. Used-proof branch’te record ve generation değişmez. Valid-proof ama delivery retry gibi normal koşullar incident kararıyla karıştırılmaz; authorization ledger ve notification delivery telemetry ayrı gözlemlenir.
Browser ceremony ile account policy birlikte doğrulanır
Established WebAuthn library ile supported Browser/device matrix’inde RP ID, allowed origins, userVerification, platform/roaming ve sync davranışını test et. API’nin available olması bütün credential’ların aynı assurance veya recovery özelliğine sahip olduğunu göstermez. Origin allowlist veya reverse-proxy external origin değişimleri kontrollü review gerektirir.
Sensitive-change path fresh proof’un hangi action ve süre için kabul edildiğini gösterir. Lost device’i invalidate etme, replacement factor enrollment ve repudiation yolu kullanıcıya anlaşılır sunulur. Credentials’ı topluca silmek yerine affected state ve ürün riskini belirleyerek kontrollü migration yapılır.
ŞİMDİ VAKAYA UYGULA
Crypto sonucu, recovery state ve notification nasıl ayrılır?
Origin association gate’i ve one-time recovery purpose’u farklı boundaries kurar. Ledger state’i notification delivery veya bütün downstream acceptance yerine kullanılmaz.
Vakadaki doğrulanmış actor, tenant ilişkisi ve requested action için gereken kararları ayır. Authentication veya proof başarısını object permission yerine kullanma.
Bağlı vaka dosyasını aç ↗ÖRNEĞİ BİRLİKTE OKUYALIM
Recovery ve passkey association ledger
Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.
Ham kaydı ve alan açıklamalarını oku
{
"subjectRef": "subject-duru",
"rpId": "library.atlas.example",
"expectedOrigin": "https://library.atlas.example",
"credentialAlias": "CREDENTIAL_NEW_ALIAS_NOT_BYTES",
"userHandleAlias": "USER_HANDLE_ALIAS_NOT_BYTES",
"publicKeyAlias": "PUBLIC_KEY_ALIAS_NOT_COSE",
"registrationChallenge": "REGISTRATION_CHALLENGE_ALIAS_NOT_RANDOM_BYTES",
"registrationType": "webauthn.create",
"authenticationType": "webauthn.get",
"purpose": "register-new-passkey",
"registrationRows": [
{
"case": "normal",
"freshReauth": true,
"subjectBound": true,
"purposeMatched": true,
"typeMatched": true,
"challengeMatched": true,
"originMatched": true,
"rpIdHashMatched": true,
"userVerified": true,
"cryptographicResultValid": true,
"algorithmAllowed": true,
"attestationPolicyAllowed": true,
"credentialIdAvailable": true,
"challengeUnused": true,
"newCredentialBound": true,
"afterChallengeState": "consumed",
"userPresent": true
},
{
"case": "wrong-origin",
"freshReauth": true,
"subjectBound": true,
"purposeMatched": true,
"typeMatched": true,
"challengeMatched": true,
"originMatched": false,
"rpIdHashMatched": true,
"userVerified": true,
"cryptographicResultValid": true,
"algorithmAllowed": true,
"attestationPolicyAllowed": true,
"credentialIdAvailable": true,
"challengeUnused": true,
"newCredentialBound": false,
"afterChallengeState": "rejected",
"userPresent": true
}
],
"authenticationValidationNotes": {
"requiredChecks": [
"credential/account binding",
"type",
"challenge",
"allowed origin",
"rpIdHash",
"required UP/UV",
"stored-key signature verification"
],
"signCountZeroIsNotUniversalCompromiseProof": true
},
"recoveryAlias": "RECOVERY_SECRET_ALIAS_NOT_A_SECRET",
"recoveryVerifierAlias": "RECOVERY_VERIFIER_ALIAS_NOT_A_HASH",
"recoveryPurpose": "lifecycle-recovery",
"replacementVerifierAlias": "NEW_PASSWORD_VERIFIER_ALIAS_NOT_A_HASH",
"recoveryRows": [
{
"case": "recovery",
"approvedRecoveryEvidence": true,
"assuranceRequirementMet": true,
"subjectBound": true,
"purposeMatched": true,
"proofMatches": true,
"unused": true,
"lifetimeValid": true,
"resetCompleted": true,
"afterProofState": "consumed",
"credentialGenerationAfter": "credential-generation-b",
"lostCredentialStateAfter": "invalidated",
"oldSessionStateAfter": "revoked",
"notificationQueued": true,
"ordinarySessionIssued": false,
"notificationMeaning": "A new independent notification is queued for this attempt; delivery is not asserted."
},
{
"case": "recovery-used",
"approvedRecoveryEvidence": true,
"assuranceRequirementMet": true,
"subjectBound": true,
"purposeMatched": true,
"proofMatches": true,
"unused": false,
"lifetimeValid": true,
"resetCompleted": false,
"afterProofState": "consumed",
"credentialGenerationAfter": "credential-generation-b",
"lostCredentialStateAfter": "invalidated",
"oldSessionStateAfter": "revoked",
"notificationQueued": false,
"ordinarySessionIssued": false,
"notificationMeaning": "No additional notification queued by this rejected attempt; prior queued messages are not cleared."
}
],
"sensitiveChanges": {
"passwordChange": "fresh current authenticator proof plus scoped permission",
"contactChange": "fresh proof, new contact verification and independent notification",
"factorBinding": "fresh proof plus account-bound ceremony validation"
},
"selector": {
"language": "XPath",
"xml": "<audit><binding newCredentialBound=\"true\" originMatched=\"true\" freshReauth=\"true\"/></audit>",
"xpath": "count(/audit/binding[@newCredentialBound=\"true\" and (@originMatched=\"false\" or @freshReauth=\"false\")])",
"expected": 0,
"positiveFixtureXml": "<audit><binding newCredentialBound=\"true\" originMatched=\"false\" freshReauth=\"true\"/></audit>",
"positiveExpected": 1,
"scope": "Own association-integrity XML; no CBOR/COSE, Browser ceremony, crypto, recovery provider or delivery runtime.",
"missingFieldBehavior": "Selection requires declared fields. Missing fields mean insufficient evidence; a zero count does not prove control efficacy."
}
}- rpId / expectedOrigin
- Domain credential scope ile scheme/host/port origin farklıdır; cookie scope değildir.
- credentialAlias / userHandleAlias / publicKeyAlias
- Account-key association’ı izleyen alias’lar; gerçek credential bytes veya usable key değil.
- registrationRows
- Fresh proof ve ceremony acceptance kapıları sonucu; crypto sonuçları supplied predicate’tir.
- recoveryRows
- Approved evidence/assurance supplied; restricted reset, proof consume ve affected invalidation ayrı.
- notificationQueued / ordinarySessionIssued
- Queue=true delivery değildir; recovery başarı normal login session’ı otomatik açmaz.
Aliases actual secret/key/challenge değildir. Fresh existing-factor reauth, approved recovery evidence ve crypto/attestation/required-flag sonuçları declared input’tur. Browser create/get, signature, provider recovery, mail delivery veya distributed revocation çalıştırılmaz.
İki yanlış kanı
Passkey login’de biometric template ve private key server’a gönderilir.
Authenticator key operasyonunu yapar; RP public-key association ve valid result’u değerlendirir. Local biometric verification raw biometric aktarımı anlamına gelmez.
Password reset başarıyla bitince bütün authenticator ve session’lar kendiliğinden iptal olur.
Affected credentials, session/token revocation ve notifications ayrı lifecycle işlemleridir; propagation ve ordinary login ayrıca değerlendirilir.
SIRA SENDE
Bu hikâyeyi sen çöz.
Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.
Passkey registration’da cryptographicResultValid=true, fakat originMatched=false. Yeni credential account’a bağlanır mı?
- Evet. Crypto sonucu true ise ceremony context’i önemsizdir.
- Hayır. newCredentialBound=false; challenge rejected.
Gerekçeli cevabı oku
Hayır. newCredentialBound=false; challenge rejected. — Bu registration policy’si origin, challenge, type, subject ve diğer koşulları birlikte ister. Tek geçerli crypto sonucu yanlış origin’i kabul ettirmez.
Recovery proof’u zaten consumed. notificationQueued=false, daha önce kuyruğa eklenen bildirimin silindiği anlamına mı gelir?
Dersten seçilen artifact alanları; öğretim örneği
- recoveryRows[1].unused
- false
- recoveryRows[1].resetCompleted
- false
- recoveryRows[1].notificationQueued
- false
- recoveryRows[1].notificationMeaning
- No additional notification queued by this rejected attempt; prior queued messages are not cleared.
- Hayır. Reddedilen attempt yeni bildirim eklemez; önceki kuyruk temizlenmez.
- Evet. Reddedilen proof bütün önceki recovery effect’lerini geri alır.
Gerekçeli cevabı oku
Hayır. Reddedilen attempt yeni bildirim eklemez; önceki kuyruk temizlenmez. — unused=false reset’i reddeder. notificationMeaning yalnız bu attempt için ek bildirim olmadığını açıklar; eski kayıtların silindiğini söylemez.
Recovery yeni generation kurup eski session’ı revoke ediyor, fakat ordinarySessionIssued=false. Recovery neden normal login ve notification delivery ile aynı işlem değildir?
Gerekçeli cevabı oku
Recovery, account’a bağlı ve gerekli assurance koşulunu sağlayan ayrı lifecycle proof’u ister. Bu örnekte password verifier değişir, kayıp credential geçersiz olur ve eski session revoke edilir; yeni normal session üretilmez. Notification queued olmak delivery kanıtı değildir. Yeni factor binding veya contact değişikliği de kendi fresh proof ve ceremony koşullarını ister. Alias’lar gerçek recovery secret, COSE key veya çalıştırılmış browser ceremony değildir.
□ Recovery purpose’unu normal session issuance ile eşitlemedim.
□ Notification queued sonucunu delivery veya eski effect’lerin geri alınması saymadım.
Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç
Kaynaklar ve kapsam
- W3C — Web Authentication Level 31 Introduction · 7.1 Registering a New Credential · 7.2 Verifying an Authentication Assertion · 13.4.9 Validating the origin of a credential · 6.1.1 Signature Counter Considerations
- MDN — Web Authentication APIWebAuthn concepts and usage · Creating a key pair and registering a user · Authenticating a user
- FIDO Alliance — PasskeysWhat are passkeys? · Based on Open Standards
- OWASP — Forgot Password Cheat SheetForgot Password Request · User Resets Password · Account Recovery After Suspected Compromise · General Security Practices · URL Tokens
- OWASP — Multifactor Authentication Cheat SheetIntroduction · One-Time Password (OTP) Handling and Storage · Resetting MFA · Changing MFA Factors · MFA Fatigue (Push Notification Bombing): Mitigations
- OWASP — Authentication Cheat SheetUsernames · Compare Password Hashes Using Safe Functions · Authentication and Error Messages · Login Throttling · Require Re-authentication for Sensitive Features
- NIST SP 800-63B-4 — Authentication and Authenticator Management2.2 Authentication Assurance Level 2 · 3.1.1.2 Password Verifiers · 3.2.2 Rate Limiting (Throttling) · 3.2.5 Phishing Resistance · 4.1 Authenticator Binding · 4.2 Account Recovery · 4.5 Invalidation · 4.6 Account Notifications
- OWASP — Logging Cheat SheetWhich events to log · Event attributes · Data to exclude · Verification