IMA5 2018/2019 P19 : Différence entre versions
(Annulation des modifications 65114 de Ezalczer (discussion)) |
(Annulation des modifications 65113 de Ezalczer (discussion)) |
||
Ligne 13 : | Ligne 13 : | ||
==Cahier des charges== | ==Cahier des charges== | ||
+ | |||
+ | =Réalisation du Projet= | ||
+ | |||
+ | ==Liste non exhaustive des attaques possibles sur un réseau IOT== | ||
+ | |||
+ | ===Couche Applicative=== | ||
+ | |||
+ | La couche applicative permet d'améliorer l'expérience utilisateur, elle induit aussi de possibles attaques : | ||
+ | |||
+ | *Injection de code par l'exploitation de bug : le plus souvent réaliser avec un "buffer overflow" qui va corrompre la mémoire vive et permettre d'injecter du code exécutable. | ||
+ | |||
+ | *Autorisation : beaucoup d'objets IOT ont la configuration par défaut (par exemple admin:admin comme logins) ce qui permet d'avoir un accès direct au shell de l'objet en question. | ||
+ | |||
+ | ===Couche Réseau=== | ||
+ | |||
+ | La couche réseau constitue les différents protocoles et trames utilisés par les objets pour communiquer, c'est la couche ou l'on retrouve le plus d'attaques possibles : | ||
+ | |||
+ | *Déni de service (DOS) : envoyer un nombre important de requêtes pour submerger le trafic. | ||
+ | |||
+ | *Homme du milieu (MITM) : intercepter le trafic venant d'un objet puis le transmettre à la base (ou inversement), permettant d'écouter ou de modifier le trafic de manière incognito. | ||
+ | |||
+ | *Sybil attack (multiplication d'identités) : créer de fausses identités sur le réseau afin de le corrompre. | ||
+ | |||
+ | *Sinkhole / Blackhole : intercepter tout le trafic et le router ailleurs (sinkhole) ou ne pas le router (blackhole), nécessite de se faire passer pour la base ou un relayeur. | ||
+ | |||
+ | *Sniffing : écouter le trafic pour l'analyser, permet ensuite de faire du DOS ou MITM. | ||
+ | |||
+ | *Hello spamming : se faire passer pour un nouvel objet et envoyer un nombre important de requête d'appairage, permet de faire du DOS ou d'obtenir la connexion au réseau. | ||
+ | |||
+ | ===Couche de Perception=== | ||
+ | |||
+ | La couche de perception permet aux objets d’émettre et de recevoir le trafic, rendant les objets vulnérables à plusieurs attaques : | ||
+ | |||
+ | *Eavesdropping : écouter le trafic. | ||
+ | |||
+ | *Brouillage RF : submerger les bandes de fréquences pour noyer les communications. | ||
+ | |||
+ | *Spoofing : se faire passer pour un nœud valide. | ||
+ | |||
+ | *Bloquer la mise en veille : envoyer des signaux de réveil de manière répétée afin de sur-consommer la batterie des objets. | ||
+ | |||
+ | ===Couche Physique=== | ||
+ | |||
+ | Enfin la couche physique, constituée du matériel à proprement parlé, ajoute une attaque à la liste : | ||
+ | |||
+ | *Ajout d'un objet malicieux | ||
+ | |||
+ | |||
+ | ==Préparation du processeur== | ||
+ | |||
+ | Le processeur utilisé pour le projet est un Zynq xc7z010 (monté sur une carte Zybo), qui est constitué de deux cœurs de type CPU et d'une partie logique de type FPGA, comme indiqué sur le schéma suivant : | ||
+ | https://www.xilinx.com/content/dam/xilinx/imgs/block-diagrams/zynq-mp-core-dual.png | ||
+ | |||
+ | |||
+ | On remarque les interfaces AXI qui permettrons d'établir la communication entre le CPU et le FPGA. | ||
+ | |||
+ | Pour commencer, il faut installer une distribution linux de type petalinux sur la partie CPU du processeur. Diligent propose une [https://github.com/Digilent/Petalinux-Zybo distribution] | ||
+ | qui est adaptée à cette famille board. | ||
+ | |||
+ | :'''Prérequis''' | ||
+ | :: [https://www.xilinx.com/support/download.html Vivado WebPack] version 2018.3 ou 2017.4, de préférence sur une machine linux (j'ai donc installé une machine virtuelle de type ubuntu sur mon pc). | ||
+ | :: Le SDK Xilinx (proposé lors de l'installation de Vivado). | ||
+ | :: [https://github.com/Digilent/vivado-boards/archive/master.zip Le fichier de configuration des cartes] installé dans /opt/Xilinx/Vivado/VERSION/data/boards. | ||
+ | |||
+ | '''Installation de l'outil petalinux''' | ||
+ | |||
+ | [https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842250/PetaLinux#PetaLinux-PetaLinuxInstallation Petalinux est un outil en ligne commande permettant de compiler des images linux], l'exécutable pour l'installation peut être trouvé [https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/embedded-design-tools.html ici], il choisir la même version que l'installation de Vivado. | ||
+ | |||
+ | L'installation requiert plusieurs librairies et échouera si l'une d'entre elles n'est pas installée (à exécuter en tant que root): | ||
+ | apt-get install g++ chrpath xvfb xterm tofrodos iproute gawk gcc git-core make net-tools libncurses5-dev tftpd zlib1g-dev libssl-dev flex bison libselinux1 lib32z1 lib32ncurses5 lib32stdc++6 libbz2-1.0:i386 libtool-bin | ||
+ | |||
+ | L'installation peut ensuite être lancée (/opt/Petalinux doit exister et disposer d'au moins 20Go): | ||
+ | PATH-TO/petalinux-v2017.4-final-installer-dec.run opt/PetaLinux | ||
+ | |||
+ | Une fois l'installation terminée (ce qui peut prendre environ 15 mins), vérifiez que vous êtes bien configurer en bash et sourcez les scripts nécessaires : | ||
+ | sudo dpkg-reconfigure dash | ||
+ | source /opt/Petalinux/settings.sh | ||
+ | source /opt/Xilinx/Vivado/2017.4/settings64.sh | ||
+ | (les sources peuvent être ajoutées directement dans /etc/bash.bashrc) | ||
+ | |||
+ | '''Préparation de la carte SD''' | ||
+ | |||
+ | L'image linux va être booté depuis une carte SD. Il faut donc placer le jumper JP5 sur la carte Zybo en position SD/QSP1. | ||
+ | |||
+ | La carde SD doit être formatée avec une partition fat32 d'1Go pour le boot et d'une partition ext4 pour le système de fichier. | ||
+ | |||
+ | Pour ce faire il faut supprimer le formatage par défaut de la carte sd. Je l'ai fait depuis le powershell de Windows : | ||
+ | > DISKPART | ||
+ | DISKPART > list disk | ||
+ | DISKPART > select disk 1 | ||
+ | DISKPART > disk clean | ||
+ | DISKPART > exit | ||
+ | |||
+ | Ensuite j'ai monté la carte sd sur ma machine virtuelle pour la formater. Pour une machine virtuelle tournant sur VirtualBOX : | ||
+ | :Obtenez le DeviceID du disque (depuis un powershell): | ||
+ | wmic diskdrive list brief | ||
+ | |||
+ | :Creez le fichier vmdk (depuis un powershell en tant qu'administrateur): | ||
+ | C:\Program Files\Oracle\VirtualBox\VBoxManage internalcommands createrawvmdk -filename "%USERPROFILE%/Documents/sdcard.vmdk" -rawdisk "\\.\PHYSICALDRIVE1" | ||
+ | |||
+ | :Ouvrez VirtualBOX en tant qu'administrateur et ajoutez le disque à la machine virtuelle (la vm doit être éteinte): | ||
+ | selectionner la vm > Configuration > Stockage > Contrôleur SATA > Ajoute un disque dur > Choisir un disque existant > ~/Documents/sdcard.vmdk | ||
+ | |||
+ | Pour formater la carte sd avec linux, cherchez la partition (à exécuter en tant que root): | ||
+ | fdisk -l | ||
+ | |||
+ | :Puis lancez l'outil fdisk (en tant que root) pour configurer la carte sd (/dev/sdb dans mon cas): | ||
+ | > fdisk /dev/sdb | ||
+ | fdisk > n créer la première partition | ||
+ | fdisk > p en fait une primary | ||
+ | fdisk > 1 lui affecte le numéro 1 | ||
+ | fdisk > premier block (laissez par defaut) | ||
+ | fdisk > +1G dernier block pour former une partition d'1Go | ||
+ | fdisk > a en fait la partition de boot | ||
+ | fdisk > n créer la deuxième partition | ||
+ | fdisk > p en fait une primary | ||
+ | fdisk > 2 lui affecte le numéro 2 | ||
+ | fdisk > premier block (laissez par defaut, après la fin de la première partition) | ||
+ | fdisk > dernier block (laissez par defaut pour utiliser l'espace restant) | ||
+ | fdisk > w applique les changement | ||
+ | fdisk > p affiche les partitions pour vérifier | ||
+ | fdisk > q quitter | ||
+ | |||
+ | :Configurez les partitions en fat32 et ext4 (à exécuter en tant que root): | ||
+ | mkfs.vfat -F 32 -n boot /dev/sdb1 | ||
+ | mkfs.ext4 -L root /dev/sdb2 | ||
+ | |||
+ | '''Compilation de l'image petalinux de Diligent''' | ||
+ | |||
+ | Diligent propose propose une image petalinux simple à utiliser. Elle peut être téléchargée [https://github.com/Digilent/Petalinux-Zybo/releases/ ici]. | ||
+ | |||
+ | :Créez le projet à partir du fichier téléchargé (cela peut prendre un certain temps): | ||
+ | petalinux-create -t project -s Petalinux-Zybo-2017.4-1.bsp | ||
+ | |||
+ | Il y a une images précompilée dans le dossier Petalinux-Zybo-2017.4-1/pre-built/linux/images/, copiez BOOT.BIN et image.ub dans la première partition de la carte sd. Placez la carte sd dans la Zybo et mettez la carte sous tension. | ||
+ | |||
+ | Pour se connecter à la carte, utilisez minicom sur le port série (à exécutez en root): | ||
+ | minicom -D /dev/ttyUSB1 | ||
+ | Le port série doit être configuré de la façon suivante: | ||
+ | *baud rate = 115200 | ||
+ | *data bits = 8 | ||
+ | *stop bits = 1 | ||
+ | *flow control = none | ||
+ | *parity = none | ||
+ | |||
+ | Le shell du petalinux devrait apparaître. Pour revoir le boot, cliquez sur le bouton BTN7 (PS-SRST) de la carte. | ||
+ | |||
+ | '''Compilation de l'image petalinux de Xilinx''' | ||
+ | |||
+ | L'image petalinux proposée par Xilinx est plus complète que celle de Diligent. ZCU102 | ||
+ | |||
+ | ==L'interface de connexion AXI== | ||
+ | |||
+ | ==Infrastructure d'un réseau IOT== | ||
=Documents Rendus= | =Documents Rendus= |
Version du 8 janvier 2019 à 11:03
Iron Car
Présentation générale
Description
Objectifs
Cahier des charges
Réalisation du Projet
Liste non exhaustive des attaques possibles sur un réseau IOT
Couche Applicative
La couche applicative permet d'améliorer l'expérience utilisateur, elle induit aussi de possibles attaques :
- Injection de code par l'exploitation de bug : le plus souvent réaliser avec un "buffer overflow" qui va corrompre la mémoire vive et permettre d'injecter du code exécutable.
- Autorisation : beaucoup d'objets IOT ont la configuration par défaut (par exemple admin:admin comme logins) ce qui permet d'avoir un accès direct au shell de l'objet en question.
Couche Réseau
La couche réseau constitue les différents protocoles et trames utilisés par les objets pour communiquer, c'est la couche ou l'on retrouve le plus d'attaques possibles :
- Déni de service (DOS) : envoyer un nombre important de requêtes pour submerger le trafic.
- Homme du milieu (MITM) : intercepter le trafic venant d'un objet puis le transmettre à la base (ou inversement), permettant d'écouter ou de modifier le trafic de manière incognito.
- Sybil attack (multiplication d'identités) : créer de fausses identités sur le réseau afin de le corrompre.
- Sinkhole / Blackhole : intercepter tout le trafic et le router ailleurs (sinkhole) ou ne pas le router (blackhole), nécessite de se faire passer pour la base ou un relayeur.
- Sniffing : écouter le trafic pour l'analyser, permet ensuite de faire du DOS ou MITM.
- Hello spamming : se faire passer pour un nouvel objet et envoyer un nombre important de requête d'appairage, permet de faire du DOS ou d'obtenir la connexion au réseau.
Couche de Perception
La couche de perception permet aux objets d’émettre et de recevoir le trafic, rendant les objets vulnérables à plusieurs attaques :
- Eavesdropping : écouter le trafic.
- Brouillage RF : submerger les bandes de fréquences pour noyer les communications.
- Spoofing : se faire passer pour un nœud valide.
- Bloquer la mise en veille : envoyer des signaux de réveil de manière répétée afin de sur-consommer la batterie des objets.
Couche Physique
Enfin la couche physique, constituée du matériel à proprement parlé, ajoute une attaque à la liste :
- Ajout d'un objet malicieux
Préparation du processeur
Le processeur utilisé pour le projet est un Zynq xc7z010 (monté sur une carte Zybo), qui est constitué de deux cœurs de type CPU et d'une partie logique de type FPGA, comme indiqué sur le schéma suivant : https://www.xilinx.com/content/dam/xilinx/imgs/block-diagrams/zynq-mp-core-dual.png
On remarque les interfaces AXI qui permettrons d'établir la communication entre le CPU et le FPGA.
Pour commencer, il faut installer une distribution linux de type petalinux sur la partie CPU du processeur. Diligent propose une distribution qui est adaptée à cette famille board.
- Prérequis
- Vivado WebPack version 2018.3 ou 2017.4, de préférence sur une machine linux (j'ai donc installé une machine virtuelle de type ubuntu sur mon pc).
- Le SDK Xilinx (proposé lors de l'installation de Vivado).
- Le fichier de configuration des cartes installé dans /opt/Xilinx/Vivado/VERSION/data/boards.
Installation de l'outil petalinux
Petalinux est un outil en ligne commande permettant de compiler des images linux, l'exécutable pour l'installation peut être trouvé ici, il choisir la même version que l'installation de Vivado.
L'installation requiert plusieurs librairies et échouera si l'une d'entre elles n'est pas installée (à exécuter en tant que root):
apt-get install g++ chrpath xvfb xterm tofrodos iproute gawk gcc git-core make net-tools libncurses5-dev tftpd zlib1g-dev libssl-dev flex bison libselinux1 lib32z1 lib32ncurses5 lib32stdc++6 libbz2-1.0:i386 libtool-bin
L'installation peut ensuite être lancée (/opt/Petalinux doit exister et disposer d'au moins 20Go):
PATH-TO/petalinux-v2017.4-final-installer-dec.run opt/PetaLinux
Une fois l'installation terminée (ce qui peut prendre environ 15 mins), vérifiez que vous êtes bien configurer en bash et sourcez les scripts nécessaires :
sudo dpkg-reconfigure dash source /opt/Petalinux/settings.sh source /opt/Xilinx/Vivado/2017.4/settings64.sh
(les sources peuvent être ajoutées directement dans /etc/bash.bashrc)
Préparation de la carte SD
L'image linux va être booté depuis une carte SD. Il faut donc placer le jumper JP5 sur la carte Zybo en position SD/QSP1.
La carde SD doit être formatée avec une partition fat32 d'1Go pour le boot et d'une partition ext4 pour le système de fichier.
Pour ce faire il faut supprimer le formatage par défaut de la carte sd. Je l'ai fait depuis le powershell de Windows :
> DISKPART DISKPART > list disk DISKPART > select disk 1 DISKPART > disk clean DISKPART > exit
Ensuite j'ai monté la carte sd sur ma machine virtuelle pour la formater. Pour une machine virtuelle tournant sur VirtualBOX :
- Obtenez le DeviceID du disque (depuis un powershell):
wmic diskdrive list brief
- Creez le fichier vmdk (depuis un powershell en tant qu'administrateur):
C:\Program Files\Oracle\VirtualBox\VBoxManage internalcommands createrawvmdk -filename "%USERPROFILE%/Documents/sdcard.vmdk" -rawdisk "\\.\PHYSICALDRIVE1"
- Ouvrez VirtualBOX en tant qu'administrateur et ajoutez le disque à la machine virtuelle (la vm doit être éteinte):
selectionner la vm > Configuration > Stockage > Contrôleur SATA > Ajoute un disque dur > Choisir un disque existant > ~/Documents/sdcard.vmdk
Pour formater la carte sd avec linux, cherchez la partition (à exécuter en tant que root):
fdisk -l
- Puis lancez l'outil fdisk (en tant que root) pour configurer la carte sd (/dev/sdb dans mon cas):
> fdisk /dev/sdb fdisk > n créer la première partition fdisk > p en fait une primary fdisk > 1 lui affecte le numéro 1 fdisk > premier block (laissez par defaut) fdisk > +1G dernier block pour former une partition d'1Go fdisk > a en fait la partition de boot fdisk > n créer la deuxième partition fdisk > p en fait une primary fdisk > 2 lui affecte le numéro 2 fdisk > premier block (laissez par defaut, après la fin de la première partition) fdisk > dernier block (laissez par defaut pour utiliser l'espace restant) fdisk > w applique les changement fdisk > p affiche les partitions pour vérifier fdisk > q quitter
- Configurez les partitions en fat32 et ext4 (à exécuter en tant que root):
mkfs.vfat -F 32 -n boot /dev/sdb1 mkfs.ext4 -L root /dev/sdb2
Compilation de l'image petalinux de Diligent
Diligent propose propose une image petalinux simple à utiliser. Elle peut être téléchargée ici.
- Créez le projet à partir du fichier téléchargé (cela peut prendre un certain temps):
petalinux-create -t project -s Petalinux-Zybo-2017.4-1.bsp
Il y a une images précompilée dans le dossier Petalinux-Zybo-2017.4-1/pre-built/linux/images/, copiez BOOT.BIN et image.ub dans la première partition de la carte sd. Placez la carte sd dans la Zybo et mettez la carte sous tension.
Pour se connecter à la carte, utilisez minicom sur le port série (à exécutez en root):
minicom -D /dev/ttyUSB1
Le port série doit être configuré de la façon suivante:
- baud rate = 115200
- data bits = 8
- stop bits = 1
- flow control = none
- parity = none
Le shell du petalinux devrait apparaître. Pour revoir le boot, cliquez sur le bouton BTN7 (PS-SRST) de la carte.
Compilation de l'image petalinux de Xilinx
L'image petalinux proposée par Xilinx est plus complète que celle de Diligent. ZCU102