GNX Courage Text™ / hoKssi.com · Threat Model
번호 비공개·동의·vaporize 통제
1. 보호 자산
보호 대상은 requester phone, recipient action, first message, view token, handoff code, phone ciphertext, route secret, audit evidence, license key, provider credential이다.
전화번호 비공개는 UI 문구가 아니라 저장 방식, TTL, 암호화, access boundary, vaporize worker가 결합될 때만 성립한다.
2. 위협 모델 요약
| Threat | Risk | Control |
|---|---|---|
| 무단 직접 발송 | 상대 동의 전 메시지 전달 | device_handoff, user-triggered AirDrop, /c confirmation |
| 번호 수집화 | requester/recipient 장기 저장 | HMAC token, ciphertext, TTL secret |
| visible code leakage | 제3자 재사용 | code not displayed in visible card, terminal guard |
| replay | 같은 code 재사용 | terminal state ignored |
| stale consent | 만료 후 1/2 | expired/BURNED check |
| provider misfire | 외부 SMS 발송 | ENABLE_OUTBOUND_SEND=false safety gate |
| log leakage | query/token/plaintext 노출 | no-query nginx log, redacted docs, audit hash |
3. 동의 통제
현행 V1은 수신자가 /c/<hidden_code> 화면에서 1 또는 2를 선택한다. 수신자에게 보이는 card_text에는 code가 노출되지 않는다. 1 선택은 수신자 iPhone 문자앱을 requester phone과 body=1로 여는 행위이며, 실제 전송은 수신자가 직접 수행한다.
2 선택은 거절 의사이며, 서버 선택 route에서는 REJECTED/BURNED로 처리될 수 있고 sms-link V1에서는 body=2로 requester에게 직접 보내도록 열 수 있다.
4. Vaporize controls
Text Intent, requester_contact_secret, sms_route_secret, handoff_card는 TTL과 worker에 의해 닫힌다. 만료 후 code는 ignored_terminal_or_expired 또는 handoff_expired_or_closed로 처리되어야 한다.
Worker는 burn_expired_batch, requester_contact_secrets_vaporized, sms_route_secrets_burned 이벤트를 남긴다.
5. Storage and crypto
message_ciphertext, phone_ciphertext, requester_phone_ciphertext는 encryptForStorage로 저장된다. requester_id와 phone 관련 identifiers는 HMAC token으로 다룬다. evidence hash는 audit_events와 burn_records에서 상태 전이와 증적의 무결성을 보조한다.
운영 화면과 admin API는 원본 phone/message를 직접 표시하지 않는다. 필요 시 복호화는 제한된 relay/sms-link 처리 흐름 안에서만 수행된다.
6. Provider lock
현재 provider는 unconfigured이며 worker safety gate는 ENABLE_OUTBOUND_SEND=true, DELIVERY_MODE=server_dispatch, SMS_PROVIDER=http_json이 모두 만족되지 않으면 발송하지 않는다.
Provider unlock은 별도 승인 절차와 legal sender registration, credential scope, rollback backup, hokssicheck 전후 확인 없이는 금지한다.
7. Residual risk
AirDrop 자체의 수락/표시 UI는 iOS가 통제한다. 서버는 /c/<hidden_code> URL과 recipient confirmation page를 제공하지만, AirDrop 대상 선택은 반드시 요청자가 직접 수행해야 한다.
현장 혼잡, 기기명 혼동, AirDrop 설정 오류, Safari 공유 시트 제약은 운영자 교육과 현장 runbook으로 관리한다.