Herkos

보안 정책

Herkos는 개인 키와 암호화된 메시지를 다루므로 보안 신고를 진지하게 받아들이며, 문제는 늦게보다 일찍 듣는 편을 원합니다.

취약점 신고

보안 문제는 공개 이슈로 올리지 마세요.

security@herkos.email 로 이메일을 보내 비공개로 신고해 주세요.

포함하면 좋은 내용: 문제가 무엇인지, 어떻게 재현하는지, 어떤 플랫폼과 버전에서 시험했는지, 공격자가 무엇을 할 수 있는지. 개념 증명(PoC)이 있으면 큰 도움이 됩니다.

신고에 여러분 자신의 nsec, 개인 키, bunker 비밀값을 절대 넣지 마세요.

신고는 며칠 안에 확인 회신을 드리는 것을 목표로 합니다. Herkos는 작은 프로젝트이므로 공개하기 전에 수정할 수 있도록 합리적인 시간을 주시기 바랍니다. 원하지 않으시는 경우가 아니라면 보안 권고문에 기꺼이 이름을 올려 드립니다.

대상 범위

Herkos 애플리케이션 자체: 키 처리와 저장, 메시지 암호화와 복호화(NIP-59 발신자 검사와 local_packages/nostr_mail의 숨은 참조(Bcc) 격리 포함), 앱 잠금, 릴레이 및 브리지 통신, 첨부파일 처리, 빌드와 릴리스 파이프라인. Herkos Drive의 경우 그 프로토콜 패키지(packages/herkos_drive_protocol)와 그 링크를 여는 페이지(herkos.app/f/)도 포함됩니다. 아래의 별도 절을 참조하세요.

범위 밖

알려진 한계, 솔직하게

이것들은 취약점이 아니라 설계상의 절충입니다. 누군가 어렵게 알아내기보다 미리 적어 두는 편을 택했습니다:

Herkos Local Relay: 보호하는 것과 보호하지 못하는 것

Herkos Local Relay는 여러분 앱의 이벤트를 비공개 이벤트(초안, 비공개 목록, 여러분이 받는 봉투)까지 포함해 여러분의 기기에 보관합니다. 여기서는 무엇이 그것을 보호하는지, 그리고 한계가 어디인지 플랫폼별로 설명합니다. 릴레이의 보안 문제도 다른 문제와 같은 방법으로 신고해 주세요(위 참고).

데이터베이스 전체가 암호화되며, 저널도 포함됩니다(SQLite3 Multiple Ciphers, AEGIS-256). 키는 기기에서 만든 32바이트 무작위 값이며 시스템의 보안 저장소에 보관됩니다. Android에서는 Keystore, Windows에서는 DPAPI, Linux에서는 키링(libsecret)입니다. 릴레이가 스스로 시작해야 하므로 여러분의 비밀번호는 쓰지 않습니다. 키가 없으면 릴레이는 시작하지 않고 그 사실을 알립니다. 암호화되지 않은 데이터베이스를 열거나 만드는 일은 절대 없으며, 열 수 없는 데이터베이스를 삭제하는 일도 절대 없습니다.

만약… Android Windows Linux
누군가 데이터베이스 파일을 복사한다면(백업, 동기화 폴더, 디스크 이미지) 보호됨 보호됨 보호됨
꺼진 상태의 기기나 디스크를 도난당한다면 보호됨: 키는 Keystore에 있음 보호됨. 단, 상대가 Windows 로그인 비밀번호를 알면 예외: DPAPI가 그 비밀번호로 키를 보호함 보호됨. 단, 상대가 키링 비밀번호(거의 항상 세션 비밀번호)를 알면 예외
같은 기기의 다른 사용자 계정 보호됨 보호됨: DPAPI는 사용자별 보호됨: 키링은 사용자별
여러분의 사용자로 실행되는 다른 앱이나 프로그램 보호됨: Android는 앱을 서로 격리하고 Keystore는 키를 릴레이에만 줌 보호 안 됨: DPAPI는 앱별이 아니라 사용자별로 암호화하므로, 여러분으로 실행되는 프로그램은 릴레이와 똑같이 키를 요청할 수 있음 보호 안 됨: 세션의 키링은 앱을 서로 분리하지 않음
루팅된 휴대전화, 또는 앱으로서 코드를 실행하는 도구 보호 안 됨 — —
누군가 잠금이 풀린 기기를 손에 쥐고 있다면 릴레이의 PIN이나 지문만(설정한 경우) 동일 동일
누군가 실행 중인 릴레이의 메모리를 읽는다면 보호 안 됨 보호 안 됨 보호 안 됨

