Python

Outils

Bandit

Bandit est un scanner de vulnérabilité pour applications python.

Utilisation:

$ bandit exemple.py

ressource: https://github.com/PyCQA/bandit

Safety

Safety est un scanner de vulnérabilité de dépendances python.

ressource: https://github.com/pyupio/safety

Identifier les entrées utilisateur

Vérifier que les entrées utilisateurs sont bien filtrées et sanitize

Flask => flask.escape()

Django => django.utils.html.escape()

autres dépendances => bleach par exemple avec bleach.clean()

Vérifier si une fonction custom a été faite pour cela.

Vérifier que les requêtes SQL utilisent des named-parameters

Exemple:

# Non sécurisé
cursor.execute(f"SELECT admin FROM users WHERE username = '(username)'");
# Sécurisé
cursor.execute("SELECT admin FROM users WHERE username = %(username)s", {'username': username});

Vérifier la présence de SSRF

Si une requête est envoyée vers une URL / un domaine / une IP fournie par l'utilisateur, vérifier que l'application valide le format de celle-ci (avec "validators" ou "urlparse" par exemple) et utilise une whiteliste de destinations de confiance.

Vérifier la présence de secrets codés en dur

Vérifier si l'application utilise un gestionnaire de secret ou des variables d'environnement pour stocker ses secrets et si ce n'est pas le cas, rechercher des secrets codés en dur.

Vérifier la présence de messages d'erreurs verbeux

Si l'application utilise un framework populaire, verifier que les messages d'erreurs verbeux sont désactivés ( Pour Django par exemple DEBUG = False dans le fichier settings.py).

Si l'application n'utilise pas de framework populaire, vérifier si une fonction permettant de gérer les exceptions existe et vérifier si ces exceptions ne font pas fuiter d'informations sensibles.

Vérifier la présence de journaux

Vérfier que l'application journalise bien les actions et événements importants et qu'elle ne journalise pas d'informations sensibles tels que des identifiants, des tokens, des clés de chiffrements / d'API ou encore des informations personnelles susceptibles de causer une infraction aux réglementations du RGPD. (la dépendance logging est usuellement utilisée pour cela)

Vérifier que l'application utilise des formats de chaînes de caractères appropriées

Python3 possède quatre chaînes de caractères différentes, voici comment les choisir en fonction de l'usage que l'on souhaite en faire.

Old Style string format avec l'opérateur "%" (#1)

Ce format n'est plus utilisé et a été remplacé par le format #2 sur Python3.

name = "John"
print('Hello, ' %s name)

Hello, John

New Style str.format (#2)

Ce format a été remplacé par le format #3 sur Python 3.6+

name = "John"
print('Hello, {}'.format(name))

Hello, John

Literal string interpolation format (#3)

Très puissant et facile d'utilisation, il offre beaucoups de possibilités.

name = "John"
print(f'Hello, {name}')

Hello, John

Template string format (#4)

Particulierement utile pour les entrées utilisateurs car ce format n'a pas accès au contenu des variables globales et est plus léger en terme de consomation de ressources que les autres formats.

from string import Template
name = "John"
t = Template('Hello, $name')
result = t.substitute(name=name)
print(result)

Hello, John

Dependances et calls dangereux

Dernière mise à jour