-
Notifications
You must be signed in to change notification settings - Fork 0
Security
Sangyong Bae edited this page Sep 3, 2026
·
5 revisions
SSOT: docs/04 무해화 · docs/08 ADR-0002 · docs/17 ADR-0005 · docs/29 와이어 감사
- 신원 = 기기 키 지문(PeerId = X25519 정적 공개키). 이름·IP·사용자 주장은 신원의 근거가 아니다.
- TOFU: 첫 접촉에서 키를 핀하고, 이후 같은 키만 신뢰를 잇는다. 이름이 같아도 다른 키에 신뢰가 옮겨가지 않는다(불상속). 이름 재사용은 경고.
- 핀은 암호화 영속 — 재시작해도 유지(MITM 창 상시 개방 문제 해소). 핀 파일은 "내가 아는 상대 전체 목록"이라 그 자체를 암호화한다. 파일 손상·키 불일치 시 fail-closed(전부 미검증 취급 + 잠김 표시 — 조용한 재핀 오염 금지).
-
키 지문 대조로
FingerprintVerified승격(08-18 확정 · 종전 60자리 SAS 카드에서 전환):/fingerprint로 내·상대 키 지문을 확인하고 전화·대면 등 다른 채널로 대조한 뒤/verify(또는 카드의 '대조 완료' 버튼)로 승격한다./unverify로 강등. ★ 승격은 통로 밖 대조가 전제 — 이 통로 안의 문답으로 승격하면 중간자가 그 문답을 대신할 수 있다.
- 발견 패킷은 서명 없는 힌트 — 존재·이름·포트만 싣고, 프로필·연락처·메시지는 절대 싣지 않는다(허용 목록 심사).
- 표시 이름 기본값은 정제된 호스트명(실명 추정 부분 제거 · 판별 불가 시 지문 라벨) — 실명이 LAN에 평문 방송되지 않는다.
- 세션은 Noise_XX — 핸드셰이크가 키 소유를 증명하고, 이후 전 페이로드가 AEAD 암호화된다. 와이어 평문 부재는 tap 테스트로 고정.
보낸 사람이 누구든 믿지 않는다 — 신원과 무관하게 항상 적용.
- 협상 — 자격(핀+양방향 대화)·수신 정책(자동/기간/수동/거부)·용량·속도 합의
-
격리 — 원본은 실체화되지 않고
.beepq봉인(해시·메타 포함)으로 격리함에 - 검사 — 위험 등급 판정(확장자·매직 fail-closed) · (예정) AV/AMSI 어댑터
-
승인 실체화 — 사람이 승인해야 다운로드 폴더로. 해시 재검증·실행비트 제거·OS 격리 표식(macOS quarantine · Windows MotW
Zone.Identifier) — 복원 후에도 OS 보호(SmartScreen·Gatekeeper)가 이어진다
앱은 수신 파일을 실행하지 않고, 링크를 자동으로 열지 않으며, 아카이브를 자동 해제하지 않는다.
이미지 파서는 역사적으로 RCE의 단골 통로다. 그래서 본체는 이미지 파서를 링크하지 않는다.
- 디코딩은 별도 프로세스(
nbeep-imgdec)에서만 일어나고, 본체는 그 결과 픽셀을 다시 검증한다. - 상한: 원본 16MiB(폰 사진 대응 · 할당 전 검사) · 축소 후 반환 · 시간 초과 시 부모가 죽인다.
- 쓰레기 입력은 fail-closed(출력 0바이트) · 디코더가 없으면 사진 대신 이니셜 아바타로 폴백.
- 적용처: 프로필 아바타 · 수신 이미지 미리보기(격리함·대화 스레드)·확대 미리보기. 디코드는 워커 프로세스라 대화창이 얼지 않는다. SVG는 지원하지 않는다(스크립트 표면).
- 격리 프로세스 권한 강등 완료(08-15 — mac Seatbelt · Linux seccomp · Windows 완화 정책 · fail-closed · CI 실측) · AMSI 실물 검사(Windows · EICAR 실측 · 08-21) · 저장 축 평문 0(격리물·PII·프로필 캐시·기록 전부 봉인 · 크립토 셰레딩)
-
공용 봉투
sealed(ChaCha20-Poly1305 · trust.seg·Noise와 같은 암호군) — 헤더NBSE· salt/nonce 매회 신선 · 파일 종류별 도메인 분리 파생 키(바꿔치기 차단) · fail-closed(평문 폴백 없음). -
평문 3면 봉인 완료(08-17) — ① 격리물
.beepq② PII 사이드카profile.sec(이메일·전화) ③ 프로필 이미지 캐시. 디스크 평문 0(마커 검증). - 저장 암호화 = A(기기 키 파생 래핑) 단일 확정 — 승격 옵션(OS 보안 저장소·사용자 암호)은 둘 다 실격: OS 저장소는 DR-4 포터블을 깨고(기기 종속 → USB 이동 시 안 열림), 사용자 암호는 DR-1 제로컨피그와 충돌(시작마다 입력). 재검토는 Managed Server 모드(ADR-0013).
- 설정 파일은 평문(민감하지 않은 값만) · 신뢰 핀·PII·대화 기록·이미지 캐시는 암호화.
- 신원 키 파일(
identity.key)은 평문(래핑 원료 자체라 자신을 감쌀 수 없음 — 구조적 한계로 문서화) · Unix 0600 · 백업은 사용자 책임 고지.
- 최초 접촉 MITM은 원천 차단 불가(TOFU의 본질) — 키 지문 대조(
/fingerprint→다른 채널 대조→/verify)가 완화책. - 고정 공개키 주기 광고 = 재식별자(R-18) — 감수 vs 광고 끄기 옵션 판단 대기.
- 기기 자체 탈취(키 파일 동봉)는 기본 구성이 못 막는다 — 승격 옵션이 보완.
- 서명·공증 전: macOS는 Cask가 격리 표식을 제거(임시방편), Windows는 SmartScreen 경고 가능.
- 그룹 대화도 E2E 그대로 — 그룹 키를 따로 두지 않고 기존 1:1 세션 위로 팬아웃한다(ADR-0012). 그래서 구성원 수만큼 보내는 비용이 있고, 그 개선(콘텐츠 키 봉투)은 확정 대기다.
- 서버는 아직 없다(v1은 로컬 직접만). 나중에 붙더라도 평문에 접근하지 못하는 것이 설계 전제이고, 방향은 ADR-0013에 있다 — 다만 릴레이·보관을 쓰면 "누가 누구와 언제"라는 메타데이터는 서버가 알게 된다(내용은 몰라도).
- 한글 입력 이슈는 따로 등록·추적한다 — 34 한글 입력 이슈 총람.