Verifikasi Formal (Model Keamanan)
Halaman ini melacak model keamanan formal OpenClaw (TLA+/TLC saat ini; lebih banyak lagi sesuai kebutuhan).Catatan: beberapa tautan lama mungkin merujuk ke nama proyek sebelumnya.Tujuan (north star): menyediakan argumen yang diperiksa mesin bahwa OpenClaw menegakkan kebijakan keamanan yang dimaksudkan (otorisasi, isolasi sesi, pembatasan tool, dan keamanan dari salah konfigurasi), dengan asumsi yang dinyatakan secara eksplisit. Apa ini (saat ini): suite regresi keamanan yang dapat dijalankan dan digerakkan oleh penyerang:
- Setiap klaim memiliki pemeriksaan model yang dapat dijalankan pada ruang keadaan yang terbatas.
- Banyak klaim memiliki model negatif berpasangan yang menghasilkan jejak counterexample untuk kelas bug yang realistis.
Lokasi model
Model dipelihara di repo terpisah: vignesh07/openclaw-formal-models.Peringatan penting
- Ini adalah model, bukan implementasi TypeScript penuh. Perbedaan antara model dan kode mungkin terjadi.
- Hasil dibatasi oleh ruang keadaan yang dijelajahi TLC; hasil “hijau” tidak menyiratkan keamanan di luar asumsi dan batas yang dimodelkan.
- Beberapa klaim bergantung pada asumsi lingkungan yang dinyatakan secara eksplisit (misalnya, deployment yang benar, input konfigurasi yang benar).
Mereproduksi hasil
Saat ini, hasil direproduksi dengan meng-clone repo model secara lokal dan menjalankan TLC (lihat di bawah). Iterasi mendatang dapat menawarkan:- model yang dijalankan CI dengan artefak publik (jejak counterexample, log run)
- workflow “jalankan model ini” yang di-host untuk pemeriksaan kecil yang terbatas
Eksposur gateway dan salah konfigurasi gateway terbuka
Klaim: binding di luar loopback tanpa auth dapat memungkinkan kompromi jarak jauh / meningkatkan eksposur; token/password memblokir penyerang tanpa autentikasi (sesuai asumsi model).- Run hijau:
make gateway-exposure-v2make gateway-exposure-v2-protected
- Merah (sesuai harapan):
make gateway-exposure-v2-negative
docs/gateway-exposure-matrix.md di repo model.
Pipeline exec node (kapabilitas dengan risiko tertinggi)
Klaim:exec host=node memerlukan (a) allowlist perintah node ditambah perintah yang dideklarasikan dan (b) persetujuan langsung saat dikonfigurasi; persetujuan ditokenisasi untuk mencegah replay (di dalam model).
- Run hijau:
make nodes-pipelinemake approvals-token
- Merah (sesuai harapan):
make nodes-pipeline-negativemake approvals-token-negative
Pairing store (pembatasan DM)
Klaim: permintaan pairing mematuhi TTL dan batas permintaan tertunda.- Run hijau:
make pairingmake pairing-cap
- Merah (sesuai harapan):
make pairing-negativemake pairing-cap-negative
Pembatasan ingress (mention + bypass control-command)
Klaim: dalam konteks grup yang mewajibkan mention, “control command” yang tidak berwenang tidak dapat melewati pembatasan mention.- Hijau:
make ingress-gating
- Merah (sesuai harapan):
make ingress-gating-negative
Isolasi routing/session-key
Klaim: DM dari peer yang berbeda tidak digabungkan ke sesi yang sama kecuali secara eksplisit ditautkan/dikonfigurasi.- Hijau:
make routing-isolation
- Merah (sesuai harapan):
make routing-isolation-negative
v1++: model terbatas tambahan (konkurensi, retry, ketepatan jejak)
Ini adalah model lanjutan yang memperketat fidelitas terhadap mode kegagalan dunia nyata (pembaruan non-atomik, retry, dan fan-out pesan).Konkurensi / idempotensi pairing store
Klaim: pairing store harus menegakkanMaxPending dan idempotensi bahkan di bawah interleaving (yaitu, “check-then-write” harus atomik / terkunci; refresh tidak boleh membuat duplikat).
Artinya:
-
Dalam permintaan serentak, Anda tidak dapat melebihi
MaxPendinguntuk sebuah channel. -
Permintaan/refresh berulang untuk
(channel, sender)yang sama tidak boleh membuat baris pending aktif yang duplikat. -
Run hijau:
make pairing-race(pemeriksaan batas atomik/terkunci)make pairing-idempotencymake pairing-refreshmake pairing-refresh-race
-
Merah (sesuai harapan):
make pairing-race-negative(race batas begin/commit non-atomik)make pairing-idempotency-negativemake pairing-refresh-negativemake pairing-refresh-race-negative
Korelasi jejak ingress / idempotensi
Klaim: ingest harus mempertahankan korelasi jejak di seluruh fan-out dan bersifat idempoten saat provider melakukan retry. Artinya:- Saat satu event eksternal menjadi beberapa pesan internal, setiap bagian mempertahankan identitas trace/event yang sama.
- Retry tidak menyebabkan pemrosesan ganda.
- Jika ID event provider tidak ada, dedupe menggunakan safe key cadangan (misalnya, trace ID) agar tidak menjatuhkan event yang berbeda.
-
Hijau:
make ingress-tracemake ingress-trace2make ingress-idempotencymake ingress-dedupe-fallback
-
Merah (sesuai harapan):
make ingress-trace-negativemake ingress-trace2-negativemake ingress-idempotency-negativemake ingress-dedupe-fallback-negative
Routing dmScope precedence + identityLinks
Klaim: routing harus menjaga sesi DM tetap terisolasi secara default, dan hanya menggabungkan sesi ketika dikonfigurasi secara eksplisit (prioritas channel + identity links). Artinya:- Override dmScope khusus channel harus menang atas default global.
- identityLinks hanya boleh menggabungkan dalam grup tertaut yang eksplisit, bukan melintasi peer yang tidak terkait.
-
Hijau:
make routing-precedencemake routing-identitylinks
-
Merah (sesuai harapan):
make routing-precedence-negativemake routing-identitylinks-negative