# Vulnérabilité CEL sur GitHub expose des champs JSON privés

_Publié le 5 novembre 2026 — https://ip73.fr/2026/11/05/vulnerabilite-cel-sur-github-expose-des-champs-json-prives/_

Une faille récemment documentée sur GitHub (GHSA-gcjh-h69q-9w9g) permet de contourner les directives d'omission JSON en exposant des champs privés via le système CEL. En clair, si un développeur utilise `ParseStructTag("json")` pour configurer le parsing des structures Go, il peut croire qu'il respecte les règles d'encodage JSON habituelles. Ce n'est pas le cas, car la fonction interprète mal la balise `json:"-"`, la considérant comme un nom de champ valide plutôt qu'un marqueur d'omission.

Le problème réside dans une fonction d'aide, `fieldNameByTag`, qui, face à une balise `json:"-"`, retourne simplement le caractère `"-"` comme nom de champ dans le système CEL. Les développeurs qui s'attendent à une sérialisation standard de type JSON ne s'attendent pas à ce que `dyn(obj)"-"` devienne une syntaxe lisible pour récupérer des données. C'est une erreur subtile, mais potentiellement grave, car elle rend des informations censées être cachées accessibles via l'accès par index de l'objet.

En plus de ce dysfonctionnement lié aux champs marqués `json:"-"`, l'annonce de github.com révèle un autre point délicat : `newNativeTypes` enregistre silencieusement toute structure imbriquée atteignable à partir du type fourni. Cela signifie que le système peut intégrer des types provenant de dépendances tierces sans que le développeur n'ait eu à les examiner explicitement. Ce mécanisme est activé lorsque `NativeTypes` est appelé avec `ParseStructTag("json")`.

Le code source montre que, au lieu de respecter la règle d'omission JSON pour un champ tagué `json:"-"`, le système le traite comme un nom de champ réel. Ce nom erroné est accepté lors de la construction du type natif, et il devient alors visible dans l'énumération des champs CEL. De plus, lors de la conversion des objets natifs en valeurs de type JSON-like CEL, cette règle d'omission n'est pas appliquée.

Ce comportement contredit l'attente des développeurs qui utilisent `ParseStructTag("json")` pour obtenir une sémantique de nom de champ conforme à `encoding/json`. L'accès aux données se fait alors via l'indexation, comme le montre l'exemple `dyn(req.auth)"-"`.

## Sources

- [GHSA-gcjh-h69q-9w9g - GitHub Advisory Database](https://github.com/advisories/GHSA-gcjh-h69q-9w9g), github.com
- [Changes in Edge for Private Cloud 4.54.00 \| Edge for Private Cloud v4.54.00 \| Apigee Docs](https://docs.apigee.com/private-cloud/v4.54.00/changes-privatecloud-45400), docs.apigee.com
- [November 05, 2026](https://docs.cloud.google.com/release-notes#November_05_2026), Google Cloud, 5 novembre 2026
