Kebijakan Keamanan
Herkos menangani kunci privat dan pesan terenkripsi, jadi kami menanggapi laporan keamanan dengan serius dan lebih suka mengetahui masalah sejak dini daripada terlambat.
Melaporkan kerentanan
Mohon jangan membuka issue publik untuk masalah keamanan.
Laporkan secara pribadi melalui email ke security@herkos.email.
Hal-hal yang berguna untuk disertakan: apa masalahnya, cara mereproduksinya, platform dan versi yang Anda uji, serta apa yang dapat dicapai penyerang. Bukti konsep (proof of concept) sangat membantu.
Jangan pernah menyertakan nsec, kunci rahasia, atau rahasia bunker Anda sendiri dalam laporan.
Kami berupaya mengonfirmasi penerimaan laporan dalam beberapa hari. Karena Herkos adalah proyek kecil, mohon beri waktu yang wajar untuk perbaikan sebelum mengungkapkannya secara publik. Kami dengan senang hati mencantumkan nama Anda dalam advisori, kecuali Anda tidak menginginkannya.
Yang termasuk cakupan
Aplikasi Herkos itu sendiri: penanganan dan penyimpanan kunci, enkripsi dan
dekripsi pesan (termasuk pemeriksaan pengirim NIP-59 dan isolasi Bcc
di local_packages/nostr_mail), kunci aplikasi, komunikasi dengan relay dan jembatan,
penanganan lampiran, serta pipeline build dan rilis. Untuk Herkos Drive,
juga paket protokolnya (packages/herkos_drive_protocol) dan halaman yang
membuka link-nya (herkos.app/f/); lihat bagiannya sendiri di bawah.
Yang tidak termasuk cakupan
- Protokol Nostr dan NIP-nya itu sendiri — laporkan ke pihak hulu.
- Relay, jembatan, dan server Blossom yang dioperasikan oleh pihak ketiga. Herkos disertai setelan default tetapi tidak menjalankannya; laporkan masalah kepada operatornya.
- Proyek hulu Nostr Mail Client, kecuali masalahnya khusus terkait perubahan yang dibuat di Herkos.
- Kurangnya penguatan keamanan yang sudah kami dokumentasikan sebagai batasan yang diketahui (lihat di bawah).
Batasan yang diketahui, dinyatakan apa adanya
Ini adalah kompromi desain, bukan kerentanan. Kami lebih suka menuliskannya daripada membiarkan seseorang mengetahuinya dengan cara yang menyakitkan:
- Email ke alamat tradisional tidak terenkripsi end-to-end. Pesan antarpengguna Nostr menggunakan gift wrap NIP-17 dan terenkripsi E2E. Saat Anda menulis ke alamat email biasa, jembatan mengonversi pesan tersebut dan dapat membacanya.
- Kunci aplikasi (PIN dan biometrik) adalah penghalang praktis, bukan enkripsi data tersimpan. Kunci ini menghentikan orang yang mengambil perangkat yang tidak terkunci; kunci ini tidak melindungi dari penyerang yang memiliki akses penuh ke perangkat atau penyimpanannya.
- Di Windows, autentikasi khusus biometrik tidak dapat diwajibkan. Windows Hello tidak mengizinkan pemilihan metode, sehingga PIN sistem selalu tetap tersedia sebagai cadangan.
- Kehilangan kunci berarti kehilangan akun. Tidak ada pemulihan, memang dirancang demikian.
- Metadata tidak sepenuhnya tersembunyi. Relay dapat mengamati pola koneksi, dan setiap relay melihat alamat IP Anda, bahkan ketika relay tersebut tidak dapat membaca isi pesan. Yang tidak dibocorkan Herkos (sejak 30-09-2026) adalah siapa menulis kepada siapa ketika relay meminta autentikasi NIP-42:
- Mencari tujuan pengiriman. Daftar relay dan daftar Blossom milik penerima
diminta melalui koneksi terpisah yang tidak pernah mengidentifikasi Anda, pertama-tama
di relay yang tidak mewajibkan autentikasi (
purplepag.es,user.kindpag.es,nos.lol,offchain.pub). - Profil dan penjadwal. Nama dan gambar yang ditampilkan untuk orang lain (kind 0), serta daftar relay DVM penjadwal saat Anda menjadwalkan atau membatalkan email, diminta dengan cara yang sama: secara anonim terlebih dahulu dan, jika relay bersikeras, dengan kunci sementara yang dijelaskan di bawah, tidak pernah dengan kunci Anda (sejak 01-10-2026; sebelumnya, relay yang meminta autentikasi mendapatkan kunci Anda, dan dapat mengetahui profil siapa yang sedang Anda lihat). Hanya profil Anda sendiri yang masih dibaca sebagai Anda.
- Pengiriman. Gift wrap dikirim ke relay DM milik penerima, melalui koneksi terpisah yang sama. Jika salah satunya mewajibkan autentikasi, Herkos menjawab dengan kunci yang dibuat khusus untuk keperluan itu dan hanya disimpan di memori, tidak pernah dengan kunci Anda; setiap akun di perangkat memiliki kuncinya sendiri. Relay tetap dapat melihat bahwa perangkat yang sama (IP yang sama, kunci sementara yang sama) mengirim beberapa amplop selama satu sesi.
- Email berukuran besar. Salinan terenkripsi dari email yang lebih besar dari 32 KB diunggah ke server Blossom, termasuk server milik penerima. Hanya server Anda sendiri (daftar Blossom Anda) yang menerima unggahan yang diotorisasi dengan kunci Anda. Server lain mana pun menerimanya secara anonim dan, jika server itu bersikeras meminta otorisasi, otorisasi yang ditandatangani dengan kunci sementara yang sama seperti di atas (sejak 01-10-2026; sebelumnya, setiap server mendapatkan kunci Anda). Server yang hanya menerima kunci yang dikenal akan menolaknya, dan salinannya tetap berada di server-server lainnya.
- Data Anda sendiri. Sinkronisasi kotak surat, label, setelan, dan draf Anda melakukan autentikasi, jika relay memintanya, sebagai akun pemilik data tersebut, bahkan saat beralih akun. Di relay Anda sendiri, hal itu tidak memberi tahu apa pun yang belum mereka ketahui: permintaan tersebut memang menyebutkan kunci Anda. Daftar relay dan daftar Blossom Anda sendiri bersifat publik dan diminta tanpa mengidentifikasi Anda, begitu pula relay yang disebutkan dalam link email.
- Status baca dan folder adalah metadata publik (untuk saat ini). Menandai email sebagai sudah dibaca, berbintang, diarsipkan, atau dipindahkan akan menerbitkan event label NIP-32 yang tidak terenkripsi dan terkait dengan kunci publik Anda, termasuk nama folder kustom. Pengirim yang mengetahui id email yang ia kirim kepada Anda dapat mengetahui kapan Anda menindaklanjutinya. Enkripsi label ini sudah direncanakan; sampai saat itu, anggaplah nama folder bersifat publik.
- Notifikasi push dan pengiriman terjadwal menggunakan layanan pihak ketiga. Server
push, jika Anda memilihnya (secara default tidak ada;
api.nmail.lidenganrelay.nmail.lijika diminta), mengetahui kunci publik Anda, token push, dan kapan Anda menerima email; DVM penjadwal mengetahui kunci publik Anda dan pesan yang sudah terenkripsi yang harus diterbitkannya. Keduanya bersifat opsional (harus diaktifkan) dan didokumentasikan diPRIVACY.md. Teks notifikasi push dipilih oleh server push, dan Herkos hanya memercayainya ketika UnifiedPush mengirimkannya dalam keadaan terenkripsi (RFC 8291); payload yang tidak terenkripsi hanya membangunkan aplikasi untuk mengambil email itu sendiri. - Versi web menyimpan kunci Anda di browser, tempat paling lemah untuknya. Aplikasi yang terinstal menyerahkan kunci rahasia Anda ke penyimpanan aman sistem operasi (Android Keystore, DPAPI di Windows, libsecret, iOS/macOS Keychain). Browser tidak memiliki semua itu: kunci berada di penyimpanan origin dan diproses lewat JavaScript pada setiap tanda tangan, dalam jangkauan kode apa pun yang berjalan di halaman — ekstensi browser yang memiliki akses ke semua situs, bug XSS di aplikasi atau di dependensi, deployment yang telah dimanipulasi — dan dalam jangkauan infostealer apa pun yang menyalin profil browser. Selain itu, tidak ada saat di mana Anda memverifikasi kode sekali saja: biner yang ditandatangani diperiksa saat instalasi, sedangkan halaman web mengirimkan kode baru pada setiap kunjungan. Masuklah ke versi web dengan penanda tangan jarak jauh (bunker NIP-46, Amber), agar kunci tidak pernah mencapai browser, atau perlakukan versi web sebagai identitas sekali pakai dan simpan kunci asli Anda di aplikasi yang terinstal.
- Email lewat jembatan hanya dapat dipercaya sejauh jembatannya dapat dipercaya. Herkos memverifikasi bahwa
pesan yang ditandai berasal dari jembatan benar-benar ditandatangani oleh jembatan yang telah
Anda konfigurasi (atau salah satu jembatan default). Herkos tidak dapat memverifikasi apa pun tentang
alamat
From:lama yang diteruskan oleh jembatan. - Lampiran dibuka oleh sistem operasi. Herkos tidak pernah menjalankan jenis file yang dapat dieksekusi atau skrip, dan meminta konfirmasi sebelum menyerahkan lampiran lain yang tidak dapat dipratinjau ke aplikasi default sistem, tetapi aplikasi yang membuka file tersebut berada di luar kendali kami.
Herkos Local Relay: apa yang dilindunginya dan apa yang tidak
Herkos Local Relay menyimpan event aplikasi Anda di perangkat Anda, termasuk event pribadi (draf, daftar pribadi, amplop yang Anda terima). Berikut hal yang melindunginya dan di mana batasnya, per platform. Laporkan masalah keamanan relay dengan cara yang sama seperti masalah lainnya (di atas).
Seluruh basis data dienkripsi, termasuk jurnalnya (SQLite3 Multiple Ciphers, AEGIS-256). Kuncinya adalah 32 byte acak yang dibuat di perangkat dan disimpan di penyimpanan aman sistem: Keystore di Android, DPAPI di Windows, keyring (libsecret) di Linux. Kunci ini tidak memakai kata sandi Anda, karena relay harus dapat berjalan sendiri. Tanpa kunci, relay tidak berjalan dan memberitahukannya: relay tidak pernah membuka atau membuat basis data yang tidak terenkripsi, dan tidak pernah menghapus basis data yang tidak dapat dibukanya.
| Jika… | Android | Windows | Linux |
|---|---|---|---|
| seseorang menyalin file basis data (salinan cadangan, folder yang disinkronkan, citra disk) | Terlindungi | Terlindungi | Terlindungi |
| perangkat atau disk dicuri dalam keadaan mati | Terlindungi: kuncinya ada di Keystore | Terlindungi, kecuali pencuri mengetahui kata sandi masuk Windows Anda: DPAPI melindungi kunci dengan kata sandi itu | Terlindungi, kecuali pencuri mengetahui kata sandi keyring Anda (hampir selalu kata sandi sesi Anda) |
| akun pengguna lain di perangkat yang sama | Terlindungi | Terlindungi: DPAPI berlaku per pengguna | Terlindungi: keyring berlaku per pengguna |
| aplikasi atau program lain yang berjalan sebagai pengguna Anda | Terlindungi: Android memisahkan setiap aplikasi dan Keystore hanya memberikan kunci kepada relay | Tidak: DPAPI mengenkripsi per pengguna, bukan per aplikasi; program yang berjalan sebagai Anda dapat meminta kunci seperti halnya relay | Tidak: keyring sesi Anda tidak memisahkan aplikasi satu sama lain |
| ponsel yang di-root, atau alat yang menjalankan kode sebagai aplikasi | Tidak | — | — |
| seseorang memegang perangkat dalam keadaan tidak terkunci | Hanya PIN atau sidik jari relay, jika Anda memasangnya | Sama | Sama |
| seseorang membaca memori relay saat berjalan | Tidak | Tidak | Tidak |
Di desktop, batas DPAPI dan keyring sama dengan batas program mana pun: keduanya melindungi dari pengguna lain dan dari orang yang membawa pergi disk, bukan dari program berbahaya yang sudah berjalan sebagai Anda. Jika kasus itu mengkhawatirkan Anda, yang melindungi Anda adalah enkripsi disk sistem (BitLocker, LUKS) dan tidak menjalankan program yang tidak Anda percayai. Di Linux tanpa keyring (tanpa Secret Service), relay tidak berjalan dan menjelaskan alasannya: relay tidak pernah menyimpan kunci dalam bentuk teks biasa.
Siapa yang dapat masuk, di perangkat itu sendiri. Relay hanya mendengarkan
di 127.0.0.1, dan aplikasi mana pun di perangkat, atau halaman web di
browser, dapat menjangkau alamat itu. Karena itu:
- Aplikasi harus dipasangkan: aplikasi itu muncul di layar relay dan Anda menyetujuinya (dengan PIN atau sidik jari, jika Anda memasangnya). Aplikasi apa pun dapat memberi dirinya nama apa pun: setujui hanya jika Anda baru saja memintanya dari aplikasi itu.
- Halaman web selalu harus dipasangkan, dan pemasangan hanya berlaku dari tempat pemasangan itu dibuat: pemasangan aplikasi di perangkat tidak membuka apa pun untuk halaman web, meskipun halaman itu menandatangani dengan kunci yang sama.
- Aplikasi yang dipasangkan hanya membaca dan menulis jenis event yang Anda berikan kepadanya, dan hanya menghapus event yang boleh ditulisnya. Mencabutnya langsung memutus koneksinya.
- Aplikasi yang tidak dipasangkan hanya membaca event publik Anda (yang memang sudah publik) dan tidak menulis apa pun, kecuali Anda mengaktifkan setelan yang mengizinkan aplikasi perangkat yang tidak dipasangkan untuk masuk.
- Event pribadi hanya diberikan kepada siapa pun yang membuktikan dengan NIP-42 bahwa ia memegang kunci pemilik event tersebut, dan amplop hanya kepada penerimanya.
Yang tidak dilindunginya, di sini:
- Aplikasi berbahaya di perangkat dapat memperlambat relay atau membuatnya menghabiskan memori. Dengan cara itu, aplikasi tersebut tidak dapat membaca apa pun yang pribadi.
- Saat relay tidur atau tidak berjalan, port-nya kosong. Di Android, relay tidur setelah 10 menit tanpa koneksi; di desktop, port kosong selama Anda belum menjalankannya. Aplikasi lain dapat mendengarkan di sana dan menyamar sebagai relay. Aplikasi Herkos akan memeriksa kunci relay sebelum mengiriminya apa pun yang pribadi; saat ini belum, dan sampai saat itu ini adalah batas yang nyata.
- Di desktop, pengguna lain di komputer itu dapat terhubung sebagai aplikasi yang tidak dipasangkan: membaca event publik Anda dan meminta untuk dipasangkan.
Jaringan lokal, jika Anda mengaktifkannya (nonaktif secara default):
- Hanya
wss://, dengan sertifikat milik relay sendiri; tidak pernahws://tanpa enkripsi di luar perangkat. - Tidak ada apa pun sebelum autentikasi (NIP-42) dengan kunci yang ada di daftar Anda. Koneksi yang tidak melakukannya dalam 30 detik ditutup, dan jaringan lokal memiliki jumlah koneksinya sendiri: tidak pernah memakai koneksi milik aplikasi di perangkat.
- Kunci yang ada di daftar membaca event publik Anda dan event pribadinya sendiri, dan hanya menulis event yang ditandatanganinya. Menghapusnya dari daftar akan memutus koneksinya.
- Sertifikat hanya berlaku untuk nama di rumah (
localhost,.local, alamat pribadi): meskipun seseorang mencuri kuncinya, kunci itu tidak berguna untuk menandatangani domain Internet di perangkat yang memasangnya.
Yang tidak dilindunginya, di sini: siapa pun di jaringan yang sama dapat melihat bahwa perangkat memiliki port terbuka dan berapa banyak lalu lintas yang melewatinya, meskipun tidak isinya; dan jika perangkat memiliki alamat publik (tanpa router di antaranya), port itu dapat terlihat dari Internet, meskipun tetap meminta kunci yang ada di daftar Anda.
Salinan. Salinan terenkripsi memiliki kata sandi (scrypt dan XChaCha20-Poly1305): tanpa kata sandi itu tidak ada yang dapat membukanya, termasuk kami. Ekspor JSONL tidak dienkripsi dan memuat event pribadi Anda dalam bentuk teks biasa; aplikasi memperingatkan Anda tentang hal itu.
Kunci aplikasi (PIN, ditambah sidik jari atau Windows Hello) diminta saat aplikasi dibuka, setelah 30 detik ditinggalkan, dan untuk menyetujui pemasangan. Ini adalah penghalang praktis, seperti di Mail: tidak mengenkripsi apa pun. Di Android, jika PIN dipasang, tidak ada tangkapan layar dan tidak ada gambar mini di daftar aplikasi terbaru, dan sejak Android 12 tidak ada jendela aplikasi lain yang dapat berada di atas jendela relay saat Anda menggunakannya.
Herkos Drive: apa yang dilindunginya dan apa yang tidak
Herkos Drive menyimpan file Anda di server Blossom dan daftar file serta folder
Anda di relay Nostr, keduanya dienkripsi di perangkat Anda. Berikut hal yang
melindunginya dan di mana batasnya. Detail lengkapnya ada di spec-drive.md dan
model ancaman amenazas-drive.md, di packages/herkos_drive_protocol/; apa yang
dilihat setiap relay dan server ada di
kebijakan privasi. Laporkan masalah keamanan
Drive dengan cara yang sama seperti masalah lainnya (di atas).
Apa yang tidak dapat dilakukan relay dan server:
- Membaca file Anda atau namanya. Setiap blok file dienkripsi dengan AES-256-GCM menggunakan kunci dari revisinya sendiri; nama, folder, ukuran, tanggal, dan kunci dikirim tersegel dengan XChaCha20-Poly1305 menggunakan kunci folder tempatnya berada. Tidak ada yang diturunkan dari isi: file yang sama diunggah dua kali menghasilkan blok yang berbeda.
- Mengubah, menukar, atau memindahkan apa pun tanpa ketahuan. Setiap blok diperiksa terhadap manifes yang tersegel di entri file-nya, dan setiap entri ditandatangani oleh kunci volume dan disegel untuk tempatnya sendiri (volume, pengenal, dan folder): relay tidak dapat menyamarkan satu entri sebagai entri lain, atau satu blok sebagai blok lain.
- Mengembalikan versi lama. Aplikasi tidak pernah menerima entri yang lebih lama daripada yang sudah dimilikinya untuk pengenal yang sama.
- Menulis atas nama Anda hanya dengan kunci volume. Apa yang ditulis perangkat Anda membawa tanda pemilik, sebuah HMAC dengan kunci yang tidak diberikan oleh link mana pun; entri atau penghapusan tanpa tanda itu tidak diterima, dan aplikasi memperingatkan Anda.
Apa yang tidak dilindunginya:
- Pola Drive Anda. Relay dapat menghitung file dan folder Anda, melihat bentuk pohonnya dan kapan setiap entri berubah; server melihat kira-kira seberapa besar setiap file (blok diberi padding hingga 64 KiB, entri hingga pangkat dua). Setiap relay dan server melihat alamat IP Anda. Gunakan Tor atau Orbot di tingkat sistem jika hal itu penting bagi Anda.
- Apa yang sudah diunduh seseorang. Menghapus link, atau seseorang, langsung memberi kunci baru pada apa yang bisa mereka buka, sehingga mereka tidak dapat membuka apa yang Anda tambahkan kemudian; ini tidak dapat menarik kembali apa yang sudah mereka simpan.
- Link yang bocor. Link tanpa kata sandi adalah kuncinya. Browser mungkin menyimpannya di riwayat sebelum halaman menghapusnya dari bilah alamat. Untuk apa pun yang sensitif, beri link itu kata sandi, yang dikirim lewat cara lain, atau bagikan dengan akun orang tersebut. Kata sandi yang lemah dapat dibobol seiring waktu: siapa pun yang memiliki link dapat mencobanya secara offline.
- Halaman
herkos.app/f/berjalan di browser siapa pun yang membuka link. Halaman ini disajikan dengan Content-Security-Policy yang ketat, Subresource Integrity, dan tanpa kode pihak ketiga, tetapi siapa pun yang mengendalikan host web dapat menyajikan halaman yang berbeda. Itulah batas setiap halaman web yang mendekripsi di browser. - Siapa pun yang pernah memegang kunci volume (milik Anda, atau yang diberikan bersama link ke folder) masih dapat menghapus blok yang diunggah dengannya, sampai blok itu diunggah lagi. Anda dapat mengubah kunci volume (Setelan → Kunci volume): perangkat Anda yang lain mengikuti dengan sendirinya.
- Perangkat Anda. Daftar file disimpan dalam cache secara terenkripsi, dengan kuncinya di penyimpanan aman sistem; file yang Anda unduh atau buka ditulis tanpa enkripsi di tempat yang Anda pilih. PIN Drive adalah penghalang praktis, seperti di Mail.
- Komputer kuantum, kelak. Blok dan segel bersifat simetris (AES-256, XChaCha20), tetapi lokator Anda dienkripsi dengan NIP-44 pada secp256k1: seseorang yang menyimpannya hari ini dan membobol secp256k1 besok dapat membuka seluruh Drive.
Cara pemeriksaannya. Dua tinjauan internal terhadap model ancaman (2 November 2026) beserta perbaikannya; pengujian atas apa yang ditampilkan setiap event dan blok; fuzzing pada setiap pembaca data yang datang dari luar (event, segel, manifes, link, cadangan). Belum ada audit eksternal: satu audit direncanakan sebelum beta publik, dan laporannya akan diterbitkan secara lengkap. Drive masih dalam pengembangan.
Versi yang didukung
Perbaikan keamanan diterapkan pada versi rilis terbaru. Mengingat ukuran proyek ini, versi lama tidak dipelihara — mohon perbarui sebelum melapor.