Skip to content

fix(security): fail-closed sur composants sans workspaceId (orphelins) (SB-IDOR-2026-01) - #494

Merged
simonLouvet merged 2 commits into
masterfrom
fix/orphan-components-failopen
Aug 25, 2026
Merged

simonLouvet merged 2 commits into
masterfrom
fix/orphan-components-failopen

Conversation

@simonLouvet

Copy link
Copy Markdown
Collaborator

Contexte

Contribution 3 du chercheur (Maxim Yakovlev, batam111) sur l'advisory SB-IDOR-2026-01 : à v0.11.14, assertComponentInWorkspace échoue en mode ouvert quand le composant cible n'a pas de workspaceId (composant « orphelin »). Un utilisateur owner/editor d'un workspace peut alors écraser et supprimer un composant orphelin d'un autre workflow — le PUT lui estampait même son propre workspaceId.

Le chercheur a confirmé en runtime (mongoose 8.24.3 + Mongo réel) et pose la condition : le fail-closed n'est pas déployable seul — il faut le backfill des orphelins existants et l'estampillage sur le chemin de création, ensemble.

Correctif (3 parties déployées ensemble)

  1. Fail-closed dans assertComponentInWorkspace (packages/core/lib/workspace_component_lib.js) :
    if (!component.workspaceId || component.workspaceId.toString() !== workspaceId.toString()) { 403 }
    Un orphelin n'est plus éditable/destructible par personne tant qu'il n'a pas de workspaceId.
  2. POST /workspaces/ (composants embarqués) (packages/main/server/workspaceWebService.js) :
    le workspace est créé d'abord, chaque composant embarqué est créé avec workspaceId estampé puis
    rattaché au workspace (components = ids). Corrige aussi un bug latent : les composants embarqués
    n'étaient jamais rattachés (workspaceComponent._id = undefined sur un tableau).
  3. Backfill des orphelins (packages/main/scripts/backfillOrphanComponents.js) :
    estampe workspaceId sur les composants orphelins existants en retrouvant le workspace qui les
    référence dans workspace.components ; liste les non-retrouvés pour contrôle manuel.

Déploiement

Le backfill doit tourner en même temps que le code fail-closed. Cible make backfill-orphans
ajoutée au Makefile (dev) ; la cible équivalente est à ajouter dans le repo de prod
(semantic-bus-prod-all) pour le flux deploy.

Tests

  • packages/core/__tests__/lib/workspace_component_security.test.js : +2 cas fail-closed
    (orphelin workspaceId absent, workspaceId: null).
  • packages/main/__tests__/server/workspaceSecurity.test.js : +2 cas POST /workspaces/
    embarqué (workspaceId estampé + rattachement ; sans composant, aucun composant créé).
  • Suites : core 74 ✅ · main 35 ✅ · engine 141 ✅ · timer 17 ✅ · lint 0 erreur.

Advisory

advisories/SB-IDOR-2026-01/2026-08-idor-workspace-import.md mis à jour (contribution 3).

@simonLouvet
simonLouvet merged commit 5cb0bb4 into master Aug 25, 2026
10 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