# Analyse statique (iOS)

## Outils

### ProperTree

ProperTree créé une interface graphique permettant de lire les fichier plist sur des PC linux.

ressource: <https://github.com/corpnewt/ProperTree>

## Objective-C

### Analyse des fichiers headers (file.h)

#### **Éléments clés**

* **Héritage de classes** : L’**héritage** permet à une classe d’en créer une autre en **réutilisant ses caractéristiques**.\
  La classe fille hérite des variables et méthodes de la classe parente, ce qui évite la duplication et facilite l’évolution du code.
* **Propriétés** : Une **propriété** représente une **donnée appartenant à un objet**, souvent avec un accès contrôlé (lecture/écriture).\
  Elle sert à exposer l’état d’un objet proprement, parfois via des getters/setters.
* **Variables** : Une **variable** est un espace mémoire qui stocke une valeur.\
  Elle peut être **locale**, **globale** ou **membre d’une classe**, et sert à conserver des informations pendant l’exécution.
* Objets: Un **objet** est une **instance concrète d’une classe**.\
  `_something` est une convention courante pour désigner une **variable d’instance privée** (notamment en Objective-C ou Swift).
* **Méthodes** : Les **méthodes** sont des **fonctions définies dans une classe**.\
  Elles décrivent le **comportement** des objets et peuvent lire ou modifier leurs propriétés.

#### **Déterminer les surfaces d'attaque potentielles**

* Recherchez les méthodes qui gèrent **les requêtes réseau** , **la sérialisation des données** , **le chiffrement** ou **les entrées utilisateur** . Ces méthodes sont souvent cruciales pour les tests de sécurité.
* Recherchez les propriétés telles que **NSString** , **NSDictionary** , **NSArray** ou **NSData** qui stockent des données sensibles, comme des mots de passe ou des jetons d'API.

### Analyse des Méthodes

Une fois que vous avez identifié les méthodes dans les fichiers headers, réfléchissez à ce qu'elles font :<br>

* **Méthodes réseau** : Les méthodes telles que **\`(void)fetchDataFromURL:(NSURL \*)url\`** indiquent que l’application communique avec des serveurs externes. Examinez ces méthodes afin de détecter d’éventuels problèmes, comme des requêtes HTTP non sécurisées ou une gestion incorrecte des réponses.<br>
* **Authentification et données utilisateur** : des méthodes comme **\`(void)loginWithUsername:(NSString \*)username password:(NSString \*)password\`** ou des propriétés comme **\`userToken\`** peuvent indiquer où la logique d’authentification est exécutée. Ces éléments sont importants pour identifier les vulnérabilités telles que la gestion des mots de passe faibles ou le stockage non sécurisé d’informations sensibles.

## Swift

### Analyse des classes et méthodes

#### **Éléments clés**

* **Noms des classes** : Les noms des classes permettent d’identifier l’architecture de l’application. Des noms tels que **UserManager** , **NetworkClient** ou **EncryptionHandler** indiquent clairement les composants clés de l’application.
* **Noms des champs** : La classe contient des champs tels que **usernameTextField** et **passwordTextField** et&#x63;**.**
* **Noms des méthodes** : Le nom des méthodes permet de comprendre leur fonction. Par exemple, **\`func loginButtonTapped(\_:)\`**  indique une logique d’authentification de l’utilisateur, tandis que **\`func sendRequestOverUrl(\_:)\`** peut indiquer une requête réseau. L'analyse de ces méthodes peut permettre de cibler plus efficacement les fonctions les plus sensibles.

## Désassembler le binaire avec Ghidra

Pour le code bas niveau, il est nécessaire d'utiliser un outil de reverse engineering comme Ghidra:

{% embed url="<https://github.com/NationalSecurityAgency/ghidra>" %}

## Méthodes de chiffrement/hashing faibles

L'utilisations incorrectes des algorithmes de chiffrement peuvent entraîner l'exposition de données sensibles, de clés provées, des broken authentication, une session non sécurisée ou encore une attaque par usurpation d'identité.

### Commandes grep intéressantes

```
# Sur l'appareil
otool -Iv <app> | grep -w "_CC_MD5"
otool -Iv <app> | grep -w "_CC_SHA1"

# Sur pc attaquant
grep -iER "_CC_MD5"
grep -iER "_CC_SHA1"
```

## Fonctions de randomisation faibles

```
# Sur l'appareil
otool -Iv <app> | grep -w "_random"
otool -Iv <app> | grep -w "_srand"
otool -Iv <app> | grep -w "_rand"

# Sur pc attaquant
grep -iER "_random"
grep -iER "_srand"
grep -iER "_rand"
```

## Fonction sensibles

```
# Sur l'appareil
otool -Iv <app> | grep -w "_gets"
otool -Iv <app> | grep -w "_memcpy"
otool -Iv <app> | grep -w "_strncpy"
otool -Iv <app> | grep -w "_strlen"
otool -Iv <app> | grep -w "_vsnprintf"
otool -Iv <app> | grep -w "_sscanf"
otool -Iv <app> | grep -w "_strtok"
otool -Iv <app> | grep -w "_alloca"
otool -Iv <app> | grep -w "_sprintf"
otool -Iv <app> | grep -w "_printf"
otool -Iv <app> | grep -w "_vsprintf"

# Sur pc attaquant
grep -R "_gets"
grep -iER "_memcpy"
grep -iER "_strncpy"
grep -iER "_strlen"
grep -iER "_vsnprintf"
grep -iER "_sscanf"
grep -iER "_strtok"
grep -iER "_alloca"
grep -iER "_sprintf"
grep -iER "_printf"
grep -iER "_vsprintf"
```

## Permissions

Comme pour les appreils android, iOS utilise un système de permissions pour demander l'approbation aux utilisateur d'utiliser une ressource telle que la caméra, les contacts ou des fichiers externes. Ces permissions sont définies dans le fichier `info.plist`
