Skip to content

Security

Sangyong Bae edited this page Aug 13, 2026 · 5 revisions

보안 모델

SSOT: docs/04 무해화 · docs/08 ADR-0002 · docs/17 ADR-0005 · docs/29 와이어 감사

신원과 신뢰

  • 신원 = 기기 키 지문(PeerId = X25519 정적 공개키). 이름·IP·사용자 주장은 신원의 근거가 아니다.
  • TOFU: 첫 접촉에서 키를 핀하고, 이후 같은 키만 신뢰를 잇는다. 이름이 같아도 다른 키에 신뢰가 옮겨가지 않는다(불상속). 이름 재사용은 경고.
  • 핀은 암호화 영속 — 재시작해도 유지(MITM 창 상시 개방 문제 해소). 핀 파일은 "내가 아는 상대 전체 목록"이라 그 자체를 암호화한다. 파일 손상·키 불일치 시 fail-closed(전부 미검증 취급 + 잠김 표시 — 조용한 재핀 오염 금지).
  • SAS(안전 번호) 대조로 FingerprintVerified 승격(UX 노출은 진행 중).

전송 경로

  • 발견 패킷은 서명 없는 힌트 — 존재·이름·포트만 싣고, 프로필·연락처·메시지는 절대 싣지 않는다(허용 목록 심사).
  • 표시 이름 기본값은 정제된 호스트명(실명 추정 부분 제거 · 판별 불가 시 지문 라벨) — 실명이 LAN에 평문 방송되지 않는다.
  • 세션은 Noise_XX — 핸드셰이크가 키 소유를 증명하고, 이후 전 페이로드가 AEAD 암호화된다. 와이어 평문 부재는 tap 테스트로 고정.

수신 파일 무해화 (4단계 게이트)

보낸 사람이 누구든 믿지 않는다 — 신원과 무관하게 항상 적용.

  1. 협상 — 자격(핀+양방향 대화)·수신 정책(자동/기간/수동/거부)·용량·속도 합의
  2. 격리 — 원본은 실체화되지 않고 .beepq 봉인(해시·메타 포함)으로 격리함에
  3. 검사 — 위험 등급 판정(확장자·매직 fail-closed) · (예정) AV/AMSI 어댑터
  4. 승인 실체화 — 사람이 승인해야 다운로드 폴더로. 해시 재검증·실행비트 제거·OS 격리 표식(macOS quarantine · Windows MotW Zone.Identifier) — 복원 후에도 OS 보호(SmartScreen·Gatekeeper)가 이어진다

앱은 수신 파일을 실행하지 않고, 링크를 자동으로 열지 않으며, 아카이브를 자동 해제하지 않는다.

이미지 격리 디코드

이미지 파서는 역사적으로 RCE의 단골 통로다. 그래서 본체는 이미지 파서를 링크하지 않는다.

  • 디코딩은 별도 프로세스(nbeep-imgdec)에서만 일어나고, 본체는 그 결과 픽셀을 다시 검증한다.
  • 상한: 원본 1MiB · 픽셀 2048²(할당 검사) · 축소 후 반환 · 시간 초과 시 부모가 죽인다.
  • 쓰레기 입력은 fail-closed(출력 0바이트) · 디코더가 없으면 사진 대신 이니셜 아바타로 폴백.
  • 적용처: 프로필 아바타 · 수신 이미지 미리보기(격리함·대화 스레드). SVG는 지원하지 않는다(스크립트 표면).
  • 잔여: 격리 프로세스의 권한 강등(잡오브젝트/seccomp) — 지금은 프로세스 분리까지다.

저장 보호

  • 마스터 저장 키 = 무작위 생성 → 기기 키 파생 래핑 키로 한 겹(보호 수준 전환 시 재암호화 불필요). 승격 옵션: OS 보안 저장소 / 사용자 암호.
  • 설정 파일은 평문(민감하지 않은 값만) · 신뢰 핀·(예정) 대화 기록은 암호화.
  • 신원 키 파일은 평문(래핑 원료 자체라 자신을 감쌀 수 없음 — 구조적 한계로 문서화) · Unix 0600 · 백업은 사용자 책임 고지.

알려진 한계 (숨기지 않는다)

  • 최초 접촉 MITM은 원천 차단 불가(TOFU의 본질) — SAS 대조가 완화책.
  • 고정 공개키 주기 광고 = 재식별자(R-18) — 감수 vs 광고 끄기 옵션 판단 대기.
  • 기기 자체 탈취(키 파일 동봉)는 기본 구성이 못 막는다 — 승격 옵션이 보완.
  • 서명·공증 전: macOS는 Cask가 격리 표식을 제거(임시방편), Windows는 SmartScreen 경고 가능.
  • 그룹 대화도 E2E 그대로 — 그룹 키를 따로 두지 않고 기존 1:1 세션 위로 팬아웃한다(ADR-0012). 그래서 구성원 수만큼 보내는 비용이 있고, 그 개선(콘텐츠 키 봉투)은 확정 대기다.
  • 서버는 아직 없다(v1은 로컬 직접만). 나중에 붙더라도 평문에 접근하지 못하는 것이 설계 전제이고, 방향은 ADR-0013에 있다 — 다만 릴레이·보관을 쓰면 "누가 누구와 언제"라는 메타데이터는 서버가 알게 된다(내용은 몰라도).
  • 한글 입력 이슈는 따로 등록·추적한다 — 34 한글 입력 이슈 총람.

Clone this wiki locally