Skip to content

Threat Model — Account Merge

위협 매트릭스

#위협영향완화책
T1Confused Deputy (T3) — 탈취 세션으로 타 계정 흡수A 데이터 view 에 X 데이터 혼입호출자=survivor / 입력 이메일=흡수 방향 고정. dual PoP (세션 + verified email OTP)
T2Replay — 과거 요청/webhook 재전송중복 mergeT1/T2 외부 surface 없음. OTP 5분+단일사용. Webhook X-Logi-Timestamp ±5분 + event_id dedupe. idempotency_key
T3Race / Concurrent Mergecanonical 모호[survivor, merged] ORDER BY id ASC FOR UPDATE. identity_links_no_cycle_trg. 2번째 tx → :already_processed
T4Stale device_secret takeover (T1)위장 흡수T1 은 각 SSO 의 fresh provider id_token 검증 필요. device_secret 단독으로 SSO 통과 불가
T5Cross-provider email squatting (T2)victim 가입 시 흡수 linkT2 는 양쪽 provider 모두 verified email 필요. 공격자가 mailbox 통제 못하면 불가
T6Token takeover after merge흡수된 토큰 재사용merge tx 안에서 9-category 자격증명 즉시 revoke + jti blocklist. RP 세션은 user.merged webhook 으로 정리
T7Cycle / Chain corruption (A→B+B→C)canonical 모호DB BEFORE INSERT 트리거 reject + app MergeService.guard_cycle! + resolver MAX_DEPTH=10
T8OAuth Code Injection / Mix-Up (RFC 6819 §4.4.1.1, RFC 8252 §8.1)code 가로채기PKCE 강제 + downgrade defense (public client secret reject) + redirect URI exact-match + issuer validation + state echo
T9Refresh Token Reuse / Theft토큰 도난RT rotation + reuse detection → revoke_chain! 전체 후속 chain revoke. HMAC-SHA256 digest 저장. User-row lock
T10RP-to-RP User Correlationcross-RP 프로파일링Pairwise sub (OIDC Core §8.1): SHA256(sector_id ‖ user_id ‖ app.pairwise_salt)[0..32]. subject_types_supported:["pairwise"]
T11Audit Log Tampering발자국 위조AuthenticationAuditLog SHA256 hash chain (previous_hash→current_hash) + verify_chain! + GENESIS_HASH. 한계: DB superuser 통째 재계산 가능 → 외부 immutable 스토리지 export 권장

STRIDE 매핑

STRIDE위협
SpoofingT1, T4, T5, T8
TamperingT7, T11
RepudiationT11
Information DisclosureT10
Denial of ServiceT3
Elevation of PrivilegeT1, T6, T9

보안 컨트롤

컨트롤적용 위협구현
PKCE 강제 (public client downgrade reject)T8Oauth::AuthorizationsController, Oauth::ClientAuthentication L30-44
Redirect URI exact-matchT8Oauth::RedirectUriValidator
Issuer validationT8discovery issuerOIDC_ISSUER env
RT rotation + reuse chain revokeT9Oauth::TokensController#rotate_refresh_token L98-101
RT digest (HMAC-SHA256)T9OauthAccessToken#refresh_token_digest
Pairwise subT10Oauth::SubjectIdentifier
Hash chain audit logT11Authentication::AuditLogger
Merge canonical lock + cycle triggerT3, T7MergeService, identity_links_no_cycle_trg, guard_cycle!
9-category credential revoke on mergeT6merge transaction
Webhook HMAC + timestamp + event_idT2RP webhook spec
OTP 5분 + 단일사용 (consumed_at)T2T3 merge OTP
Fresh provider id_token 검증T1, T4SSO 콜백
Verified email on both providersT5T2 트리거 조건

측정 항목

  • logi_merge_attempts_total{trigger=}
  • logi_merge_failures_total{reason=conflict|cycle|contention|user_in_purge|both_pop_required}
  • logi_t3_merge_otp_dispatches_total{outcome=sent|invalid_target|rate_limited|unverified_email}
  • logi_webhook_delivery_failures_total{rp=, retry_count=}

cycle / both_pop_required spike → incident 격상.

관련 문서

MIT License · Identity가 제품의 신뢰를 만듭니다.