Lewati ke konten
Keamanan

Apa yang melindungi sebuah tenant, dikatakan apa adanya.

Tidak ada sertifikasi yang tidak kami pegang, tidak ada kata sifat yang menggantikan kendali. Ini yang ditegakkan, di mana ditegakkannya, dan apa yang belum ada.

Enam belas ruang kerja, dan tidak ada apa pun di antaranyaKisi empat kali empat berisi sel ruang kerja, masing-masing memuat operator, kunci, versi konfigurasi, dan log audit. Sela di antaranya digambar sebagai garis pejal, dan tidak ada jalur yang melintasinya di mana pun dalam gambar. Satu sel dibuka pada ukuran tiga kali lipat: repositori yang dibatasi ruang kerja itu, satu kunci API dan satu rahasia webhook yang masing-masing membawa key id, serta log audit hanya-tambah yang dipaksakan oleh trigger basis data.Ruang kerjaIsolasi bersifat struktural01020304050607080910111213141516Satu ruang kerjaworkspace_idsetiap kueri di lapisan data memerlukannyaapi_key(kid)dirotasi pada jendela yang tumpang tindihwebhook_secret(kid)dirotasi dengan cara yang samaaudit_loghanya tambah — ditegakkan oleh trigger basis dataTidak ada jalur yang melintasi celah — ketiadaannya itulah intinyaSetiap kueri di lapisan data menerima sebuah ruang kerja. Tidak ada titik panggil yang bisa melewatkannya.
Enam belas ruang kerja. Tidak ada garis di antara dua sel mana pun, karena di antara keduanya memang tidak ada yang bisa ditulis.
Multi-tenant

Isolasi itu struktural, bukan hasil pengawasan.

Setiap kueri atas data milik sebuah ruang kerja membawa id ruang kerja di kondisinya. Tidak ada jalur akses tanpa lingkup yang bisa lupa dipakai.

Kegagalan yang dihapus rancangan ini adalah yang paling biasa: sistem yang sudah benar, lalu satu endpoint baru yang ditulis terburu-buru melewatkan klausa WHERE. Kalau lapisan data menolak menjawab pertanyaan yang tidak menyebut ruang kerja, endpoint itu tidak terkompilasi menjadi sebuah kebocoran — ia tidak terkompilasi sama sekali.

Uji kebocoran bergaya penyerang memaku sifat ini, alih-alih memercayai kebiasaan, sebab sebuah kebiasaan hanya sebaik orang terakhir yang membaca berkas itu.

internal/tenancy · migrations/0002

Catatan

Log audit hanya-tambah ada di basis data, bukan di aplikasi.

Sebuah pemicu melempar galat pada setiap pembaruan atau penghapusan. Aplikasi yang memutuskan tidak menulis ulang sejarah adalah kebijakan; basis data yang menolak menulis ulang adalah kendali.

Inilah perbedaan yang ditanyakan auditor dan biasanya tak bisa dijawab vendor. Kalau satu-satunya penghalang penyuntingan surut adalah “tidak ada jalur kode yang melakukannya”, maka satu skrip dukungan, satu migrasi, atau satu operator dengan konsol bisa melakukannya, dan log tidak akan tahu.

internal/tenancy · migrations/0002 audit_log_immutable()

Kredensial

Kunci berotasi tanpa gangguan layanan. Masuk akun tahan phishing.

Rotasi yang butuh jendela pemeliharaan adalah rotasi yang tidak pernah terjadi.

Dua volume, dan bidang di antaranyaDua volume isometrik berdiri di atas dua petak tanah bergaris yang terpisah, dengan sebuah bidang tegak di antaranya yang terlihat dari sisinya. Volume kiri milik operator, terbagi empat ruang: Stripe, NOWPayments, bank, dan dompet. Volume kanan milik platform, terbagi menjadi buku besar, proses jalan, klaim, dan kotak keluar. Empat garis melintasi bidang di antaranya, diberi label pada bidang itu sendiri: peristiwa, instruksi, tanda terima, dan perintah. Tidak ada garis yang membawa uang, dan volume kanan tidak punya satu pun ruang yang bisa menampung saldo.Dua volume · satu bidang · tanpa pintuSTRIPEBuku besarNOWPAYMENTSProsesBankKlaimDompetKotak keluarOperatorXEXBatas kustodiPeristiwaInstruksiTanda terimaPerintahTidak ada volume yang menyeberangUang berada di kompartemen operator dan tidak pernah disalin ke milik kami.Empat hal melintasi bidang ini. Tidak satu pun berupa saldo, dan tidak satu pun berupa kunci.
Dua volume, satu bidang di antaranya. Tidak ada pintu di sana.
  1. 01

    Id kunci dengan masa berlaku bertindih

    Kunci API dan kunci tanda tangan webhook tiap ruang kerja membawa sebuah id kunci. Selama rotasi keduanya berlaku, jadi Anda berpindah sesuai jadwal Anda sendiri lalu mencabut yang lama.

    internal/tenancy · internal/outbox/sign.go

  2. 02

    Passkey untuk anggota maupun operator

    WebAuthn dengan verifikasi pengguna dan kredensial yang dapat ditemukan sebagai keharusan — bukan pilihan, karena token ini berdiri tepat di depan aliran uang. Masuk dengan kredensial yang dapat ditemukan menemukan akunnya dari kredensial itu sendiri, jadi tidak ada yang perlu diketik dan tidak ada yang bisa dipancing.

    internal/passkey

  3. 03

    Dua faktor lewat aplikasi, disimpan dengan benar

    Rahasia TOTP tidak bisa di-hash — verifikasi harus menghitung ulang kodenya dari rahasia itu — jadi rahasia anggota disegel dengan AES-256-GCM di bawah subkunci khusus konteks, bukan disimpan terbuka. Penghitung dari kode yang diterima ditulis balik, sehingga sebuah kode tidak bisa dipakai ulang dalam jendela waktunya.

    internal/membertotp · internal/secretbox

  4. 04

    Di-hash bila bisa, disegel bila tidak

    Kata sandi atau kode pemulihan di-hash, karena platform hanya perlu menjawab “ini bukan?”. Rahasia yang harus bisa dibaca kembali oleh platform justru disegel, dan penyimpanan yang lebih tua dari konstruksi itu sedang dipindahkan ke sana, bukan dibiarkan apa adanya.

    internal/secretbox

