FixVibe
Covered by FixVibehigh

Bảo mật Next.js + Supabase: Ngăn chặn bỏ qua bảo mật cấp hàng (RLS)

Các ứng dụng được xây dựng bằng Next.js và Supabase thường dựa vào Bảo mật cấp hàng (RLS) để bảo vệ dữ liệu. Việc không bật RLS hoặc định cấu hình sai ứng dụng khách Supabase có thể dẫn đến lộ toàn bộ cơ sở dữ liệu, cho phép người dùng trái phép đọc hoặc sửa đổi các bản ghi nhạy cảm.

CWE-284

Tác động

Những kẻ tấn công có thể bỏ qua logic ứng dụng để đọc, cập nhật hoặc xóa các bản ghi trong cơ sở dữ liệu nếu Bảo mật cấp hàng (RLS) không được thực thi đúng cách [S1]. Điều này thường dẫn đến việc lộ Thông tin nhận dạng cá nhân (PII) hoặc dữ liệu ứng dụng nhạy cảm cho những người dùng chỉ có quyền truy cập vào khóa API ẩn danh công khai.

Nguyên nhân gốc rễ

Supabase sử dụng Postgres Row Level Security để quản lý quyền truy cập dữ liệu ở cấp cơ sở dữ liệu, đây là cơ sở để bảo mật dữ liệu [S1]. Trong môi trường Next.js, nhà phát triển phải tạo ứng dụng khách Supabase để xử lý chính xác cookie và phiên nhằm duy trì tính bảo mật trong quá trình hiển thị phía máy chủ [S2]. Các lỗ hổng thường phát sinh khi:

  • Các bảng được tạo mà không bật RLS, giúp chúng có thể truy cập được thông qua khóa anon công khai [S1].
  • Máy khách Supabase bị định cấu hình sai trong Next.js, không chuyển đúng mã thông báo xác thực người dùng đến cơ sở dữ liệu [S2].
  • Các nhà phát triển vô tình sử dụng khóa service_role trong mã phía máy khách, bỏ qua tất cả các chính sách RLS [S1].

Sửa chữa bê tông

  • Bật RLS: Đảm bảo bật Bảo mật cấp hàng cho mọi bảng trong cơ sở dữ liệu Supabase [S1] của bạn.
  • Xác định chính sách: Tạo chính sách Postgres cụ thể cho các hoạt động SELECT, INSERT, UPDATEDELETE để hạn chế quyền truy cập dựa trên UID [S1] của người dùng.
  • Sử dụng ứng dụng khách SSR: Triển khai gói @supabase/ssr để tạo ứng dụng khách trong Next.js quản lý chính xác xác thực phía máy chủ và tính duy trì phiên [S2].

FixVibe kiểm tra nó như thế nào

FixVibe đã giải quyết vấn đề này thông qua kiểm tra kho và ứng dụng đã triển khai. Mô-đun baas.supabase-rls thụ động phát hiện URL Supabase và các cặp khóa ẩn danh từ các gói JavaScript cùng nguồn gốc, yêu cầu PostgREST cung cấp siêu dữ liệu bảng công khai và thực hiện các lựa chọn chỉ đọc có giới hạn để xác nhận việc hiển thị dữ liệu ẩn danh mà không làm thay đổi dữ liệu khách hàng. Quét repo cũng chạy repo.supabase.missing-rls để gắn cờ các quá trình di chuyển SQL tạo các bảng công khai không có ENABLE ROW LEVEL SECURITY và quét bí mật tìm kiếm việc hiển thị khóa vai trò dịch vụ trước khi nó đến trình duyệt.