Vulnérabilités de sécurité Lovable 2026 : clés exposées, RLS manquantes et ce que les audits détectent
Les vulnérabilités de sécurité de Lovable en 2026 : clés exposées, RLS manquante, et ce que les audits détectent
J'ai passé les trois derniers mois à auditer des applications que des clients nous ont apportées après avoir construit leurs MVPs sur Lovable. Le schéma est tellement cohérent que c'en est presque ennuyeux : clés de service Supabase exposées dans les bundles clients, zéro politique RLS, secrets OpenAI et Stripe codés en dur assis là dans le JavaScript pour que n'importe qui ayant accès aux DevTools les récupère. À chaque fois.
Ce n'est pas un article critique envers Lovable. La plateforme est genuinely impressionnante pour le prototypage. Mais il y a un canyon de taille gigantesque entre « démo fonctionnelle » et « application prête pour la production », et Lovable ne vous dit pas grand-chose sur ce qui se trouve dans ce canyon. Un chercheur communautaire a audité 50 applications construites par l'IA et a trouvé les mêmes cinq erreurs de sécurité dans presque toutes. Un autre développeur a scanné 200+ sites codés à la vibe et a trouvé un score de sécurité moyen de 52 sur 100 -- les pires contrevenants étant concentrés dans les applications Lovable + Supabase spécifiquement.
Parcourons chaque vulnérabilité que nous continuons à trouver, pourquoi les propres outils de Lovable les manquent, et exactement comment corriger chacune.
Table des matières
- L'architecture qui crée le problème
- Vulnérabilité 1 : clés Supabase exposées dans le code client
- Vulnérabilité 2 : politiques RLS manquantes ou cassées
- Vulnérabilité 3 : secrets API tiers codés en dur
- Vulnérabilité 4 : en-têtes de sécurité manquants
- Vulnérabilité 5 : pas de validation ou de désinfection des entrées
- Ce que le scan de sécurité intégré de Lovable vérifie réellement
- Ce qu'un audit de production détecte que la plateforme ne détecte pas
- L'incident Moltbook : une étude de cas du monde réel
- Comment corriger une application Lovable avant la production
- Outils pour le scanning automatisé
- FAQ

