FixVibe
Covered by FixVibehigh

การเข้าถึงข้อมูลที่ไม่ได้รับอนุญาตผ่านการรักษาความปลอดภัยระดับแถว Supabase ที่ขาดหายไป (RLS)

ในแอปพลิเคชันที่ได้รับการสนับสนุน Supabase ความปลอดภัยของข้อมูลจะขึ้นอยู่กับ Row Level Security (RLS) หาก RLS ไม่ได้เปิดใช้งานและกำหนดค่าด้วยนโยบายอย่างชัดเจน ผู้ใช้ที่มีคีย์ที่ไม่ระบุตัวตนสาธารณะจะสามารถอ่าน อัปเดต หรือลบข้อมูลในฐานข้อมูลทั้งหมดได้ นี่เป็นสิ่งสำคัญอย่างยิ่งในสภาพแวดล้อม Next.js ซึ่งไคลเอ็นต์ Supabase มักจะถูกเตรียมใช้งานด้วยคีย์ API สาธารณะ

CWE-284

ผลกระทบ

ความล้มเหลวในการใช้การรักษาความปลอดภัยระดับแถว (RLS) ทำให้ผู้โจมตีที่ไม่ได้รับการรับรองความถูกต้องสามารถสืบค้นข้อมูลจากฐานข้อมูล Supabase เมื่อตารางสาธารณะถูกเปิดเผยผ่านขอบเขตอานนท์ [S1] เนื่องจากโดยทั่วไปแอปพลิเคชัน Next.js จะเปิดเผยคีย์ Supabase anon ในโค้ดฝั่งไคลเอ็นต์ ผู้โจมตีจึงสามารถใช้คีย์นี้เพื่อทำการเรียก REST API โดยตรงไปยังฐานข้อมูล โดยข้ามตรรกะของแอปพลิเคชันที่ต้องการ และเข้าถึงข้อมูลผู้ใช้ที่ละเอียดอ่อน [S2].

ต้นเหตุ

ตามค่าเริ่มต้น ตาราง Postgres ใน Supabase จำเป็นต้องเปิดใช้งาน Row Level Security อย่างชัดเจน เพื่อป้องกันการเข้าถึงสาธารณะ ZXCVFIXVIBTOKEN1ZXCV เมื่อนักพัฒนาสร้างตารางแต่ลืมเปิดใช้งาน RLS หรือล้มเหลวในการกำหนดนโยบายที่เข้มงวด ฐานข้อมูลอาจเปิดเผยข้อมูลให้กับใครก็ตามที่มีคีย์ anon ของโปรเจ็กต์ [S1] ในแอปพลิเคชัน Next.js การเรนเดอร์ฝั่งเซิร์ฟเวอร์และการดึงข้อมูลฝั่งไคลเอ็นต์ยังจำเป็นต้องมีการตั้งค่าไคลเอนต์ Supabase อย่างระมัดระวัง ดังนั้นบริบทผู้ใช้ที่ได้รับการตรวจสอบสิทธิ์จะเข้าถึงเลเยอร์ฐานข้อมูล ZXCVFIXVIBTOKEN3ZXCV

การแก้ไขคอนกรีต

  • เปิดใช้งาน RLS: ดำเนินการ ALTER TABLE "your_table_name" ENABLE ROW LEVEL SECURITY; สำหรับตารางสาธารณะทุกตารางที่เก็บข้อมูลแอป [S1]
  • กำหนดนโยบาย: สร้างนโยบายเฉพาะที่จำกัดการเข้าถึงตามสถานะการตรวจสอบสิทธิ์ของผู้ใช้ เช่น CREATE POLICY "Users can see their own data" ON your_table_name FOR SELECT USING (auth.uid() = user_id); [S1]
  • ไคลเอ็นต์ฝั่งเซิร์ฟเวอร์ที่ปลอดภัย: เมื่อใช้ Next.js ให้เก็บไคลเอ็นต์บทบาทบริการไว้เฉพาะเซิร์ฟเวอร์เท่านั้น และยังคงใช้ตัวกรองความเป็นเจ้าของก่อนที่จะส่งคืนข้อมูลให้กับผู้ใช้ [S2]

วิธีทดสอบ FixVibe

FixVibe รันการตรวจสอบ Supabase ZXCVFIXVIBTOKEN6ZXCV แบบอ่านอย่างเดียวผ่าน ZXCVFIXVIBTOKEN0ZXCV แล้ว เครื่องสแกนค้นพบ URL โปรเจ็กต์ Supabase และคีย์ Anon สาธารณะจากบันเดิล JavaScript ที่มีต้นกำเนิดเดียวกัน ถาม PostgREST สำหรับข้อมูลเมตาของตารางสาธารณะ และพยายามเลือกอ่านอย่างเดียวแบบจำกัดเพื่อยืนยันว่าข้อมูลถูกเปิดเผยโดยไม่มีเซสชันผู้ใช้หรือไม่ โดยจะไม่แทรก อัปเดต ลบ หรือใช้ข้อมูลรับรองบทบาทบริการ การสแกน Repo ยังสามารถตรวจจับสิ่งนี้ได้ก่อนหน้านี้ผ่าน repo.supabase.missing-rls ซึ่งจะตั้งค่าสถานะการย้ายข้อมูล SQL ที่สร้างตารางสาธารณะโดยไม่มี ENABLE ROW LEVEL SECURITY