Skip to content

fix: 펫 신원 인증 — 기준 프레임↔영상 동일 출처 검증(섀도) + 라이브니스 하한 재검토(도입 보류) - #134

Open
seizeh wants to merge 4 commits into
mainfrom
fix/pet-identity-hardening
Open

fix: 펫 신원 인증 — 기준 프레임↔영상 동일 출처 검증(섀도) + 라이브니스 하한 재검토(도입 보류)#134
seizeh wants to merge 4 commits into
mainfrom
fix/pet-identity-hardening

Conversation

@seizeh

@seizeh seizeh commented Jul 29, 2026

Copy link
Copy Markdown
Owner

배경

설계 리뷰에서 확인된 구멍: enroll-pet-identity가 영상만 Gemini로 검증하고 frames[]아무 검사 없이 기준셋으로 저장했다. 아무 라이브 영상 + 다른 개체 사진 조합의 직접 POST로 타 개체가 기준셋에 등록되면 이후 게시글 매칭 전체가 무력화된다.

변경 (커밋 3개)

23a7ed4 — 프레임↔영상 바인딩

  • enroll-pet-identity: 기존 Gemini 호출 하나에 프레임을 함께 넣어 frames_from_video(같은 개체·배경·촬영 세션) 판정. 호출 횟수 그대로 1회.

23f4b52 — 측정 없는 하드 리젝 제거

  • frames_from_video섀도 모드로(FRAMES_FROM_VIDEO_ENFORCE=false) — challenge 를 오탐으로 제거한 전례에 따라 오탐률 측정 후 활성화. 오탐 소지: 클라 프레임 추출 시각(800/2500/4000/5500ms)과 Gemini 1fps 샘플링 어긋남.
  • verify-post-photo: 1차 커밋에서 켰던 real>=0.70 하한 되돌림 + AI_REAL_THRESHOLD 삭제. 사진 1장 판정은 저조도·역광·블러에 민감해 절대 하한 없이 is_real && real>fake만 사용(영상 11초 기반 enroll 과 모달리티가 달라 대칭 근거 없음).
  • 인라인 페이로드 합계 19M chars 가드(video_too_large, Gemini 20MB 보호선).
  • docs: supabase-api.md 갱신(+구버전 challenge 잔재 정리, species_mismatch 하드 게이트 반영), supabase-db.md purpose CHECK 'pet_identity' 누락 보정.

355a8d9 — 섀도 판정을 측정 가능하게

  • 성공 등록마다 판정 1행을 photo_verifications에 기록 — 분모 = purpose='pet_identity' AND result='pass' 전체, 분자 = 그중 fail_reason='frames_not_from_video_shadow'. _shadow 접미사는 강제 전환 후의 실제 거절 행과의 영구 구분자. 즉시 만료+region_matched=false+image_url=null이라 게시 토큰으로 소비 불가.
  • video_too_large 거절 시 inlineChars 실측 로그 + 실패 행 기록(발생 빈도 측정, 가드는 보호자 확인 뒤로).

신뢰 경계 — 이 PR이 막는 것과 못 막는 것

  • 막는 것: 검증한 영상과 저장할 기준 프레임이 다른 조합(프레임 바꿔치기). 섀도 검증 후 활성화 시.
  • 못 막는 것: 다운로드한 타인 반려동물 영상에서 프레임을 실제로 추출해 보내는 공격 — 영상은 실물·라이브 통과, 프레임도 같은 출처라 통과. 기기 촬영 사실 자체는 어떤 서버 검증으로도 확인 불가하며 App Attest/Play Integrity 가 유일한 해법(미도입, 백로그).
  • 보호자 게이트는 이 위협에 무력 — 펫 등록 시 등록자가 자동으로 owner 보호자가 되므로(trg_pets_after_insert), 허위 매물 시나리오의 공격자는 자기가 만든 가짜 펫을 쓴다.
  • isMocked/좌표는 클라이언트 자기신고(코드 주석으로 명시).

배포

enroll-pet-identity v23, verify-post-photo v19 ACTIVE (본 PR 최종 내용).

후속

클라이언트 대응: seizeh/pmdart#212