Lalu lintas keluar

Tidak ada yang bocor lewat URL yang Anda konfigurasi.

Tujuan sebuah webhook, menurut konstruksinya, adalah masukan yang dipengaruhi penyerang — itu URL yang diketik tenant, lalu platform memanggilnya dari dalam jaringannya sendiri.

Pengirim menjalankan penjaga lalu lintas keluar sebelum permintaan dikirim, alih-alih memercayai nama host; hanya urutan itu yang berguna: pemeriksaan setelah resolusi nama, atau pemeriksaan atas teksnya alih-alih atas alamat sesungguhnya, persis pemeriksaan yang memang dirancang untuk ditembus DNS rebinding. Tujuan loopback dan jaringan privat hanya diizinkan di sandbox dan uji ujung-ke-ujung, dan pelonggaran itu adalah flag eksplisit, bukan menebak lingkungan.

internal/outbox/ssrf.go · internal/outbox/dispatcher.go

Kustodi

Kami bukan kustodian, dan kodenya menolak menjadi kustodian.

Tidak memegang dana anggota. Tidak memegang kunci privat. Tidak ada kredensial platform di dalam kanal pembayaran seorang tenant.

Anggota membayar Anda

Tiap kanal dikonfigurasi dengan kredensial milik tenant sendiri, di rekening milik tenant sendiri.

internal/rails

Konfigurasi menolak milik kami

Menyimpan kredensial yang sama dengan milik platform ditolak. Pemeriksaan itu ada karena “pakai punya kami dulu” adalah cara sebuah vendor perangkat lunak tanpa sengaja menjadi lembaga pembayaran.

internal/rails

Penarikan memberi instruksi, tidak pernah memindahkan

Sebuah penarikan memesan baris buku besar yang persis dan mengeluarkan satu instruksi. Eksekusinya milik Anda, dan uang yang dieksekusi juga milik Anda.

internal/claims

Identitas

Verifikasi tanpa menyimpan dokumen.

Sesi penyedia berjalan di akun Anda sendiri. Yang kembali adalah sebuah keputusan dan satu penanda yang tidak bisa dibalik.

Penanda itu cukup untuk menegakkan satu orang satu posisi, dan tidak lebih. Ia tidak cukup untuk menyusun ulang sebuah identitas, dan justru itulah intinya: cara paling aman menyimpan pindaian paspor adalah tidak menyimpannya, dan sebuah kebocoran tidak bisa mengungkap data yang tidak pernah disimpan.

internal/verification

Yang tidak kami klaim

Hal-hal yang tidak kami klaim.

Kalau Anda sedang mengisi kuesioner penilaian vendor, inilah baris-baris yang akan kami gagal penuhi. Lebih baik tahu di sini daripada di bulan keempat.

Kami tidak memegang laporan SOC 2. Belum pernah ada uji penetrasi oleh pihak ketiga. Kami tidak menerbitkan komitmen ketersediaan layanan, karena belum ada apa pun di sini yang mengukurnya. XEX memberi Anda kendali dan catatan; ia tidak memberi Anda izin usaha, dan bukan nasihat hukum. Apakah rencana kompensasi Anda sah di negara tempat Anda memasarkannya adalah hal yang harus Anda pastikan sendiri, dan ketentuan platform kami memang mewajibkannya.
Pelaporan kerentanan
Saat ini tidak ada program bug bounty dan tidak ada imbalan untuk sebuah laporan. Laporkan kerentanan lewat jalur keamanan di halaman kontak; kami akan mengonfirmasi penerimaannya dan memberi tahu apa yang sedang kami lakukan. Mohon jangan menguji di ruang kerja tenant yang sedang beroperasi — ambil sandbox gratis, yang merupakan produk utuh, dan ujilah di sana.

See /contact#security

Berikutnya

Kirimkan kuesionernya, atau ambil sandbox dan lihat sendiri.

Keduanya sama-sama boleh. Salah satunya lebih cepat.