콘텐츠로 이동

보안 아키텍처

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)은 원자적 이름 변경 방식으로 기록됩니다:

  1. 같은 디렉토리에 있는 임시 파일에 데이터를 씁니다.
  2. 디스크에 플러시하기 위해 fsync()를 호출합니다.
  3. 임시 파일을 기존 설정 파일 위에 이름 변경합니다.

이렇게 하면 설정이 부분적으로 기록된 상태가 되지 않습니다. 쓰기 중에 프로세스가 종료되더라도 이전 설정은 그대로 보존됩니다.

불러올 때 설정 파일이 손상된 것으로 발견되면: 1. config.json.bak으로 백업됩니다. 2. 새로운 기본 설정으로 교체됩니다. 3. 사용자에게 경고 다이얼로그가 표시됩니다.


WebDAV 전송 보안

  • 모든 WebDAV 연결은 기본적으로 HTTPS를 사용합니다.
  • SSL 인증서 검증은 기본적으로 활성화되어 있습니다 (webdav.verify_ssl = true).
  • SSL 검증 비활성화 (verify_ssl = false)는 신뢰할 수 있는 내부 네트워크의 자체 서명 인증서에는 가능하지만, 인터넷 연결 서버에는 권장하지 않습니다.
  • 백업 업로드는 원자적 스트리밍 방식을 사용합니다 — 업로드가 성공적으로 완료된 후에만 원격 파일이 교체됩니다.

비밀번호 / 마스터 비밀번호 (GUI 잠금)

HistorySync는 GUI를 잠그는 선택적인 마스터 비밀번호를 지원합니다. 이는 위의 WebDAV 자격 증명 암호화와는 별개입니다.

  • 비밀번호는 config.jsonbcrypt 해시 (master_password_hash 필드)로 저장됩니다.
  • bcrypt 해시는 단방향입니다 — config.json이 도용되더라도 평문 비밀번호를 복구할 수 없습니다.
  • 마스터 비밀번호는 기록 데이터베이스 자체를 암호화하지 않습니다 — GUI만 잠급니다.

개인 정보 보호 기능

기능 설명
도메인 차단 목록 차단 목록의 도메인은 절대 가져오지 않으며, 기존 레코드는 영구적으로 삭제됩니다.
URL 접두사 필터 내부 브라우저 URL(chrome://, about:, file:// 등)은 기본적으로 필터링됩니다.
소프트 숨기기 레코드를 삭제하지 않고 메인 보기에서 숨길 수 있습니다.
숨김 레코드 보기 소프트로 숨겨진 레코드를 위한 별도의 접근 제어 보기.
헤드리스 / Fresh 모드 --fresh 모드는 임시 디렉토리를 사용합니다 — 실제 설정/데이터베이스에 대한 읽기 또는 쓰기가 없습니다. 개인 정보 보호가 필요한 데모나 문제 해결에 유용합니다.

취약점 보고

보안 취약점에 대해 공개 GitHub 이슈를 열지 마세요.

다음을 포함하여 0x4fe6@gmail.com으로 이메일을 보내주세요:

  • 취약점 설명.
  • 재현 단계.
  • 잠재적 영향.

72시간 이내에 응답을 드릴 것입니다. 수정 및 책임감 있는 공개 일정을 함께 조율하겠습니다.