# Vulnérabilité GitHub : champs privés exposés via CEL et NativeTypes

_Publié le 2 novembre 2026 — https://ip73.fr/2026/11/02/vulnerabilite-github-champs-prives-exposes-via-cel-et-nativetypes/_

Une fonction spécifique dans l'extension CEL de GitHub permet, sans le vouloir, de rendre accessibles des champs qui devraient être omis lors de la sérialisation JSON. Selon l'avis publié par github.com, l'appel à `ext.NativeTypes(ParseStructTag("json"))` ne respecte pas la directive `json:"-"`, censée masquer les champs.

Le problème vient de la manière dont le système traduit les tags des structures Go en noms de champs CEL. Quand un développeur utilise `ParseStructTag("json")`, il s'attend à une interprétation conforme aux règles de `encoding/json`. Or, le code interne traite le tag `json:"-"` comme un nom de champ légitime, et non comme un signal d'omission.

Ce comportement a deux conséquences. Premièrement, le champ marqué `json:"-"` est enregistré dans le système de types CEL sous le nom littéral `"-"`, et devient lisible par toute expression CEL soumise par un utilisateur via `dyn(obj)"-"`. Deuxièmement, la fonction `newNativeTypes` enregistre silencieusement tous les types imbriqués atteignables depuis le type fourni, y compris ceux issus de dépendances tierces que le développeur n'a pas examiné.

## L'accès non désiré aux données

Une fois ce champ mal nommé accepté, il fait partie de la vue de CEL du type. Les mécanismes de recherche de champs renvoient ce nom comme s'il était normal. Pire, lors de la conversion des objets natifs en valeurs de type JSON-like CEL, le processus itère sur tous les champs de la structure Go et insère le nom calculé, ignorant la règle de saut JSON.

Cette divergence entre l'intention de l'utilisateur et le comportement réel est dangereuse. Les développeurs qui comptent sur la sémantique de `encoding/json` pour garantir la confidentialité de certaines données se retrouvent avec un accès brut aux informations sensibles.

## Les risques systémiques

Le mécanisme ne s'arrête pas là. La manière dont les noms sont gérés lors de la construction du type ne filtre pas les noms vides ou les sentinelles d'omission. Le système considère donc ce champ étrange comme valide, et il apparaît dans les rapports d'énumération des champs.

Ce type de faille, où une règle de sérialisation est ignorée au profit d'une implémentation interne, rappelle les défis de la complexité logicielle. D'ailleurs, d'autres couches technologiques montrent des points de vigilance similaires. Par exemple, Apigee Edge for Private Cloud 4.54.00 impose des mises à jour vers Java 21, forçant les développeurs à vérifier la compatibilité de leurs politiques de *JavaCallout* pour éviter des erreurs de *NoClassDefFoundError*.

Il faut surveiller comment les équipes de GitHub vont corriger cette subtilité du `ParseStructTag` pour que la promesse de l'encodage JSON soit effectivement respectée dans leur système d'analyse.

## 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 02, 2026](https://docs.cloud.google.com/release-notes#November_02_2026), Google Cloud, 2 novembre 2026
