Récupération de fichiers mail python

Résolu/Fermé
Lou - 12 oct. 2022 à 18:47
mamiemando Messages postés 33304 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 octobre 2024 - 25 oct. 2022 à 15:29

Hello ! :)

J'ai récupéré un script open source qui permet de récupérer les données des mails à partir d'un filtre sur tag pour les envoyer ensuite vers un outil de réponse à incident (nommé thehive).

Le lien du script : https://github.com/xme/dockers/blob/master/imap2thehive/imap2thehive.py

Il fonctionne super bien, sauf que j'ai peur lors de la récupération des pièces jointes :/ Je ne me rends pas bien compte des risques possibles si le mail contient un fichier malveillant que ce script va télécharger.

Je pense qu'il faut regarder à cet endroit précisément :

# Extract MIME parts
filename = part.get_filename()
mimetype = part.get_content_type()
if filename and mimetype:
       if mimetype in config['caseFiles'] or not config['caseFiles']:
          log.info("Found attachment: %s (%s)" % (filename, mimetype))
          # Decode the attachment and save it in a temporary file
          charset = part.get_content_charset()
          if charset is None:
              charset = chardet.detect(bytes(part))['encoding']
              # Get filename extension to not break TheHive analysers (see Github #11)
              fname, fextension = os.path.splitext(filename)
              fd, path = tempfile.mkstemp(prefix=slugify(fname) + "_", suffix=fextension)
              try:
                 with os.fdopen(fd, 'w+b') as tmp:
                     tmp.write(part.get_payload(decode=1))
                     attachments.append(path)
              except OSerror as e:
                     log.error("Cannot dump attachment to %s: %s" % (path,e.errno))
                     return False

D'après ce que je comprends, il créé un fichier temporaire, l'ouvre et place le fichier du mail.

Est-ce que quelqu'un peut m'aiguiller ?

Merci :)

2 réponses

mamiemando Messages postés 33304 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 octobre 2024 7 794
20 oct. 2022 à 12:01

Bonjour,

Plusieurs choses :

  • En cas d'arrivée d'un email malveillant, c'est peut être plus au serveur mail (plus qu'à ton script) de contrôler si c'est un pourriel ou non (typiquement avec un anti spam et antivirus). Le destinataire de l'email (dont le client mail) devrait avoir ses propres antivirus et anti spam en complément.
  • Rien n'empêche de faire des contrôles de bases (sur le type mime par exemple) pour être ceinture et bretelle.
    • Ça reste facilement contournable en changeant l'extension. L'extension ne change pas le contenu du fichier, mais détermine avec quelle application le système aura envie de lire le fichier.
    • Si un logiciel (disons ton lecteur pdf) contient une faille de sécurité, que ce type mime est autorisé, et que le lecteur pdf comporte une faille qui permet de lui faire exécuter du code embarqué dans un fichier pdf, alors un fichier pdf peut effectivement embarquer du code malveillant et commencer à contaminé ta machine (avec les droits de l'utilisateur qui a lancé le lecteur pdf).
  • Si tu télécharges en local une pièce jointe malveillante, comme le dit yg_be, tant qu'elle n'est ni exécutée, ni lue par un logiciel dont elle exploite une faille de sécurité, elle ne peut pas contaminer ta machine spontanément. Cela signifie que si l'utilisateur n'exécute pas ou n'ouvre pas une pièce malveillante, il n'y a pas de risque. S'il l'ouvre, il faut que la pièce malveillante soit capable d'exploiter une éventuelle faille du logiciel utilisé pour l'ouvrir, ce qui n'est pas systématique.
  • Dans ton message #6, tu dis "mon serveur mail (Thunderbird)", mais Thunderbird est un client mail. Un client permet d'interroger un serveur mail, typiquement un serveur IMAP ou POP3, (par exemple imap.gmail.com). Il s'agit donc bien d'une autre machine.

Bonne chance

1

Bonjour,

"Dans ton message #6, tu dis "mon serveur mail (Thunderbird)", mais Thunderbird est un client mail. Un client permet d'interroger un serveur mail, typiquement un serveur IMAP ou POP3, (par exemple imap.gmail.com). Il s'agit donc bien d'une autre machine."

Oui désolé je n'ai pas utilisé les bons termes :( ... pour mon serveur mail.

"Si tu télécharges en local une pièce jointe malveillante, comme le dit yg_be, tant qu'elle n'est ni exécutée, ni lue par un logiciel dont elle exploite une faille de sécurité, elle ne peut pas contaminer ta machine spontanément. Cela signifie que si l'utilisateur n'exécute pas ou n'ouvre pas une pièce malveillante, il n'y a pas de risque. S'il l'ouvre, il faut que la pièce malveillante soit capable d'exploiter une éventuelle faille du logiciel utilisé pour l'ouvrir, ce qui n'est pas systématique."

D'accord. Je ne sais pas pourquoi, mais pour moi cela représentait un risque de télécharger un fichier malveillant, il n'y a pas des cas (sûrement rare) ou le téléchargement de fichier malveillant peut être dangereux ? (sans avoir à le toucher ensuite).

Merci :)

0
mamiemando Messages postés 33304 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 octobre 2024 7 794 > Lou
Modifié le 20 oct. 2022 à 14:24

Non ce n'est pas possible.

Quel que soit le système d'exploitation, un téléchargement est juste une copie bit à bit d'un contenu vers un espace de stockage, sans chercher à comprendre ce que signifient ces bits. Il ne peut donc pas y avoir exécution de code (malveillant ou non) à ce stade quand bien même le contenu téléchargé serait un exécutable.

