Skip to content

fix(cloud): sécuriser les enveloppes et les accès SQL, limiter les lectures - #33

Merged
iPoower merged 4 commits into
mainfrom
security/fail-closed-sql-envelope-20261024
Oct 25, 2026
Merged

iPoower merged 4 commits into
mainfrom
security/fail-closed-sql-envelope-20261024

Conversation

@iPoower

@iPoower iPoower commented Oct 24, 2026 •

Copy link
Copy Markdown
Owner

Problème et comportement final

Un CHECK PostgreSQL acceptait UNKNOWN lorsque kdf valait JSON null. La contrainte exige désormais un résultat explicitement TRUE : les enveloppes incomplètes sont refusées sans modifier la tête ni l’historique.

Le contrôle périodique téléchargeait aussi toute l’enveloppe toutes les 30 secondes, même sans changement. Un appareil à jour lit désormais la seule révision, avec lecture complète au plus tard après dix minutes. Une modification locale, un envoi en attente, une reprise, une action manuelle ou une erreur impose le parcours complet. La lecture légère ne crée aucun reçu et ne change aucune date de sauvegarde confirmée.

Le snapshot V3, la restauration atomique, l’outbox chiffrée, les écritures conditionnelles et leur relecture restent les mécanismes existants. Les enveloppes V1, AES-256-GCM et la séparation progression/session restent compatibles.

Sécurité et mesures

  • Régressions SQL sur six champs null, KDF erroné, ciphertext vide et champs supplémentaires ; aucun faux succès.
  • Courses entre lecture de révision, modification locale, conflit, expiration du délai et contrôle manuel ; corruption à révision identique vérifiée par lecture complète.
  • Tests navigateur de CSP, refus cryptographiques et absence de secrets fictifs dans les logs.
  • Modèle de menaces et banc reproductible sur corpus fictif à 0/365/1825 jours, PostgreSQL/index/TOAST et transferts inclus.
  • Gzip/Brotli restent une étude isolée avec décompression bornée ; aucun format compressé n’est activé. Les résultats détaillés et leurs limites sont dans docs/cloud-storage-measures.md.

Le helper Supabase préexistant public.rls_auto_enable() avait aussi un droit d’appel client inutile signalé par deux Advisors. Une migration ciblée retire EXECUTE à PUBLIC/anon/authenticated après vérification de son type/propriétaire. Son code et son event trigger restent intacts ; un test transactionnel prouve que l’auto-RLS fonctionne encore.

Validation sur le SHA exact

Tête : 4570c1117bd1c1ae2db82264fd771c077625493a.

CI #40117039466 : provenance, Chromium et WebKit réussis. Les suites existantes sont conservées : 23 scénarios contrôleur, 12 groupes transport/chiffrement, 8 groupes SQL/RLS, parcours multi-clients, restauration V3, concurrence multi-onglets, tests pédagogiques et non-régression Pages. Le rapport JSON de stockage est joint aux artifacts Chromium. Audit npm local : aucune vulnérabilité signalée.

La tentative 1 a rencontré un timeout pédagogique WebKit sur un bouton rc-41 masqué, après réussite des suites cloud et mobiles. Une seule relance sur le même SHA a réussi (tentative 2, provenance/Chromium/WebKit) ; aucune assertion n’a été modifiée.

Hors CI, la cible Supabase autorisée a été confirmée puis le schéma a été installé depuis ce SQL corrigé. Catalogue, grants, RLS, trigger privé et contraintes validées ont été relus. Les assertions SQL de rôles, révisions et rétention ont réussi dans une transaction fictive intégralement annulée : zéro utilisateur et zéro sauvegarde résiduels. Après restriction du helper d’auto-RLS, le Security Advisor relancé affiche zéro erreur/avertissement/suggestion. Les claims JWT sont simulés pour ces assertions ; ce n’est pas une recette Auth/SMTP ni un essai REST avec des sessions émises.

Livraison et limites

docs/cloud-sync.md, docs/cloud-security-model.md, docs/cloud-storage-measures.md et TESTING.md décrivent configuration, récupération, mesures et preuves distinctes. Le SQL exige toujours une inspection des données existantes avant application ; ne pas le réinstaller aveuglément.

Aucune fusion, publication Pages, activation OTP personnelle ou transmission de progression réelle. Main et la version publiée restent sur #32. La recette PC ↔ iPhone physique reste à autoriser et à exécuter ; WebKit ne la remplace pas. Une PWA fermée reprend à la réouverture et au déverrouillage.

Après une future autorisation de fusion/publication, un rollback du code passe par une PR de revert contrôlée et les mêmes protections Pages. Ne pas supprimer les tables ni l’historique pour revenir au code précédent ; conserver les exports indépendants.

Keep full reads for local edits, writes, resume and periodic integrity checks.
Add metadata race and browser security regressions, threat model, and measured
fictional storage/compression study while preserving encrypted V1 backups.
@iPoower iPoower changed the title fix(security): refuser kdf:null et enveloppes incomplètes côté SQL fix(cloud): refuser les enveloppes SQL incomplètes et limiter les lectures Oct 24, 2026
Preserve the existing event trigger and prove automatic RLS still runs.
Do not create a replacement helper or widen any client permission.
@iPoower iPoower changed the title fix(cloud): refuser les enveloppes SQL incomplètes et limiter les lectures fix(cloud): sécuriser les enveloppes et les accès SQL, limiter les lectures Oct 24, 2026
@iPoower
iPoower marked this pull request as ready for review October 25, 2026 06:39
@iPoower
iPoower merged commit 6612e01 into main Oct 25, 2026
5 of 6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant