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 issuer ↔ OIDC_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 격상.

관련 문서 ​

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