# 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:

```python
# 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)

{% hint style="warning" %}
Ce format n'est plus utilisé et a été remplacé par le format #2 sur Python3.
{% endhint %}

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

Hello, John
```

### New Style str.format (#2)

{% hint style="warning" %}
Ce format a été remplacé par le format #3 sur Python 3.6+
{% endhint %}

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

Hello, John
```

### Literal string interpolation format (#3)

{% hint style="info" %}
Très puissant et facile d'utilisation, il offre beaucoups de possibilités.
{% endhint %}

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

Hello, John
```

### Template string format (#4)

{% hint style="info" %}
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.
{% endhint %}

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

Hello, John
```

<figure><img src="https://3571537825-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOIXudYEdnnE8JjXBrL0o%2Fuploads%2Fbg3Amu6R8kQotSPjWltt%2Fimage.png?alt=media&#x26;token=14321996-3a76-4c27-8919-935a5bb2adc5" alt=""><figcaption><p>Mindmap du choix des formats de chaînes de caractères par besoin</p></figcaption></figure>

## Dependances et calls dangereux

| Name                | Calls                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | Severity | Comment                                                                                                                                                                                                                                                                                                                                                          |
| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| pickle              | <ul><li>pickle.loads</li><li>pickle.load</li><li>pickle.Unpickler</li><li>dill.loads</li><li>dill.load</li><li>dill.Unpickler</li><li>shelve.open</li><li>shelve.DbfilenameShelf</li><li>jsonpickle.decode</li><li>jsonpickle.unpickler.decode</li><li>jsonpickle.unpickler.Unpickler</li><li>pandas.read\_pickle</li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | Medium   | Risques d'insecure deserialization                                                                                                                                                                                                                                                                                                                               |
| marshal             | <ul><li>marshal.load</li><li>marshal.loads</li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | Medium   | Risques d'insecure deserialization                                                                                                                                                                                                                                                                                                                               |
| PyYAML              | yaml.load                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | Medium   | Risques d'insecure deserialization                                                                                                                                                                                                                                                                                                                               |
| md5                 | <ul><li>hashlib.md5</li><li>hashlib.sha1</li><li>Crypto.Hash.MD2.new</li><li>Crypto.Hash.MD4.new</li><li>Crypto.Hash.MD5.new</li><li>Crypto.Hash.SHA.new</li><li>Cryptodome.Hash.MD2.new</li><li>Cryptodome.Hash.MD4.new</li><li>Cryptodome.Hash.MD5.new</li><li>Cryptodome.Hash.SHA.new</li><li>cryptography.hazmat.primitives .hashes.MD5</li><li>cryptography.hazmat.primitives .hashes.SHA1</li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | Medium   | Utilisation de hashage obsolètes                                                                                                                                                                                                                                                                                                                                 |
| ciphers             | <ul><li>Crypto.Cipher.ARC2.new</li><li>Crypto.Cipher.ARC4.new</li><li>Crypto.Cipher.Blowfish.new</li><li>Crypto.Cipher.DES.new</li><li>Crypto.Cipher.XOR.new</li><li>Cryptodome.Cipher.ARC2.new</li><li>Cryptodome.Cipher.ARC4.new</li><li>Cryptodome.Cipher.Blowfish.new</li><li>Cryptodome.Cipher.DES.new</li><li>Cryptodome.Cipher.XOR.new</li><li>cryptography.hazmat.primitives .ciphers.algorithms.ARC4</li><li>cryptography.hazmat.primitives .ciphers.algorithms.Blowfish</li><li>cryptography.hazmat.primitives .ciphers.algorithms.IDEA</li></ul>                                                                                                                                                                                                                                                                                                                                         | High     | Utilisation de chiffrements obsolètes                                                                                                                                                                                                                                                                                                                            |
| cipher\_modes       | cryptography.hazmat.primitives .ciphers.modes.ECB                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | Medium   | Utilisation de chiffrements obsolètes                                                                                                                                                                                                                                                                                                                            |
| mktemp\_q           | tempfile.mktemp                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | Medium   | fonction non sécurisée et dépréciée                                                                                                                                                                                                                                                                                                                              |
| eval                | eval                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | Medium   | Utilisation d’une fonction potentiellement non sécurisée - envisager d’utiliser ast.literal\_eval plus sûr                                                                                                                                                                                                                                                       |
| mark\_safe          | django.utils.safestring.mark\_safe                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | Medium   | Peut entraîner des risques d'injection XSS                                                                                                                                                                                                                                                                                                                       |
| httpsconnection     | <ul><li>httplib.HTTPSConnection</li><li>http.client.HTTPSConnection</li><li>six.moves.http\_client .HTTPSConnection</li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | Medium   | L’utilisation de HTTPSConnection sur les anciennes versions de Python antérieures à 2.7.9 et 3.4.3 ne fournit pas de sécurité                                                                                                                                                                                                                                    |
| urllib\_urlopen     | <ul><li>urllib.urlopen</li><li>urllib.request.urlopen</li><li>urllib.urlretrieve</li><li>urllib.request.urlretrieve</li><li>urllib.URLopener</li><li>urllib.request.URLopener</li><li>urllib.FancyURLopener</li><li>urllib.request.FancyURLopener</li><li>urllib2.urlopen</li><li>urllib2.Request</li><li>six.moves.urllib.request.urlopen</li><li>six.moves.urllib.request .urlretrieve</li><li>six.moves.urllib.request .URLopener</li><li>six.moves.urllib.request .FancyURLopener</li></ul>                                                                                                                                                                                                                                                                                                                                                                                                     | Medium   | Permet l'utilisation de schémas non sécurisés tel que "file:"                                                                                                                                                                                                                                                                                                    |
| random              | <ul><li>random.Random</li><li>random.random</li><li>random.randrange</li><li>random.randint</li><li>random.choice</li><li>random.choices</li><li>random.uniform</li><li>random.triangular</li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | Medium   | Les générateurs pseudo-aléatoires standard ne conviennent pas à des fins de sécurité/cryptographie. Envisagez d’utiliser le module secrets à la place                                                                                                                                                                                                            |
| telnetlib           | telnetlib.\*                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | High     | Telnet est considéré comme non sécurisé. Utilisez SSH ou un autre protocole chiffré.                                                                                                                                                                                                                                                                             |
| xml                 | <ul><li>xml.etree.cElementTree.parse</li><li>xml.etree.cElementTree.iterparse </li><li>xml.etree.cElementTree.fromstring</li><li>xml.etree.cElementTree.XMLParser </li><li>xml.etree.ElementTree.parse  </li><li>xml.etree.ElementTree.iterparse </li><li>xml.etree.ElementTree.fromstring </li><li>xml.etree.ElementTree.XMLParser </li><li>xml.sax.expatreader.create\_parser </li><li>xml.dom.expatbuilder.parse </li><li>xml.dom.expatbuilder.parseString xml.sax.parse </li><li>xml.sax.parseString </li><li>xml.sax.make\_parser </li><li>xml.dom.minidom.parse </li><li>xml.dom.minidom.parseString </li><li>xml.dom.pulldom.parse </li><li>xml.dom.pulldom.parseString </li><li>lxml.etree.parse </li><li>lxml.etree.fromstring </li><li>lxml.etree.RestrictedElement </li><li>lxml.etree.GlobalParserTLS </li><li>lxml.etree.getDefaultParser </li><li>lxml.etree.check\_docinfo</li></ul> | Medium   | L’utilisation de diverses méthodes XLM pour analyser des données XML non fiables est connue pour être vulnérable aux attaques XML. Les méthodes doivent être remplacées par leurs équivalents defusedxml.                                                                                                                                                        |
| ftplib              | ftplib.\*                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | High     | FTP est considéré comme non sécurisé. Utilisez SSH/SFTP/SCP ou un autre protocole chiffré.                                                                                                                                                                                                                                                                       |
| unverified\_context | \_create\_unverified\_context                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | Medium   | Par défaut, Python créera un contexte ssl sécurisé et vérifié pour une utilisation dans des classes telles que HTTPSConnection. Toutefois, il permet toujours d’utiliser un contexte non sécurisé via le \_create\_unverified\_context qui revient au comportement précédent qui ne valide pas les certificats ou n’effectue pas de vérifications de nom d’hôte. |
| tempnam             | <ul><li>os.tempnam</li><li>os.tmpnam</li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | Medium   | L’utilisation de os.tempnam() et os.tmpnam() est vulnérable aux attaques de liens symboliques. Envisagez d’utiliser tmpfile() à la place.                                                                                                                                                                                                                        |
| subprocess          | <ul><li>subprocess.Popen</li><li>subprocess.call</li><li>subprocess.check\_call</li><li>subprocess.check\_output</li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | High     | Risque de RCE                                                                                                                                                                                                                                                                                                                                                    |
| OS                  | <ul><li>os.system</li><li>os.popen</li><li>os.popen2</li><li>os.popen3</li><li>os.popen4</li><li>commands.getoutput</li><li>command.getstatusoutput</li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | High     | Risque de RCE                                                                                                                                                                                                                                                                                                                                                    |