C'est après qu'une tâche soit effectuée par le système, il faut qu'un programme l'exécute. Ensuite, de deux choses l'une :

  • soit le fichier est exécutable (éventuellement au travers d'un interpréteur), et à moins que l'utilisateur ne le demande explicitement, il n'a aucune raison d'être exécuté par le système
    • la seule exécution spontanée qui me vient n'en est pas une
      • le systèmes est configuré pour lancer automatiquement du code contenu : c'est le cas par exemple autorun des CD/DVD pour exécuter automatiquement un programme sur le CD (mais c'est quelque chose qui se désactive) et qu'il vaut mieux désactiver ; le programme en question n'est pas exécuté spontanément, c'est le système d'exploitation en cours d'exécution qui est configuré pour lancer l'autorun.
      • aucun processus ne s'exécute spontanément hormis celui lancé au moment d'amorcer le système
  • soit le code malveillant est dans la pièce jointe. Pour être exécuté,
    • soit le programme en train de le lire est configuré pour en exécuter une partie. Exemples
      • les macros excel (mais de nos jours libreoffice n'exécute pas de macros excel sans l'accord de l'utilisateur (et au besoin ça se configure).J'imagine qu'il en va de même pour Excel. )
      • les initialization cells dans Jupyter. (mais dans Jupyter, l'utilisateur doit d'abord certifier le notebook pour que les initialization cells soit exécutées à l'ouverture du notebook.)
    • soit il exploite une faille de sécurité du logiciel qui va le lire. Le code en question est donc exécuté par le programme en train de lire la pièce jointe. Mais celà suppose que le logiciel en train de lire la pièce jointe a été lui-même été explicitement lancé par l'utilisateur (ou le système, cf premier item) .

Comme tu le vois, il n'y a pas d'exécution spontanée au moment de télécharger un fichier.

1
Lou > mamiemando Messages postés 33304 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 octobre 2024
24 oct. 2022 à 09:02

Hello ! Merci pour ces explications :)

Cela me paraît logique maintenant que tu me le dis.

Je vais donc garder mon idée de récupérer uniquement le SHA256, qui suffira pour savoir si le fichier est référencé sur certaines bases de données comme VirusTotal. Je préfère éviter de récupérer le fichier entier, cela évitera que quelqu'un l'ouvre après téléchargement à partir de l'outil de réponse à incident.

Bonne journée !

0
mamiemando Messages postés 33304 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 octobre 2024 7 794 > Lou
25 oct. 2022 à 15:29

Comme tu le sens, merci pour ton retour et bonne continuation :-)

0
yg_be Messages postés 23242 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 4 octobre 2024 Ambassadeur 1 541
17 oct. 2022 à 15:11

bonjour,

Je pense que tu as bien compris.
Tu pourrais peut-être examiner l'extension du fichier, et le refuser si cette extension te semble dangereuse.

0

Bonjour, cela est déjà possible dans ce script puisque config['caseFiles'] est une liste blanche de types de fichiers autorisés.

0
yg_be Messages postés 23242 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 4 octobre 2024 1 541 > voji
18 oct. 2022 à 10:34

N'est-il pas facile de faire passer un .exe en lui associant un descriptif mime inoffensif?

0
Lou > yg_be Messages postés 23242 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 4 octobre 2024
19 oct. 2022 à 11:02

Ok, merci ! :)

Effectivement, dans config['caseFiles'] j'ai une liste blanche contenant par exemple :

application/pdf
application/octet-stream
image/png

Je vais donc regarder comment ajouter une analyse en plus, pour vérifier ce que dit @yg_be.

0
voji > yg_be Messages postés 23242 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 4 octobre 2024
19 oct. 2022 à 20:56

Bonsoir, aucune idée, je ne suis pas trop spécialiste des attaques concernant windows ^^

En regardant ce qu'il se fait en php notamment, liste blanche + renommage fichier et extension devrait pallier je pense aux problèmes d'extension masquées par windows... (Je ne sais si c'est toujours le cas sur les versions récentes).

0
Lou > yg_be Messages postés 23242 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 4 octobre 2024
Modifié le 20 oct. 2022 à 10:14

Bonjour,

Finalement, je préfère éviter le risque de transmettre le fichier vers l'outil de réponse à incident.

En fait, ce qui me dérange, c'est que si je fais une analyse sur l'extension, il y aura toujours des façons de faire que je ne pourrais pas détecter. Par exemple, un pdf contenant du code exécutable à l'intérieur (je dis n'importe quoi mais c'est l'idée).

Je me suis dit, peut-être que je peux calculer le SHA256 des fichiers récupérer ce hash et transmettre lui et éventuellement le nom du fichier à l'outil, qui lui pourra ensuite faire une requête vers VirusTotal pour vérifier l'intégrité du fichier.

Cependant, je me pose toujours une question, peut-être bête. Toujours au niveau du même bloc de code, on est d'accord que je dois toujours télécharger le fichier du mail et le mettre dans le fichier temporaire pour permettre le calcul du SHA256 ? Donc cela pose toujours un risque lors de ce téléchargement ? Vu que le fichier temporaire est placé en local ...

Pour être plus claire : mon script est situé sur le serveur hébergeant l'outil de réponse à incident, il va interroger mon serveur mail (Thunderbird) et envoyer directement la réponse (formulée d'une certain manière) à l'outil via son API.

Merci ! :)

0