Funciones RPC Sin Autenticación
Las funciones de base de datos de Supabase (RPC) son invocables desde el cliente sin verificar auth.uid(), permitiendo a usuarios anónimos ejecutar operaciones privilegiadas.
Cómo Funciona
Supabase expone funciones PostgreSQL a través del endpoint RPC, haciéndolas invocables desde la librería cliente. Si una función no verifica auth.uid() o no checa el rol del usuario, cualquier usuario anónimo puede invocarla. Esto es especialmente peligroso para funciones que modifican datos, realizan operaciones admin o retornan información sensible. A diferencia de tablas con RLS, las funciones se ejecutan con los privilegios del owner de la función (típicamente el superusuario postgres), bypaseando todas las políticas RLS.
CREATE OR REPLACE FUNCTION delete_user_data(target_user_id uuid)
RETURNS void AS $$
BEGIN
DELETE FROM public.profiles WHERE id = target_user_id;
DELETE FROM public.documents WHERE user_id = target_user_id;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;CREATE OR REPLACE FUNCTION delete_user_data()
RETURNS void AS $$
BEGIN
IF auth.uid() IS NULL THEN
RAISE EXCEPTION 'Not authenticated';
END IF;
DELETE FROM public.profiles WHERE id = auth.uid();
DELETE FROM public.documents WHERE user_id = auth.uid();
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;Ejemplo Real
En 2024, una app de gestión de tareas construida en Supabase tenía una función RPC que otorgaba roles admin. La función aceptaba un user_id como parámetro sin verificar auth.uid(), permitiendo a cualquier usuario anónimo promoverse a admin y acceder a todos los datos del workspace.
Cómo Prevenirlo
- Siempre verifica auth.uid() IS NOT NULL al inicio de cada función RPC
- Usa auth.uid() en vez de aceptar user IDs como parámetros
- Prefiere SECURITY INVOKER sobre SECURITY DEFINER cuando sea posible
- Revoca EXECUTE en funciones de los roles anon y authenticated si no se necesitan
Tecnologías Afectadas
Data Hogo detecta esta vulnerabilidad automáticamente.
Escanea Tu Repo GratisVulnerabilidades Relacionadas
Row Level Security Deshabilitado
criticalLas tablas de Supabase sin RLS habilitado permiten a cualquier usuario autenticado o anónimo leer, insertar, actualizar y eliminar todas las filas usando la librería cliente.
Política RLS con USING(true)
criticalLas políticas RLS que usan USING(true) o WITH CHECK(true) efectivamente deshabilitan la seguridad a nivel de fila al permitir todas las operaciones para todos los usuarios.
RLS Habilitado Sin Políticas
highRLS está habilitado en una tabla pero no hay políticas definidas, lo que silenciosamente bloquea todo el acceso incluyendo queries legítimos de tu aplicación.
Service Role Key Expuesta
criticalLa service_role key de Supabase está hardcodeada en código frontend, comiteada en un repo o expuesta en bundles del cliente, dando acceso admin completo a la base de datos a cualquiera.