fix(security): fail-closed sur composants sans workspaceId (orphelins) (SB-IDOR-2026-01) - #494
Merged
Merged
Conversation
added 2 commits
August 25, 2026 18:58
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 deworkspaceId(composant « orphelin »). Un utilisateur owner/editor d'un workspace peut alors écraser et supprimer un composant orphelin d'un autre workflow — lePUTlui estampait même son propreworkspaceId.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)
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.POST /workspaces/(composants embarqués) (packages/main/server/workspaceWebService.js) :le workspace est créé d'abord, chaque composant embarqué est créé avec
workspaceIdestampé puisrattaché au workspace (
components = ids). Corrige aussi un bug latent : les composants embarquésn'étaient jamais rattachés (
workspaceComponent._id= undefined sur un tableau).packages/main/scripts/backfillOrphanComponents.js) :estampe
workspaceIdsur les composants orphelins existants en retrouvant le workspace qui lesré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-orphansajoutée au Makefile (dev) ; la cible équivalente est à ajouter dans le repo de prod
(
semantic-bus-prod-all) pour le fluxdeploy.Tests
packages/core/__tests__/lib/workspace_component_security.test.js: +2 cas fail-closed(orphelin
workspaceIdabsent,workspaceId: null).packages/main/__tests__/server/workspaceSecurity.test.js: +2 casPOST /workspaces/embarqué (workspaceId estampé + rattachement ; sans composant, aucun composant créé).
Advisory
advisories/SB-IDOR-2026-01/2026-08-idor-workspace-import.mdmis à jour (contribution 3).