보안 아키텍처¶
HistorySync는 민감한 데이터를 다룹니다 — 브라우저 기록과 WebDAV 자격 증명. 이 페이지에서는 해당 데이터가 어떻게 보호되는지 정확히 설명합니다.
위협 모델¶
HistorySync는 다음으로부터 보호하도록 설계되었습니다:
- 자격 증명 도용 — 디스크의 설정 파일을 읽는 악성 프로세스가 평문 WebDAV 비밀번호를 복구할 수 없어야 합니다.
- 전송 중 데이터 노출 — 기록 백업과 복원은 암호화된 연결을 사용해야 합니다.
- 우발적 데이터 손실 — 손상된 설정과 실패한 업로드가 데이터베이스를 비일관적인 상태로 남겨서는 안 됩니다.
HistorySync는 다음으로부터 보호하지 않습니다:
- 손상된 OS 또는 루트 수준 공격자 (키체인에 직접 접근 가능).
- 물리적 접근 공격 (전체 디스크 암호화는 이 애플리케이션의 범위를 벗어납니다).
- 동일한 사용자 세션에서 코드를 실행할 수 있는 공격자.
보안 아키텍처 V2¶
마스터 키 저장¶
첫 실행 시 암호학적으로 무작위한 256비트 마스터 키가 생성되어 keyring 라이브러리를 사용하여 OS 키체인에 저장됩니다:
| 플랫폼 | 키체인 백엔드 |
|---|---|
| Windows | Windows 자격 증명 관리자 |
| macOS | macOS 키체인 |
| Linux | Secret Service API (GNOME Keyring, KWallet 등) |
마스터 키는 디스크에 직접 저장되지 않습니다. 디스크에 저장되는 모든 데이터는 파생된 서브키를 사용합니다.
키 파생 (HKDF)¶
마스터 키에서 HistorySync는 HKDF (HMAC 기반 키 파생 함수)를 사용하여 각 목적에 맞는 독립적인 서브키를 파생시킵니다:
마스터 키 (256비트)
│
├── HKDF(info="encryption") → 암호화 서브키 (256비트)
└── HKDF(info="authentication") → 인증 서브키 (256비트)
독립적인 서브키를 사용하면 하나의 서브키가 손상되더라도(예: 암호화 알고리즘에 대한 암호 분석 공격) 다른 서브키에는 영향을 미치지 않습니다.
민감한 값의 암호화¶
WebDAV 비밀번호 및 기타 민감한 설정 값은 HKDF-SHA256 키스트림 XOR로 암호화되고 HMAC-SHA256으로 인증됩니다:
encrypt(plaintext, master_key):
salt ← 무작위 16바이트 솔트
prk ← HMAC-SHA256(key=salt, data=master_key) # HKDF-Extract
enc_key ← HKDF-Expand(prk, info="historysync-enc-key")
auth_key ← HKDF-Expand(prk, info="historysync-auth-key")
keystream ← HKDF-Expand(prk, info="historysync-enc-key", length=len(padded_plaintext))
ciphertext ← padded_plaintext XOR keystream
tag ← HMAC-SHA256(key=auth_key, data=salt ‖ ciphertext)
return base64(0x02 ‖ salt ‖ tag ‖ ciphertext)
결과는 config.json에 Base64 문자열로 저장됩니다. 불러올 때는 복호화 전에 HMAC 태그가 먼저 검증됩니다.
HMAC-SHA256은 인증된 암호화를 제공합니다 — 암호문에 대한 변조 시도는 HMAC 검증 실패를 일으켜 DecryptionError가 발생하고 기록됩니다. 앱은 충돌하거나 손상된 값을 자동으로 수락하지 않고 빈 비밀번호로 계속 실행됩니다.
설정 파일 안전성¶
설정 파일(config.json)은 원자적 이름 변경 방식으로 기록됩니다:
- 같은 디렉토리에 있는 임시 파일에 데이터를 씁니다.
- 디스크에 플러시하기 위해
fsync()를 호출합니다. - 임시 파일을 기존 설정 파일 위에 이름 변경합니다.
이렇게 하면 설정이 부분적으로 기록된 상태가 되지 않습니다. 쓰기 중에 프로세스가 종료되더라도 이전 설정은 그대로 보존됩니다.
불러올 때 설정 파일이 손상된 것으로 발견되면:
1. config.json.bak으로 백업됩니다.
2. 새로운 기본 설정으로 교체됩니다.
3. 사용자에게 경고 다이얼로그가 표시됩니다.
WebDAV 전송 보안¶
- 모든 WebDAV 연결은 기본적으로 HTTPS를 사용합니다.
- SSL 인증서 검증은 기본적으로 활성화되어 있습니다 (
webdav.verify_ssl = true). - SSL 검증 비활성화 (
verify_ssl = false)는 신뢰할 수 있는 내부 네트워크의 자체 서명 인증서에는 가능하지만, 인터넷 연결 서버에는 권장하지 않습니다. - 백업 업로드는 원자적 스트리밍 방식을 사용합니다 — 업로드가 성공적으로 완료된 후에만 원격 파일이 교체됩니다.
비밀번호 / 마스터 비밀번호 (GUI 잠금)¶
HistorySync는 GUI를 잠그는 선택적인 마스터 비밀번호를 지원합니다. 이는 위의 WebDAV 자격 증명 암호화와는 별개입니다.
- 비밀번호는
config.json의 bcrypt 해시 (master_password_hash필드)로 저장됩니다. - bcrypt 해시는 단방향입니다 —
config.json이 도용되더라도 평문 비밀번호를 복구할 수 없습니다. - 마스터 비밀번호는 기록 데이터베이스 자체를 암호화하지 않습니다 — GUI만 잠급니다.
개인 정보 보호 기능¶
| 기능 | 설명 |
|---|---|
| 도메인 차단 목록 | 차단 목록의 도메인은 절대 가져오지 않으며, 기존 레코드는 영구적으로 삭제됩니다. |
| URL 접두사 필터 | 내부 브라우저 URL(chrome://, about:, file:// 등)은 기본적으로 필터링됩니다. |
| 소프트 숨기기 | 레코드를 삭제하지 않고 메인 보기에서 숨길 수 있습니다. |
| 숨김 레코드 보기 | 소프트로 숨겨진 레코드를 위한 별도의 접근 제어 보기. |
| 헤드리스 / Fresh 모드 | --fresh 모드는 임시 디렉토리를 사용합니다 — 실제 설정/데이터베이스에 대한 읽기 또는 쓰기가 없습니다. 개인 정보 보호가 필요한 데모나 문제 해결에 유용합니다. |
취약점 보고¶
보안 취약점에 대해 공개 GitHub 이슈를 열지 마세요.
다음을 포함하여 0x4fe6@gmail.com으로 이메일을 보내주세요:
- 취약점 설명.
- 재현 단계.
- 잠재적 영향.
72시간 이내에 응답을 드릴 것입니다. 수정 및 책임감 있는 공개 일정을 함께 조율하겠습니다.