ผลกระทบ
ผู้โจมตีสามารถข้ามตรรกะของแอปพลิเคชันเพื่ออ่าน อัปเดต หรือลบบันทึกในฐานข้อมูลได้ หากการรักษาความปลอดภัยระดับแถว (RLS) ไม่ได้บังคับใช้อย่างถูกต้อง [S1] ซึ่งมักส่งผลให้มีการเปิดเผยข้อมูลส่วนบุคคล (PII) หรือข้อมูลแอปพลิเคชันที่ละเอียดอ่อนต่อผู้ใช้ที่มีสิทธิ์เข้าถึงเฉพาะคีย์ API ที่ไม่เปิดเผยตัวตนแบบสาธารณะเท่านั้น
ต้นเหตุ
Supabase ใช้ Postgres Row Level Security เพื่อจัดการการเข้าถึงข้อมูลในระดับฐานข้อมูล ซึ่งเป็นพื้นฐานสำหรับการรักษาความปลอดภัยข้อมูล [S1] ในสภาพแวดล้อม Next.js นักพัฒนาจะต้องสร้างไคลเอ็นต์ Supabase ที่จัดการคุกกี้และเซสชันได้อย่างถูกต้อง เพื่อรักษาความปลอดภัยในระหว่างการเรนเดอร์ฝั่งเซิร์ฟเวอร์ ZXCVFIXVIBTOKEN1ZXCV ช่องโหว่มักเกิดขึ้นเมื่อ:
- ตารางถูกสร้างขึ้นโดยไม่เปิดใช้งาน RLS ทำให้สามารถเข้าถึงได้ผ่านคีย์อานนท์สาธารณะ ZXCVFIXVIBTOKEN0ZXCV
- ไคลเอนต์ Supabase ได้รับการกำหนดค่าอย่างไม่ถูกต้องใน Next.js ซึ่งไม่สามารถส่งโทเค็นการรับรองความถูกต้องของผู้ใช้ไปยังฐานข้อมูล ZXCVFIXVIBTOKEN0ZXCV ได้อย่างถูกต้อง
- นักพัฒนาใช้คีย์
service_roleโดยไม่ได้ตั้งใจในโค้ดฝั่งไคลเอ็นต์ ซึ่งข้ามนโยบาย ZXCVFIXVIBTOKEN2ZXCV ทั้งหมด ZXCVFIXVIBTOKEN1ZXCV
การแก้ไขคอนกรีต
- เปิดใช้งาน ZXCVFIXVIBTOKEN2ZXCV: ตรวจสอบให้แน่ใจว่าการรักษาความปลอดภัยระดับแถวถูกเปิดใช้งานสำหรับทุกตารางในฐานข้อมูล ZXCVFIXVIBTOKEN1ZXCV ของคุณ [S1]
- กำหนดนโยบาย: สร้างนโยบาย Postgres เฉพาะสำหรับการดำเนินการ
SELECT,INSERT,UPDATEและDELETEเพื่อจำกัดการเข้าถึงตาม UID [S1] ของผู้ใช้ - ใช้ไคลเอ็นต์ SSR: ใช้แพ็คเกจ
@supabase/ssrเพื่อสร้างไคลเอนต์ใน Next.js ที่จัดการการตรวจสอบสิทธิ์ฝั่งเซิร์ฟเวอร์และการคงอยู่ของเซสชันอย่างถูกต้อง ZXCVFIXVIBTOKEN1ZXCV
วิธีทดสอบ FixVibe
FixVibe ครอบคลุมเรื่องนี้แล้วผ่านการตรวจสอบแอปที่ปรับใช้และ repo โมดูล baas.supabase-rls แบบพาสซีฟจะค้นหา URL ของ Supabase และคู่ที่ไม่ใช่คีย์จากบันเดิล JavaScript ที่มีต้นกำเนิดเดียวกัน ขอ PostgREST สำหรับข้อมูลเมตาของตารางสาธารณะ และดำเนินการเลือกอ่านอย่างเดียวแบบจำกัดเพื่อยืนยันการเปิดเผยข้อมูลที่ไม่ระบุตัวตน โดยไม่เปลี่ยนแปลงข้อมูลลูกค้า การสแกน Repo ยังเรียกใช้ repo.supabase.missing-rls เพื่อตั้งค่าสถานะการย้ายข้อมูล SQL ที่สร้างตารางสาธารณะโดยไม่มี ENABLE ROW LEVEL SECURITY และการสแกนแบบลับจะค้นหาการเปิดเผยคีย์บทบาทบริการก่อนที่จะเข้าถึงเบราว์เซอร์