데스크톱에서 DPAPI와 키링의 한계는 다른 모든 프로그램과 같습니다. 다른 사용자와 디스크를 가져가는 사람으로부터는 보호하지만, 이미 여러분으로 실행 중인 악성 프로그램으로부터는 보호하지 못합니다. 그런 경우가 걱정된다면, 여러분을 보호하는 것은 시스템 디스크 암호화(BitLocker, LUKS)와 신뢰하지 않는 프로그램을 실행하지 않는 것입니다. 키링이 없는 Linux(Secret Service가 없는 경우)에서는 릴레이가 시작하지 않고 이유를 설명합니다. 키를 평문으로 보관하는 일은 절대 없습니다.

기기 안에서 누가 들어올 수 있는지. 릴레이는 127.0.0.1에서만 연결을 받지만, 기기의 어떤 앱이든, 브라우저의 웹 페이지든 그 주소에 닿을 수 있습니다. 그래서:

여기서 보호하지 못하는 것:

로컬 네트워크는 켠 경우에만 해당합니다(기본값은 꺼짐):

여기서 보호하지 못하는 것: 같은 네트워크에 있는 사람은 기기에 열린 포트가 있고 그곳으로 트래픽이 얼마나 지나가는지는 볼 수 있지만, 무엇이 지나가는지는 볼 수 없습니다. 그리고 기기에 공인 주소가 있으면(중간에 라우터가 없으면) 그 포트는 인터넷에서 보이지만, 여전히 여러분 목록에 있는 키를 요구합니다.

백업. 암호화된 백업에는 비밀번호가 있습니다(scrypt와 XChaCha20-Poly1305). 비밀번호가 없으면 우리를 포함해 아무도 열 수 없습니다. JSONL 내보내기는 암호화되지 않으며 비공개 이벤트가 평문으로 담깁니다. 앱이 이를 경고합니다.

잠금(PIN, 그리고 지문 또는 Windows Hello)은 앱을 열 때, 30초 동안 자리를 비운 뒤, 그리고 페어링을 승인할 때 요구됩니다. Mail에서와 마찬가지로 편의를 위한 장벽이며, 아무것도 암호화하지 않습니다. Android에서는 PIN을 설정하면 스크린샷을 찍을 수 없고 최근 앱 목록에 미리보기도 나타나지 않으며, Android 12부터는 릴레이를 사용하는 동안 다른 앱의 창이 릴레이 창 위에 겹칠 수 없습니다.

Herkos Drive: 보호하는 것과 보호하지 못하는 것

Herkos Drive는 여러분의 파일을 Blossom 서버에, 파일과 폴더 목록을 Nostr 릴레이에 보관하며, 둘 다 기기에서 암호화됩니다. 여기서는 무엇이 그것을 보호하는지, 그리고 한계가 어디인지 설명합니다. 자세한 내용은 packages/herkos_drive_protocol/에 있는 spec-drive.md와 위협 모델 amenazas-drive.md에 있고, 각 릴레이와 서버가 보는 것은 개인정보 처리방침에 있습니다. Drive의 보안 문제도 다른 문제와 같은 방법으로 신고해 주세요(위 참고).

릴레이와 서버가 할 수 없는 것:

보호하지 못하는 것:

검증 방법. 위협 모델에 비춘 두 차례의 내부 검토(2026년 11월 2일)와 그 수정, 각 이벤트와 블록이 무엇을 드러내는지에 대한 테스트, 외부에서 들어오는 것(이벤트, 봉인, 매니페스트, 링크, 백업)을 읽는 모든 부분에 대한 퍼징. 아직 외부 감사는 없습니다. 공개 베타 전에 한 번 계획되어 있으며, 그 보고서는 전문을 공개할 예정입니다. Drive는 아직 개발 중입니다.

지원 버전

보안 수정은 가장 최근에 릴리스된 버전에 적용됩니다. 프로젝트 규모상 이전 버전은 유지 관리하지 않으니, 신고하기 전에 업데이트해 주세요.