TensorFlow abandonne la prise en charge de YAML en raison d’une faille d’exécution de code

0

TensorFlow, un projet populaire d’apprentissage automatique et d’intelligence artificielle codé en Python et développé par Google, a abandonné la prise en charge de YAML, afin de corriger une vulnérabilité critique d’exécution de code.

YAML ou Yet Another Markup Language est un choix pratique pour les développeurs à la recherche d’un langage de sérialisation de données lisible par l’homme pour gérer les fichiers de configuration et les données en transit.

Vulnérabilité de désérialisation non fiable dans TensorFlow

Les responsables de TensorFlow et Keras, un projet de wrapper pour TensorFlow, ont corrigé une vulnérabilité de désérialisation non fiable résultant d’une analyse non sécurisée de YAML.

Traquée comme CVE-2021-37678, la faille critique permet aux attaquants d’exécuter du code arbitraire lorsqu’une application désérialise un modèle Keras fourni au format YAML.

Les vulnérabilités de désérialisation se produisent généralement lorsqu’une application lit des données mal formées ou malveillantes provenant de sources non authentiques.

Une fois qu’une application a lu et désérialisé les données, elle peut se bloquer, entraînant un déni de service, ou pire, exécuter le code arbitraire de l’attaquant.

Cette vulnérabilité de désérialisation YAML, évaluée à 9,3 en terme de gravité, a été signalée aux responsables de TensorFlow par le chercheur en sécurité Arjun Shibu.

La source de la faille est la fameuse fonction « yaml.unsafe_load() » dans le code de TensorFlow:

google tensorflow yaml
Appel de fonction yaml.unsafe_load vulnérable dans TensorFlow (GitHub)

La fonction « unsafe_load » est connue pour désérialiser les données YAML de manière assez libérale – elle résout toutes les balises, « même celles connues pour être dangereuses sur des entrées non fiables ».

Cela signifie que, idéalement, « unsafe_load » ne devrait être appelé que sur une entrée provenant d’une source fiable et connue pour être exempte de tout contenu malveillant.

Si tel n’est pas le cas, les attaquants peuvent exploiter le mécanisme de désérialisation pour exécuter le code de leur choix en injectant une charge utile malveillante dans les données YAML qui n’ont pas encore été sérialisées.

Un exemple d’exploit de preuve de concept partagé dans l’avis de vulnérabilité le démontre:

from tensorflow.keras import models

payload = '''
!!python/object/new:type
args: ['z', !!python/tuple [], {'extend': !!python/name:exec }]
listitems: "__import__('os').system('cat /etc/passwd')"
'''
  
models.model_from_yaml(payload)

TensorFlow abandonne complètement YAML au profit de JSON

Une fois la vulnérabilité signalée, TensorFlow a décidé d’abandonner complètement la prise en charge de YAML et d’utiliser la désérialisation JSON à la place.

« Étant donné que la prise en charge du format YAML nécessite une quantité de travail importante, nous l’avons supprimée pour le moment », déclarent les mainteneurs du projet dans le même avis.

« Les méthodes Model.to_yaml() et keras.models.model_from_yaml ont été remplacées pour générer un RuntimeError car elles peuvent être utilisées abusivement pour provoquer l’exécution de code arbitraire », expliquent également les notes de publication associées au correctif.

« Il est recommandé d’utiliser la sérialisation JSON au lieu de YAML ou, une meilleure alternative, de sérialiser en H5. »

Il convient de noter que TensorFlow n’est pas le premier ou le seul projet à utiliser unsafe_load de YAML. L’utilisation de la fonction est plutôt répandue dans les projets Python.

GitHub affiche des milliers de résultats de recherche référençant la fonction, certains développeurs proposant des améliorations:

yaml
De nombreux dépôts sur GitHub ont utilisé et utilisent la fonction de chargement non sécurisé de YAML (GitHub)

Le correctif pour CVE-2021-37678 devrait arriver dans TensorFlow version 2.6.0, et sera également rétroporté dans les versions précédentes 2.5.1, 2.4.3 et 2.3.4, déclarent les responsables.

Laisser un commentaire