Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Base64 et la sécurité

+6 votes

Supposons que je souhaite mettre des images codées en base 64 tout en bas d'un fichier, chaque image sur une ligne.

Comme l' humain ne sait pas le lire et que ça prendrait pas mal de lignes, je le met sur une très longue ligne, à une extrémité du programme.

L' intérêt est de ne pas mettre des fichiers PNG dans un répertoire, tout tient en un seul fichier : pratique pour transmettre à un pote. Par exemple pour de petits icônes ou un petit avatar (profil).

Mais cela représente t il un danger ? peut il y avoir du code malicieux qui se cache en plein dans le bout de code en base64 ?

Je me pose la question parceque par exemple je sais que pickle représente une faille potentielle.

demandé 9-Jun-2015 par buffalo974 (2,956 points)

2 Réponses

+7 votes
 
Meilleure réponse

Sauf faille dans la lib python, c'est safe.

Ici tu ne fais que transformer une str (la string encodée) vers une autre str (la string decodée) - et inversement. Le fait que ce soit une image c'est juste une représentation de la suite de bytes présents dans celle-ci.

Le "probleme" avec pickle, c'est que quand tu deserialise le contenu, c'est pour le transformer en un objet python : le code est interprété, donc tu pourrais potentiellement éxecuter du code dangereux.

Après, si la lib de gestion des images est vulnérable et que l'image encodée en base64 contient une payload, ca devient un vecteur d'attaque possible mais tu ne pourras pas y faire grand chose.

répondu 9-Jun-2015 par jc (2,704 points)
sélectionné 12-Jul-2019 par buffalo974

Je perçois du oui et du non dans vos réponses, donc pour faire simple :

Comment limiter le risque si j' utilise la base 64 et pickle dans le même projet et qu'en plus des tiers apportent du contenu?

Genre les joueurs mettent leur avatar fétiche...

j' utilise des libs courantes comme tkinter, pygame, pillow et je découvre pyQt.

Pour pickle, la règle principale c'est de ne pas charger du code qui vient de l'exterieur (qui pourrait être injecté par un tiers). Genre un cookie pour une web app, un fichier que l'utilisateur aurait pu modifier pour une app desktop).
Après il y a des mécanisme pour s'en prémunir, c'est ce que itsdangerous permet de faire (tu signe ton dump. Si quand tu essais de load la signature ne correspond pas, c'est que le dump a été modifié : danger (cf itsdangerous/serialization))

Pour le reste (une image qui contiendrait une charge contre une librairie aillant une faille), le risque est moindre (mais pas inexistant, c'est pour çà que c'est abordé dans les deux réponses) tu ne peux pas faire grand chose a part compter sur les libs sur lesquelles tu te repose.

Si c'est juste pour stocker des images, pas de probleme, go base 64. Par contre pickle non signé c'est roulette russe.

Et sinon, tu peux te tourner vers du json / msgpack pour sérialiser tes datas, comme ça tu ne t'expose pas aux problemes de pickle.

jconnaissais pas itsdangerous, malin le coup de la signature ^^

j'ai un peu plus de mal avec json que pickle mais je regarderai msgpack quand j'y serai.

+6 votes

Le base64 n'est qu'une projection de tous les mots de 6 bits vers les mots de 8 bits. Tout fichier, même malicieux, peut donc être tronçonné en morceaux de 6 bits et transformer en chaine de caractère base64.

Les problèmes liés à la sécurité surviendront :

  • Si tes chaines base64 sont fabriqués (uploadé) par un tiers
  • Et si l'élément qui lis la suite d'octet décodée pour l'afficher à l'écran (le décodeur png dans ton cas) possède une faille qui lui fait exécuté le contenu décodé.
répondu 9-Jun-2015 par anonyme

est-ce qu'il existe en python une sorte de machine virtuelle pour tester un bout de code suspect ?

...