From bf9c37ff98b22e6cd05e38a9ab9b3dd902340116 Mon Sep 17 00:00:00 2001 From: nico Date: Mon, 8 Jun 2026 16:30:01 +0800 Subject: [PATCH] fix(auth): hapus fallback SESSION_PASSWORD yang hardcoded, throw error saat startup jika tidak di-set Co-Authored-By: Claude Sonnet 4.6 --- .../fix-session-password-fallback-summary.md | 66 +++++++++++++++++++ src/lib/session.ts | 7 +- 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 MIND/SUMMARY/8-Jun-26/fix-session-password-fallback-summary.md diff --git a/MIND/SUMMARY/8-Jun-26/fix-session-password-fallback-summary.md b/MIND/SUMMARY/8-Jun-26/fix-session-password-fallback-summary.md new file mode 100644 index 00000000..f255c271 --- /dev/null +++ b/MIND/SUMMARY/8-Jun-26/fix-session-password-fallback-summary.md @@ -0,0 +1,66 @@ +# Summary: Fix SESSION_PASSWORD Fallback — Security Hardening + +**Tanggal**: 8 Juni 2026 +**Branch**: `tasks/auth/fix-session-password-fallback/20260608` +**File diubah**: `src/lib/session.ts` + +--- + +## Permasalahan + +Baris 33 di `src/lib/session.ts` menggunakan operator `||` sebagai fallback: + +```ts +password: process.env.SESSION_PASSWORD || 'default-password-change-in-production', +``` + +Jika env var `SESSION_PASSWORD` tidak di-set, iron-session **diam-diam** memakai string `'default-password-change-in-production'` sebagai kunci enkripsi session cookie. String ini diketahui publik karena ada di source code. Siapa pun yang mengetahui nilai tersebut dapat memalsukan session cookie dan masuk sebagai user mana pun tanpa autentikasi. + +Risikonya: +- Aplikasi tetap berjalan normal tanpa peringatan apapun +- Deployment yang lupa set env var langsung rentan session forgery +- Tidak ada fail-fast — masalah baru terdeteksi setelah ada insiden + +--- + +## Perubahan + +**File**: `src/lib/session.ts` (baris 31–35) + +**Sebelum**: +```ts +const SESSION_OPTIONS = { + cookieName: 'desa-session', + password: process.env.SESSION_PASSWORD || 'default-password-change-in-production', + ... +}; +``` + +**Sesudah**: +```ts +const sessionPassword = process.env.SESSION_PASSWORD; +if (!sessionPassword) { + throw new Error('SESSION_PASSWORD env var is not set. Set it to a random string of at least 32 characters.'); +} + +const SESSION_OPTIONS = { + cookieName: 'desa-session', + password: sessionPassword, + ... +}; +``` + +--- + +## Dampak + +- Jika `SESSION_PASSWORD` tidak di-set, server **langsung crash** saat startup dengan pesan error yang jelas. +- Tidak ada deployment yang bisa berjalan tanpa password yang valid. +- Tidak ada perubahan fungsional untuk environment yang sudah set env var dengan benar. + +--- + +## Kategori + +- **Security fix** — menghilangkan hardcoded fallback password di session config +- **Fail-fast pattern** — error eksplisit saat startup lebih aman dari silent default diff --git a/src/lib/session.ts b/src/lib/session.ts index 10c4fc57..0f80c3d4 100644 --- a/src/lib/session.ts +++ b/src/lib/session.ts @@ -28,9 +28,14 @@ export type Session = SessionData & { destroy: () => Promise; }; +const sessionPassword = process.env.SESSION_PASSWORD; +if (!sessionPassword) { + throw new Error('SESSION_PASSWORD env var is not set. Set it to a random string of at least 32 characters.'); +} + const SESSION_OPTIONS = { cookieName: 'desa-session', - password: process.env.SESSION_PASSWORD || 'default-password-change-in-production', + password: sessionPassword, cookieOptions: { secure: process.env.NODE_ENV === 'production', httpOnly: true,