Vue rapprochée d'une tablette affichant un fragment de code structurel complexe, symbolisant une donnée exposée.

Vulnérabilité GitHub : champs privés exposés 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é.

Vue de dessus d'un bureau de développeur avec un clavier mécanique, des lunettes et des schémas techniques.

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