Skip to content

Isu Keamanan: Prompt & PDI Kelihatan di Network Request Client-Side

Status: Udah ketemu, belum difix (cuma arsip)
Severity: Tinggi
Scope: Integrasi Base44 InvokeLLM yang lama (pre-migrasi)
Pelapor: Security review internal


Ringkasan Singkat

Di versi lama Soul Map Atlas yang masih jalan di platform Base44, system prompt lengkap, skema JSON, sama data sensitif user keliatan semua di network request yang dari browser. User yang login pake DevTools bisa lihat, copy, bahkan utak-atik instruksi LLM sama jurnal mentah yang dikirim buat analisis AI.

Arsitektur llm-proxy sekarang udah ngefix ini, tapi temuan ini tetap relevan buat:

  • Audit keamanan dan compliance review ke depan
  • Addendum kebijakan privasi atau terms of service
  • Ngelasin kenapa migrasi dari InvokeLLM client-side Base44 itu wajib secara arsitektur

Bukti Screenshot

Network tab nampilin payload prompt penuh

Di tab Network → Payload browser, kelihatan jelas seluruh body request ke InvokeLLM, termasuk:

  1. System prompt — instruksi persona lengkap ("You are a compassionate growth guide...")
  2. Entri jurnal mentah — mood, energy, stress score, sama teks jurnal lengkap
  3. Skema output — nama field JSON, tipe data, dan deskripsinya
  4. Business rules — aturan bahasa lembut dan output yang dilarang

Gimana Cara Kerja InvokeLLM yang Lama

Di arsitektur Base44 jadul, aplikasi frontend jalan di dalam ekosistem Base44 dan langsung nge-call integration endpoint platform:

Client (Browser) ──► Platform Base44
                      POST /api/apps/{appId}/integration-endpoints/Core/InvokeLLM
                      Payload: { prompt, response_json_schema, ... }

Yang masalah:

  • Client yang ngebangun prompt — system instruction, data user, sama skema dirakit di frontend bundle atau kode client-side.
  • Client yang megang kredensialX-App-Id dan token Authorization: Bearer keliatan di request header.
  • Data sensitif lewat browser — teks jurnal private ngalir dari server (DB) → client → Base44 LLM endpoint, jadi bisa diinspeksi di tengah jalan.
  • Nggak ada gatekeeper server-side — nggak ada lapisan backend buat validasi, sanitize, atau redact data sebelum masuk ke LLM.

Gimana Cara Kerja llm-proxy Sekarang

Arsitektur monorepo baru punya lapisan proxy di server:

Client (Browser) ──► API Worker (Cloudflare)
                      POST /api/v1/invokeDestiny
                      Payload: { system: "bazi", prompt: "input user", jsonMode: true }

API Worker ──► llmProxy()
              Bangun prompt lengkap + skema di server
              Baca BASE44_APP_ID / BASE44_ACCESS_TOKEN dari env secrets

API Worker ──► Base44 InvokeLLM
              POST /api/apps/{appId}/integration-endpoints/Core/InvokeLLM
              Headers: X-App-Id, Authorization: Bearer {token}

Yang lebih aman:

  • Server yang ngebangun prompt — system instruction, skema JSON, sama business rules cuma ada di apps/api/src/services/.
  • Client kirim data minimal aja — cuma input mentah user sama flag fitur (misal jsonMode).
  • Data sensitif nggak lewat browser — entri jurnal di-fetch server-side dari D1 dan langsung diteruskan ke proxy.
  • Kredensial amanBASE44_ACCESS_TOKEN adalah secret Cloudflare Worker, nggak pernah ke-expose ke client.
  • Ada validation layer — API bisa enforce rate limit, cek entitlement, sama sanitize input sebelum sampai ke LLM.

Dampak Keamanan

ThreatRisiko LegacyMitigasi Sekarang
Prompt InjectionUser bisa lihat sama ubah system prompt sebelum kirim, bypass aturan safety.System prompt immutable di server.
PDI / PII ExposureTeks jurnal, mood score, sama refleksi pribadi keliatan di DevTools / proxy logs.Data sensitif tetap server-to-server; nggak pernah sampai ke payload browser.
Schema EnumerationSkema JSON persis terbuka, gampang di-reverse-engineer.Skema dibangun di server; client cuma nerima output final.
Credential LeakageApp ID dan bearer token keliatan di request header.Kredensial adalah secret Worker env.
Compliance ViolationPotensi langgar GDPR / privacy policy kalau data user lewat client dalam plaintext.Data minimization terpenuhi — client cuma nerima hasil yang udah diproses.

Rekomendasi Addendum

Nggak perlu fix kode — arsitektur llm-proxy sekarang udah ngefix root cause-nya. Item di bawah ini disaranin buat kelengkapan dokumentasi dan kebijakan:

  1. Update Privacy Policy
    Tambahin bahasa eksplisit yang nyatakan entri jurnal sama refleksi pribadi diproses di server dan nggak pernah ditransmisikan dalam plaintext lewat browser user ke provider AI pihak ketiga.

  2. Security FAQ
    Dokumentasiin buat user (dan auditor) kalau system prompt itu rahasia server-side, bukan template client-side, biar nggak ada kekhawatiran prompt-injection.

  3. Architecture Decision Record (ADR)
    Catet keputusan desain buat nge-proxy semua panggilan LLM lewat apps/api daripada ngizinin komunikasi client-to-Base44 langsung. Rujuk temuan keamanan ini sebagai pemicu utamanya.

  4. Vulnerability Disclosure Log
    Simpan laporan ini di apps/docs/issues/ sebagai referensi historis buat security review dan audit compliance ke depan.


Endpoint yang Kena Dampak (Legacy)

Fitur-fitur berikut dulu pake panggilan InvokeLLM client-side di implementasi Base44:

  • Journal AI Insights — entri jurnal lengkap di-embed dalam prompt
  • Destiny Analysis (BaZi) — data kelahiran dan system instruction terbuka
  • Compatibility Deep Insights — relationship scores dan instruksi narasi personal terbuka

Referensi

  • Implementasi proxy sekarang: apps/api/src/services/llm/llm-proxy.ts
  • Konsumer layanan Destiny: apps/api/src/services/destiny/invoke-destiny.ts
  • Konsumer layanan Jurnal: apps/api/src/services/journal/generate-summary.ts
  • Konsumer Compatibility: apps/api/src/services/compatibility/generate-deep-insights.ts
  • Dokumentasi endpoint integrasi Base44: https://base44.app (eksternal)