🛠 Sécurité industrielle : élément sécurisé SE050C2 (EAL6+), PSA Certified et Parsec
Objectifs
La X8 se vend comme « l'un des premiers produits Cassini » du marché : une chaîne de sécurité complète embarquée. Cartographie : NXP SE050C2 sur bus dédié (I²C esclave jusqu'à 3,4 MHz) — Common Criteria EAL 6+ (jusqu'au niveau OS), génération de clés, crypto accélérée, stockage sécurisé, « sécurise la mémoire flash utilisateur jusqu'à 50 kB » ; plateforme PSA Certified et Arm SystemReady IR certifiées ; services Parsec intégrés pour exposer la racine de confiance aux conteneurs ; OTA signée côté factory. Ce tuto : comprendre où vivent les clés, comment un conteneur consigne la sécurité sans les toucher, et comment l'OTA signé protège le déploiement.
Matériel
- 1 × Arduino Portenta X8 + câble USB-C data
- adb + accès sudo
- Un conteneur de test (le pont Python du tuto RPC suffit pour expérimenter)
- Docs : SE050-DATASHEET.pdf sur docs.arduino.cc ; docs Parsec (parsec-tools)
- Pour le côté MCU : le SE050C2 est sur un bus dédié — les deux mondes (Linux et M4) doivent partager la carte avec discernement
Code complet
# 1. Verifier la presence des services de sécurité dans l'image
adb shell
fio@portenta-x8:~$ sudo -i
fio@portenta-x8:~$ ls /sys/class/misc/ | grep -i se050 # trace du SE ?
fio@portenta-x8:~$ systemctl list-units | grep -iE "parsec|m4-proxy"
# 2. Un conteneur consigne Parsec (racine de confiance) sans jamais
# voir les cles : montage du socket dans l'app conteneurisee.
# >
# d'usine — verifie avec systemctl status parsec sur ta carte.
docker run -d --name app-securisee \
-v /run/parsec:/run/parsec \
-p 5002-5020:5002-5020 \
--device /dev/ttyGS0 \
arduino/python-rpc-serial
# 3. Principes a respecter (pas de code magic) :
# - les cles privees sont generees et restent DANS le SE050C2 ;
# - l'OTA de la factory est signee : une image falsifiee n'est
# pas installee ; les cles de provisioning sont par appareil ;
# - le M4 (Arduino) n'a pas besoin des secrets réseau : garde
# l'authentification MQTT/TLS dans le conteneur, adossee au SE.
Vérification attendue
La carte expose les traces des composants de sécurité (service Parsec, accès au SE) et un conteneur peut consigner le service sans que aucune clé n'apparaisse dans son système de fichiers — c'est tout l'intérêt du modèle : le SE050C2 signe/déchiffre pour l'application, les secrets ne traversent jamais le conteneur. Côté déploiement, seule une image signée par ta factory passe — une image falsifiée en transit est refusée.
Erreurs fréquentes
- Stocker les secrets MQTT/TLS dans l'image Docker ou dans le sketch : c'est exactement ce que le SE050C2 évite — clés dans l'élément sécurisé (ou le keystore du service de sécurité), jamais dans le binaire versionné.
- Confondre les mondes : le SE050C2 est sur un bus dédié ; avant de l'utiliser depuis le M4, vérifie qui du Linux ou du MCU pilote ce bus — les deux ne peuvent pas l'avoir simultanément.
- Croire que « secure element » = application transparente : sans le service d'accès (Parsec ou équivalent) exposé au conteneur, l'app n'a aucun chemin vers la puce — vérifie le service avant d'écrire le code.
- Réutiliser la clé de provisioning de la factory sur plusieurs appareils : le modèle Portenta X8 Manager est justement la clé individuelle par appareil — une clé partagée transforme un vol en compromission de flotte.
- Compter sur le chiffrement pour la disponibilité : l'OTA signée protège l'intégrité, pas la disponibilité — garde un slot d'image précédente valide (A/B) et ne coupe pas l'alimentation pendant un swap.
- >
- >
Autres tutoriels pour cette carte
- Premiers pas : comprendre le monstre à 9 cœurs et entrer dans Linux via ADB
- Premier sketch sur le cœur M4 : le blink qui se flash par ADB
- Docker dès la sortie de l'emballage : premier conteneur sur le Linux embarqué
- Pont Linux ↔ Arduino : appeler des fonctions du sketch M4 depuis Python (RPC)
- Mettre la X8 en réseau : Wi-Fi du Murata 1DX et Gigabit Ethernet sur porteuse
- Nœud IoT de datalogging : capteurs sur le M4, stockage et transport en conteneur
Exemples de code pour cette carte
etat-systeme.shBashgpio-libgpiod.shBashpython-gpio.pyPythondocker-hello.shBashflasher-core-arduino.shBashwifi-nmcli.shBash