L'architecture qui crée le problème
Pour comprendre pourquoi les applications Lovable sont disproportionnément affectées, vous devez comprendre l'architecture. Lovable utilise exclusivement Supabase comme backend. Il n'y a pas d'option Firebase, pas de backend personnalisé, pas de trappe de secours. Lorsque vous construisez quelque chose dans Lovable, il génère un frontend React qui communique directement avec l'API REST de Supabase à l'aide de la bibliothèque client.
Supabase est conçu de sorte que la clé anon soit sûre d'être exposée publiquement -- c'est essentiellement un identifiant de projet. Le modèle de sécurité repose entièrement sur les politiques de sécurité au niveau des lignes (RLS) au niveau de PostgreSQL. Pensez-y de cette façon :
| Composant | Destiné à être public ? | Ce qui vous protège |
|---|---|---|
| URL Supabase | Oui | Rien de nécessaire -- c'est juste une URL |
Clé anon |
Oui | Politiques RLS sur chaque tableau |
Clé service_role |
Absolument pas | Doit rester côté serveur uniquement |
| Chaîne de connexion à la base de données | Non | Ne jamais exposer aux clients |
Le problème est que l'IA de Lovable génère du code qui traite souvent tous ces éléments de la même façon. Elle met la clé anon dans le frontend (ok), mais crée ensuite des tables sans activer RLS (catastrophique). Parfois, elle met aussi la clé service_role dans le code client (game over). Comme l'a dit un développeur sur Reddit : « L'IA fait ce que vous demandez. Elle ne pense juste jamais à ce que vous n'avez pas demandé. »
Vulnérabilité 1 : clés Supabase exposées dans le code client
Chaque application Lovable initialise le client Supabase quelque chose comme ceci :
// src/integrations/supabase/client.ts
import { createClient } from '@supabase/supabase-js'
const supabaseUrl = 'https://xyzcompany.supabase.co'
const supabaseAnonKey = 'eyJhbGciOiJIUzI1NiIs...'
export const supabase = createClient(supabaseUrl, supabaseAnonKey)
Le fait que la clé anon soit ici va bien -- c'est par conception. Le problème se présente sous deux formes :
La fuite de clé `service_role`
Nous avons vu du code généré par Lovable où la clé service_role finit dans du code côté client, généralement parce que quelqu'un a invité l'IA avec quelque chose comme « faites que ça marche même si RLS le bloque ». La solution de l'IA ? Utilisez la clé admin. La clé service_role contourne complètement toutes les politiques RLS. Si elle est dans votre bundle frontend, n'importe qui peut l'extraire et avoir accès en lecture/écriture complet à toute votre base de données.
Le fichier `.env` committalisé sur Git
Les projets Lovable déployés sur GitHub ont fréquemment des fichiers .env committalisés dans le référentiel. Même si le référentiel est privé maintenant, s'il a déjà été public -- ne serait-ce qu'une minute -- ces clés sont compromises. Les bots scrapent GitHub constamment pour exactement ce schéma.
Comment vérifier :
# Chercher dans votre codebase les clés service_role
grep -r "service_role" --include="*.ts" --include="*.tsx" --include="*.js" --include="*.env" .
# Vérifier l'historique git pour les secrets accidentellement committalisés
git log --all -p -- '*.env'
Comment corriger : Supprimez immédiatement la clé service_role de tout code client. Faites tourner la clé dans votre tableau de bord Supabase (Paramètres → API). Utilisez la clé uniquement dans du code côté serveur -- Supabase Edge Functions, une route d'API Next.js, ou un backend séparé.
Vulnérabilité 2 : politiques RLS manquantes ou cassées
C'est la grosse. CVE-2025-48757 a exposé 303 points de terminaison vulnérables sur 170+ applications construites avec Lovable. Selon Escape.tech, 83% des bases de données Supabase exposées impliquent des erreurs de configuration RLS.
Voici ce qui se passe par défaut lorsque Lovable crée une table :
-- Ce que Lovable génère souvent
CREATE TABLE user_profiles (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES auth.users(id),
full_name TEXT,
email TEXT,
created_at TIMESTAMPTZ DEFAULT now()
);
-- Remarquez ce qui manque ? RLS n'est pas activé.
-- Cette table est entièrement lisible et modifiable par quiconque possède la clé anon.
Sans RLS, votre base de données Supabase est essentiellement une API publique. N'importe qui qui connaît l'URL de votre projet et la clé anon -- tous deux dans votre code frontend -- peut faire ceci :
// Console du navigateur d'un attaquant
const { data } = await supabase.from('user_profiles').select('*')
// Retourne les données de CHAQUE utilisateur
await supabase.from('user_profiles').delete().neq('id', '')
// Supprime tout
Trois saveurs d'échecs RLS
| Mode d'échec | Ce qui se passe | Sévérité |
|---|---|---|
| RLS pas du tout activé | Accès en lecture/écriture public complet | Critique |
| RLS activé mais pas de politiques définies | Personne ne peut accéder à quoi que ce soit (l'application casse) | Élevé (force les devs à désactiver RLS) |
Politiques trop permissives (par ex., USING (true)) |
Semble sécurisé, en réalité non | Élevé |
Le troisième est particulièrement insidieux. Nous avons vu Lovable générer des politiques comme celle-ci lorsqu'on l'a invité à « corriger les autorisations » :
CREATE POLICY "Allow all access" ON user_profiles
FOR ALL
USING (true)
WITH CHECK (true);
C'est du théâtre RLS. C'est activé, c'a une politique, et ça ne fait absolument rien.
À quoi ressemble une bonne politique :
-- Activer RLS
ALTER TABLE user_profiles ENABLE ROW LEVEL SECURITY;
-- Les utilisateurs ne peuvent lire que leur propre profil
CREATE POLICY "Users read own profile" ON user_profiles
FOR SELECT
USING (auth.uid() = user_id);
-- Les utilisateurs ne peuvent mettre à jour que leur propre profil
CREATE POLICY "Users update own profile" ON user_profiles
FOR UPDATE
USING (auth.uid() = user_id)
WITH CHECK (auth.uid() = user_id);
-- Seuls les utilisateurs authentifiés peuvent insérer, et seulement pour eux-mêmes
CREATE POLICY "Users insert own profile" ON user_profiles
FOR INSERT
WITH CHECK (auth.uid() = user_id);

Vulnérabilité 3 : secrets API tiers codés en dur
Celui-ci me fait grimacer à chaque fois. Nous trouvons régulièrement des clés OpenAI (sk-...), des clés secrètes Stripe (sk_live_...), des clés SendGrid, et d'autres identifiants codés en dur directement dans les composants React.
// Réellement trouvé dans un fichier généré par Lovable
const openai = new OpenAI({
apiKey: 'sk-proj-abc123...', // Ceci est dans votre bundle de navigateur
})
N'importe qui qui ouvre DevTools, va dans l'onglet Sources, et cherche sk- ou sk_live obtient vos clés. Les attaquants automatisent cela. Il y a des bots qui parcourent spécifiquement les bundles JavaScript à la recherche de ces schémas.
L'impact financier est réel. Nous avons eu un client venir à nous après qu'une clé OpenAI exposée ait entraîné 4 200 $ de frais sur un week-end. Les clés secrètes Stripe sont pires -- elles accordent l'accès complet pour traiter les remboursements, voir les données des clients, et modifier les abonnements.
La correction : Déplacez tous les appels API tiers vers des fonctions côté serveur. Supabase Edge Functions fonctionne bien pour cela :
// supabase/functions/openai-proxy/index.ts
import { serve } from 'https://deno.land/std@0.168.0/http/server.ts'
serve(async (req) => {
const { prompt } = await req.json()
const response = await fetch('https://api.openai.com/v1/chat/completions', {
method: 'POST',
headers: {
'Authorization': `Bearer ${Deno.env.get('OPENAI_API_KEY')}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
model: 'gpt-4o',
messages: [{ role: 'user', content: prompt }],
}),
})
return new Response(JSON.stringify(await response.json()))
})
Vulnérabilité 4 : en-têtes de sécurité manquants
Le scan de 200+ sites a trouvé que la plupart des applications déployées par Lovable sont livrées sans aucun en-tête de sécurité. Pas de Content-Security-Policy. Pas de Strict-Transport-Security. Pas de X-Frame-Options. Pas de X-Content-Type-Options.
Cela pourrait sembler mineur comparé à une base de données exposée, mais les en-têtes manquants permettent :
- Clickjacking -- votre application peut être intégrée dans une iframe sur un site malveillant
- Amplification XSS -- sans CSP, les scripts injectés n'ont aucune restriction
- Attaques de reniflage de type MIME -- les navigateurs peuvent interpréter les fichiers comme du code exécutable
- Attaques de rétrogradation -- sans HSTS, le trafic peut être intercepté
| En-tête | Objectif | Défaut Lovable |
|---|---|---|
| Content-Security-Policy | Prévient XSS, contrôle le chargement des ressources | Manquant |
| Strict-Transport-Security | Force HTTPS | Manquant |
| X-Frame-Options | Prévient le clickjacking | Manquant |
| X-Content-Type-Options | Prévient le reniflage MIME | Manquant |
| Referrer-Policy | Contrôle les informations de référent | Manquant |
| Permissions-Policy | Contrôle les fonctionnalités du navigateur | Manquant |
Vulnérabilité 5 : pas de validation ou de désinfection des entrées
Les formulaires générés par Lovable envoient généralement l'entrée utilisateur directement à Supabase sans aucune validation. Pas de vérifications de longueur, pas de validation de type, pas de désinfection du HTML ou de contenu de type SQL.
Alors que la couche PostgREST de Supabase prévient les injections SQL traditionnelles, le manque de validation des entrées permet néanmoins :
- XSS stocké via HTML non désinfecté dans des champs de texte
- Déni de service via des charges utiles extrêmement grandes
- Abus de logique métier (par ex., quantités négatives, prix de 0,00 $)
- Corruption de données à partir de types inattendus
Ce que le scan de sécurité intégré de Lovable vérifie réellement
Lovable a bien une fonctionnalité « Security Scan » intégrée accessible depuis le tableau de bord. Crédit où c'est dû -- elle existe. Mais voici ce qu'elle couvre réellement par rapport à ce qu'elle ne couvre pas :
| Vérification | Scan intégré | Audit de production |
|---|---|---|
| Erreurs de syntaxe de base | ✅ | ✅ |
| CVE de dépendances connues | Partiel | ✅ |
| Secrets codés en dur dans la source | ❌ | ✅ |
| RLS activé sur toutes les tables | ❌ | ✅ |
| Justesse de la politique RLS | ❌ | ✅ |
| Exposition de clé service_role | ❌ | ✅ |
| En-têtes de sécurité | ❌ | ✅ |
| Couverture de validation des entrées | ❌ | ✅ |
| Examen de la configuration d'authentification | ❌ | ✅ |
| Politiques de bucket de stockage | ❌ | ✅ |
| Limitation de débit | ❌ | ✅ |
| Drapeaux de sécurité des cookies | ❌ | ✅ |
Le scan intégré est superficiel au mieux. Il ne attrapera pas les vulnérabilités qui sont réellement exploitées.
Ce qu'un audit de production détecte que la plateforme ne détecte pas
Lorsque nous faisons un audit de sécurité de production pour un client qui a construit sur Lovable, voici ce que nous trouvons et corrigeons généralement. C'est la liste réelle, à partir d'engagements réels :
Couche de base de données
- Tables avec RLS désactivé (moyenne : 60-70% des tables)
- Politiques RLS utilisant
truecomme condition - Politiques manquantes pour les opérations DELETE (les devs oublient la suppression)
- Pas de politiques sur les tables de jonction/jointure
- Buckets de stockage définis publiquement sans restriction de téléchargement
- Index manquants sur les colonnes utilisées dans les conditions de politique RLS (performance + sécurité)
Couche d'authentification
- Secrets JWT faibles (les défauts de Supabase vont bien, mais parfois les gens les changent)
- Exigences de confirmation d'email manquantes
- Pas de limitation de débit sur les points de terminaison d'authentification
- Flux de réinitialisation de mot de passe sans expiration appropriée du jeton
- Erreurs de configuration d'URL de redirection OAuth
Couche de code client
- Clés
service_roledans les bundles frontend - Clés API tiers codées en dur dans les composants
- Fichiers
.envcommittalisés dans l'historique git - Journalisation de débogage qui expose les données utilisateur dans la console
- Messages d'erreur qui divulguent les informations du schéma de base de données
Couche d'infrastructure
- Aucun en-tête de sécurité
- Cookies sans drapeaux
Secure,HttpOnly, ouSameSite - Informations de version de serveur exposées
- Pas de configuration CORS (accepte les demandes de n'importe quelle origine)
- Dépendances avec des CVE connues qui n'ont pas été mises à jour depuis des mois
Une application Lovable typique que nous auditons a besoin de 15-25 corrections avant d'être prête pour la production. La plupart d'entre elles prennent moins d'une heure chacune, mais vous devez d'abord savoir qu'elles existent.
L'incident Moltbook : une étude de cas du monde réel
En janvier 2026, les chercheurs en sécurité de Wiz ont découvert que Moltbook -- un réseau social alimenté par l'IA -- avait toute sa base de données Supabase exposée via un client mal configuré. La clé anon était dans le JavaScript frontend (normal), mais RLS n'était pas configuré sur les tables critiques (catastrophique).
Le résultat ? 1,5 million de clés API étaient accessibles. Pas seulement les données utilisateur -- les clés API réelles appartenant aux utilisateurs qui avaient connecté leurs comptes OpenAI, Anthropic, et autres. Accès complet en lecture et écriture à chaque table. Un chercheur pouvait parcourir toute la base de données juste en utilisant le client Supabase dans une console du navigateur.
La chronologie de la divulgation était serrée -- le responsable de Moltbook a corrigé les tables critiques en quelques heures après avoir été contacté. Mais la fenêtre de dommages était inconnue. Depuis combien de temps la base de données était-elle exposée avant que quelqu'un ne la vérifie ? Personne ne le sait.
C'est le schéma Lovable + Supabase joué à grande échelle. La plateforme génère du code fonctionnant. Elle ne génère juste pas du code sécurisé.
Comment corriger une application Lovable avant la production
Voici la liste de contrôle que nous utilisons. Vous pouvez faire la plupart de cela vous-même si vous êtes à l'aise avec SQL et le tableau de bord de Supabase :
Étape 1 : auditer chaque table pour RLS
-- Exécutez ceci dans l'éditeur SQL Supabase pour trouver les tables sans RLS
SELECT schemaname, tablename, rowsecurity
FROM pg_tables
WHERE schemaname = 'public';
Toute table où rowsecurity est false a besoin d'une attention immédiate.
Étape 2 : chercher dans votre codebase les secrets
# Chercher les schémas de secret courants
grep -rn 'sk-' --include='*.ts' --include='*.tsx' --include='*.js' .
grep -rn 'sk_live' --include='*.ts' --include='*.tsx' --include='*.js' .
grep -rn 'service_role' --include='*.ts' --include='*.tsx' --include='*.js' .
grep -rn 'SUPABASE_SERVICE' --include='*.ts' --include='*.tsx' --include='*.env' .
Étape 3 : écrire des politiques RLS appropriées
Pour chaque table, écrivez des politiques explicites pour SELECT, INSERT, UPDATE, et DELETE. Utilisez toujours les vérifications auth.uid() :
-- Modèle pour une table appartenant à l'utilisateur
ALTER TABLE your_table ENABLE ROW LEVEL SECURITY;
CREATE POLICY "select_own" ON your_table FOR SELECT
USING (auth.uid() = user_id);
CREATE POLICY "insert_own" ON your_table FOR INSERT
WITH CHECK (auth.uid() = user_id);
CREATE POLICY "update_own" ON your_table FOR UPDATE
USING (auth.uid() = user_id)
WITH CHECK (auth.uid() = user_id);
CREATE POLICY "delete_own" ON your_table FOR DELETE
USING (auth.uid() = user_id);
Étape 4 : déplacer les appels API côté serveur
Tout appel API tiers qui nécessite une clé secrète doit s'exécuter dans une Supabase Edge Function ou un backend séparé. C'est non négociable.
Étape 5 : ajouter des en-têtes de sécurité
Si vous déployez sur Netlify, Vercel, ou Cloudflare, ajoutez des en-têtes via leur configuration. Pour Netlify, créez un fichier _headers. Pour une application Next.js, ajoutez-les dans next.config.js.
Étape 6 : considérer une migration de framework
Pour tout ce qui dépasse un MVP, nous recommandons souvent de migrer le code React généré par Lovable dans un vrai projet Next.js ou Astro. Cela vous donne des routes d'API côté serveur, une gestion appropriée des variables d'environnement, un middleware pour les vérifications d'auth, et un vrai pipeline de construction. C'est plus de travail initialement, mais la posture de sécurité est jour et nuit.
Outils pour le scanning automatisé
Plusieurs outils ont émergé spécifiquement pour auditer les applications générées par l'IA :
| Outil | Ce qu'il vérifie | Coût |
|---|---|---|
Ship Safe (npx ship-safe audit .) |
RLS, exposition service_role, buckets de stockage, CVE de dépendances | Gratuit, open-source |
| Vibe App Scanner (vibeappscanner.com) | Scan de sécurité complet pour les applications construites par l'IA | Scan de démarrage gratuit |
| Snyk | Vulnérabilités de dépendances, scanning de code | Niveau gratuit disponible |
| Tableau de bord Supabase → Auth → Policies | Éditeur de politique RLS visuel | Inclus avec Supabase |
Ship Safe est celui avec lequel je commencerais. Il s'exécute localement, rien ne quitte votre machine, et c'est spécifiquement construit pour les erreurs de configuration Supabase que les outils d'IA créent :
npx ship-safe audit .
Il signalera RLS désactivé, clés service_role dans le code client, buckets de stockage ouverts, configuration d'auth faible, secrets codés en dur, et CVE de dépendances.
FAQ
Est-ce que la clé anon de Supabase est sûre d'être exposée dans le code frontend ?
Oui -- mais seulement si vous avez des politiques RLS appropriées sur chaque table. La clé anon est conçue pour être publique. C'est comme un identifiant de projet. La sécurité vient des politiques RLS qui contrôlent ce que cette clé peut réellement accéder. Sans RLS, la clé anon donne à quiconque accès complet à la base de données.
Lovable active-t-il RLS par défaut lors de la création de tables ?
Non. Depuis début 2026, Lovable crée des tables Supabase sans activer RLS par défaut. C'est l'écart de sécurité le plus important de la plateforme. Vous devez manuellement activer RLS et écrire des politiques pour chaque table après que Lovable les génère. CVE-2025-48757 était une conséquence directe de ce comportement par défaut.
Comment vérifier si mon application Lovable a des secrets exposés ?
Ouvrez votre application déployée dans un navigateur, ouvrez DevTools (F12), allez à l'onglet Sources, et cherchez dans tous les fichiers pour sk-, sk_live, service_role, et tous les préfixes de clé API pour les services que vous utilisez. Exécutez également npx ship-safe audit . localement sur votre codebase pour la détection automatisée.
Le scan de sécurité intégré de Lovable peut-il détecter les problèmes RLS ?
Le scan de sécurité intégré ne vérifie pas les erreurs de configuration RLS, les politiques manquantes, ou les clés service_role exposées. Il couvre les problèmes au niveau du code de base mais manque les vulnérabilités de base de données et d'infrastructure qui représentent le risque le plus élevé. Vous avez besoin d'outils externes pour une vrai évaluation de sécurité.
Qu'est-ce qui s'est passé avec CVE-2025-48757 ?
CVE-2025-48757 était une divulgation de vulnérabilité qui a identifié 303 points de terminaison API vulnérables sur 170+ applications construites avec Lovable. La cause racine était Lovable créant des tables Supabase sans activer RLS, laissant des bases de données entières accessibles à quiconque ayant la clé anon accessible publiquement. Elle a souligné la nature systémique du problème.
Devrais-je migrer loin de Lovable pour les applications de production ?
Pas nécessairement. Lovable est excellent pour le prototypage rapide et la construction des MVPs. Mais le code généré a besoin d'un durcissement de sécurité significatif avant l'utilisation en production. De nombreuses équipes utilisent Lovable pour construire la version initiale, puis migrent vers un framework approprié avec le rendu côté serveur, la gestion appropriée des secrets, et le middleware de sécurité. C'est une approche raisonnable.
Combien de temps faut-il pour sécuriser une application Lovable pour la production ?
Pour une application typique avec 10-20 tables, compter 2-5 jours de travail concentré pour auditer toutes les politiques RLS, déplacer les secrets côté serveur, ajouter des en-têtes de sécurité, valider les entrées, et tester tout. Les applications plus complexes avec buckets de stockage, abonnements en temps réel, et rôles utilisateurs multiples peuvent prendre plus de temps. Ce n'est pas insurmontable, mais ce n'est pas une tâche d'une heure non plus.
D'autres générateurs d'applications alimentées par l'IA comme Bolt ou Cursor sont-ils plus sûrs que Lovable ?
Le scan de 200+ sites a trouvé que les vulnérabilités de sécurité étaient concentrées dans les applications Lovable + Supabase spécifiquement. Les applications Bolt, Replit, et Cursor/Cline n'ont pas montré le même schéma d'erreurs de configuration RLS. Cela ne signifie pas qu'elles sont parfaitement sécurisées -- tout code généré par l'IA a besoin d'un examen -- mais l'intégration Supabase spécifique à Lovable crée une classe unique de vulnérabilités d'exposition de base de données que d'autres outils n'ont pas.