Skip to content

security(eval): validateur 100 % whitelist + raw-eval éliminé (SB-RCE-2026-01) - #502

Merged
simonLouvet merged 1 commit into
masterfrom
security/validator-whitelist-hardening
Aug 26, 2026
Merged

simonLouvet merged 1 commit into
masterfrom
security/validator-whitelist-hardening

Conversation

@simonLouvet

Copy link
Copy Markdown
Collaborator

Correctif de sécurité — SB-RCE-2026-01 (review chercheur v0.11.2)

Hardening complet du moteur d'évaluation JS suite à la review du chercheur (Maxim Yakovlev, 2026-08-24) et au vecteur introspection découvert.

Changements

  • Validateur 100 % whitelist : constant-folding des clés computed, whitelist étendue à toutes les libs du scope, blacklist supprimée, objets produits + JS intrinsics whitelistés.
  • Vecteur introspection fermé : Reflect/Proxy/Object.getPrototypeOf/... bloqués.
  • Raw-eval éliminé : l'engine n'a plus aucune évaluation interne (seul chemin : eval-service).
  • sanitizeValue appliqué à toutes les variables avant envoi au eval-service.
  • Code mort retiré : escapeString/resolveString/unicode-encode.

Vérifié

  • 161 tests engine, 11 tests eval-service pool, lint 0 erreur.
  • 20 patterns prod OK, 27 cas d'attaque bloqués.

…-2026-01)

Hardening complet suite à la review v0.11.2 du chercheur (Maxim Yakovlev) :

- constant-folding des clés computed statiquement résolubles
  ('con'+'structor' -> bloqué) ;
- whitelist étendue à toutes les libs du scope eval (dotProp, cheerio,
  sanitizeHtml, removeMarkdown, decodeUnicode) ;
- LIB_FORBIDDEN_METHODS (blacklist) supprimé -> modèle 100 % whitelist ;
- objets produits whitelistés (PRODUCED_WHITELISTS + inférence de type
  d'appel exprType) : dayjs/moment/cheerio/crypto-hash/Buffer.from ;
- JS intrinsics en whitelist stricte : Reflect, Proxy, Object.getPrototypeOf,
  getOwnPropertyDescriptor, defineProperty, setPrototypeOf bloqués
  (vecteur introspection argument-string fermé) ;
- sanitizeValue dans runEvalInRemote (avant sérialisation) + contrat
  documenté dans evalWorker.js/secureContext.js ;
- raw-eval ÉLIMINÉ : evalWorker.js/runEvalInWorker/workerGlobals.js engine
  supprimés -> l'engine n'a plus aucune évaluation interne, seul chemin =
  runEvalInRemote (HTTP signé -> eval-service). Tests unitaires = logique du
  container (secureContext.js de l'eval-service) ;
- code mort retiré : escapeString/resolveString/parseAndResolveString +
  unicode-encode (engine + eval-service) ;
- advisory SB-RCE-2026-01 mise à jour (correctifs + résiduel documenté
  comme non-vulnérabilité).
@simonLouvet
simonLouvet merged commit b48af79 into master Aug 26, 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