Laporkan langsung ke Chief (Dr. Ferdi Iskandar). Jangan buka GitHub issue publik untuk celah keamanan.
- Cookie:
puskesmas_crew_session— HMAC-signed, TTL 12 jam - Password hashing: scrypt (N=16384, r=8, p=1, keylen=64 bytes)
- Session payload:
{ v:1, username, displayName, email, institution, profession, role, issuedAt, expiresAt } - Middleware Socket.IO: semua koneksi Socket.IO di-verify cookie session sebelum join
- Credential priority: env vars →
runtime/crew-access-users.json→ compiled defaults
POST /api/cdss/diagnose— requires valid crew session- Role check: ✅ Implemented —
isClinicalCrewRolecheck di route handler, returns 403 for non-clinical roles - Semua request dicatat ke Security Audit Log
- Repo baseline security checks dijalankan lewat
pnpm run security:baseline - Baseline saat ini mencakup:
test:auth-hardeningtest:cdss:protected
- CI baseline memakai install non-interaktif tanpa lifecycle side effects lewat
npm ci --ignore-scripts - Setelah install non-interaktif, repo menjalankan
prisma generatedenganDATABASE_URLplaceholder lokal untuk membentuk Prisma Client tanpa menyentuh database nyata test:cdss:protecteddijalankan lewatnode --import ./node_modules/tsx/dist/loader.mjs ...agar runner TypeScript stabil di Node 24 tanpa bergantung ke loader lama
- File:
src/lib/server/security-audit.ts - Setiap request ke
/api/cdss/*dan/api/auth/*dicatat ke database - Fields: endpoint, action, result, userId (SHA-256 hashed), role, IP, metadata
- IP detection:
x-forwarded-forheader (diaktifkan otomatis jikaRAILWAY_ENVIRONMENT_IDada) - PHI tidak pernah masuk ke audit log — userId di-hash, bukan plain text
- File:
src/lib/intelligence/sentry.config.ts beforeSendhook: scrub PHI sebelum setiap event dikirim ke Sentry- Field patterns yang di-scrub:
patientId,patientName,patientLabel,fullName,displayName,medicalRecordNumber,mrn,nik - Value patterns: NIK 16-digit →
[REDACTED-NIK], MRN →[REDACTED-MRN] - Session replay dinonaktifkan:
replaysSessionSampleRate = 0,replaysOnErrorSampleRate = 0
CDSSEngineInputtidak memiliki field nama pasien atau identifier- Audit entry CDSS: hanya summary numerik (jumlah suggestion, red flag count) — bukan konten klinis
session_idbersifat opsional dan tidak diikat ke identitas pasien
- CDSS request body: diparse via
parseDiagnoseRequestBody()dengan validasi ketat - Socket.IO message: max 5.000 karakter, room ID max 200 karakter
- Server-side identity: semua socket events menggunakan identity dari session cookie — tidak dari client payload
- Message ID + timestamp: server-generated, tidak dipercaya dari client
Production whitelist:
https://puskesmasbalowerti.com
https://www.puskesmasbalowerti.com
https://crew.puskesmasbalowerti.com
https://intelligenceboard-production.up.railway.app
| Versi | Didukung |
|---|---|
| 0.1.x | ✅ Ya |
| < 0.1 | ❌ Tidak |
- Role-based authorization di
/api/cdss/diagnose: implementasi dasar tersedia (isClinicalCrewRole); RBAC matrix produksi lengkap masih perlu audit terpisah RBAC_BACKENDmasih OPEN diinfra/ci/missing-inputs.md(#3)- Dependency graph masih memiliki audit findings bawaan; triage dan remediation version upgrade perlu batch terpisah
- Surface Prisma readiness untuk lint/CI sudah dipulihkan lewat explicit generate step; lint sekarang kembali hijau
- Debt berikutnya berpindah ke hardening auth/RBAC dan audit package upgrades
Architected and built by Claudesy — 2026 · Sentra Healthcare Artificial Intelligence