🤖 Generated with Claude Code

- enroll-pet-identity: frames[] 를 검증 없이 기준셋으로 저장하던 구멍 차단.
  기존 Gemini 호출에 프레임을 함께 넣어 frames_from_video(영상과 같은
  개체·배경·촬영 세션) 판정, 불일치 시 frames_not_from_video 거절+기록.
- verify-post-photo: 선언만 있던 AI_REAL_THRESHOLD(0.70) 를 라이브니스
  게이트에 연결(is_real && real>=0.70 && real>fake). isMocked/좌표가
  클라이언트 자기신고임을 신뢰 경계 주석으로 명시.
- docs/supabase-api.md: 두 함수 스펙 갱신 + 구버전 challenge 잔재 정리,
  종 불일치 하드 게이트(species_mismatch) 반영.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
seizeh and others added 2 commits July 29, 2026 15:21
리뷰 반영 — 측정 없는 하드 리젝 두 개를 걷어낸다:

- enroll-pet-identity: frames_from_video 를 섀도 모드로 전환
  (FRAMES_FROM_VIDEO_ENFORCE=false). 판정 false 는
  photo_verifications(fail_reason='frames_not_from_video') 에 기록만 하고
  등록은 통과 — challenge 를 오탐으로 제거한 전례에 따라 오탐률 측정 후
  하드 게이트로 전환. 오탐 소지: 클라 프레임 추출 시각(800/2500/4000/5500ms)
  과 Gemini 1fps 샘플링 어긋남.
- enroll-pet-identity: 인라인 페이로드 합계 19M chars 가드 — Gemini 20MB
  한도 초과가 ai_unavailable 로 뭉개지지 않고 video_too_large(400) 로 구분
  (죽어 있던 클라 메시지 케이스 소생).
- verify-post-photo: real>=0.70 하한 되돌림 + AI_REAL_THRESHOLD 삭제.
  사진 1장 판정은 저조도·역광·블러에 민감해 절대 하한을 두지 않는다
  (영상 11초 기반 enroll 과 모달리티가 달라 대칭 근거 없음). 라이브니스는
  is_real && real>fake 로 복귀.
- docs: supabase-api.md 섀도 모드·페이로드 한도·하한 제거 반영,
  supabase-db.md purpose CHECK 에 'pet_identity' 누락 보정(20260713112529).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
리뷰 반영: 섀도 모드가 분자(false 판정)만 남기고 분모(판정받은 전체
등록)를 안 남겨 오탐률을 낼 수 없었고, result='fail' 행이 강제 전환 후의
실제 거절과 같은 모양이라 시맨틱이 충돌했다.

- 성공 등록마다 photo_verifications 에 판정 1행(result='pass',
  ai_pass=판정값, false 면 fail_reason='frames_not_from_video_shadow').
  분모 = purpose='pet_identity' AND result='pass' 전체, 분자 = _shadow 행.
  _shadow 접미사로 강제 전환 후의 거절 행과 영구 구분.
  즉시 만료 + region_matched=false + image_url=null 이라 게시 토큰 소비
  조건에 안 걸림(오용 불가).
- 섀도 중 fail 행을 남기던 logEnrollFail 분기는 강제 모드 전용으로 이동.
- video_too_large 도 같은 병 수정: 거절 시 inlineChars 실측 console 로그
  + 실패 행 기록(발생 빈도·분포 확인용). 가드를 보호자 확인 뒤로 이동.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@seizeh seizeh changed the title fix: 펫 신원 인증 — 기준 프레임↔영상 동일 출처 검증 + 라이브니스 하한 연결 fix: 펫 신원 인증 — 기준 프레임↔영상 동일 출처 검증(섀도) + 라이브니스 하한 재검토(도입 보류) Jul 29, 2026
베타 전환 결정 반영: 업체 파일럿만으로는 신원 인증 계열 표본이 안 모이는
갭을 명시하고, 개인 사용자 클로즈드 베타 트랙과 정식 출시 전 확인 조건
(frames_from_video 30건, 0.63 근거, video_too_large 분포, 관측성 진입 조건)
을 추가. 섀도 윈도우 노출은 수용 리스크로 기록.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant