
Expose USB activity on the fly

[!NOTE] USBvalve version 1.0.0
Une réécriture complète de l'application a été effectuée :
- abandon de l'environnement Arduino IDE, le code est désormais écrit pour le Pi Pico SDK
- les dépendances vis-à-vis des bibliothèques externes ont été considérablement réduites
- la prise en charge hôte USB pour les périphériques Low Speed est désormais plus robuste (ATTiny85, EvilCrow, etc.)
- le matériel et les fonctionnalités sont presque inchangés, voir les notes ci-dessous pour plus de détails
Je suis sûr que, comme moi, on vous a demandé de brancher votre clé USB sur un appareil inconnu... et puis le doute :
que s'est-il passé avec ma pauvre clé, en coulisses ? Vol de mes fichiers ? Chiffrement ? Ou juste l'installation d'un malware ? Avec USBvalve, vous pouvez le détecter en quelques secondes : construit sur du matériel standard très bon marché, vous pouvez rapidement tester toute activité du système de fichiers USB et comprendre ce qui se passe avant qu'il ne soit trop tard !
Avec USBvalve, vous obtenez un retour immédiat sur ce qui arrive à la clé ; l'écran vous indiquera si le faux système de fichiers intégré à l'appareil est accédé, lu ou écrit :
et depuis la version 0.8.0, vous pouvez également l'utiliser comme hôte USB pour détecter les périphériques BADUSB :
Voici un exemple du débogueur BADUSB disponible sur le port série :
Si vous préférez les vidéos, vous pouvez également consulter ma présentation Insomni'hack
À partir de la version 0.15.0, une nouvelle version Pi Pico Watch est prise en charge. Pour compiler la nouvelle version, vous devez décommenter la ligne #define PIWATCH au début du code. Le matériel est une carte montre avec écran TFT de 1,28 pouce basée sur RP2040. Vous pouvez trouver plus d'informations ici.
Elle est également entièrement compatible avec le Waveshare RP2040-LCD-1.28.
docs : documentation sur le projet, avec une présentation où vous pouvez découvrir toutes les fonctionnalités
firmware : firmwares précompilés pour le Raspberry Pi Pico. Vous pouvez simplement les utiliser et les flasher sur la carte. Nous avons plusieurs versions différentes, pour des OLED de 32 ou 64 lignes, pour Pico 1 ou Pico2, Pi Pico Watch, etc.
PCB : fichiers Gerber si vous souhaitez imprimer le PCB personnalisé. Ce n'est pas obligatoire, vous pouvez utiliser le vôtre ou le monter sur une breadboard
src et data : les sources, si vous souhaitez modifier et compiler le firmware vous-même
utils : quelques utilitaires que vous pouvez utiliser pour créer un système de fichiers personnalisé
pictures : images et ressources utilisées dans ce document
STL : fichiers STL pour le boîtier. Dans les dossiers 1.1 et 1.2, il y a des boîtiers complets (merci à WhistleMaster). Dans les dossiers 1.2_64 et 1.2_64_simple, il y a des boîtiers pour l'écran 128x64 (merci à rtmq0227). Si vous voulez quelque chose de plus léger pour protéger l'écran LCD, vous pouvez opter pour USBvalve_sliding_cover.stl.
Si vous voulez construire le vôtre, vous avez besoin de :
Dans les versions 0.x.x, BOOTSEL était utilisé pour réinitialiser l'appareil ou afficher le nombre d'événements HID (appui > 2 s).
L'interrogation de BOOTSEL créait quelques problèmes à la détection BADUSB, elle a donc été supprimée de la version 1.0.0 et remplacée par les deux options suivantes :
GP0 et GND (pads 1 et 3, voir la photo ci-dessous pour un exemple) pour avoir les mêmes fonctionsr (reset) et h (événements HID) depuis le moniteur série
Dans PCB, vous trouverez également une version 1.3 de la carte, avec des trous sur les pads 1 et 3 pour faciliter le montage du bouton. Mais comme vous pouvez le voir, vous pouvez aussi utiliser votre ancienne version.
Si vous n'utilisez pas les fonctions BADUSB ou si vous préférez avoir une couverture de détection moindre mais conserver l'utilisation de BOOTSEL, je fournis également un firmware compilé avec bootsel activé (voir le dossier et les releases).
Grâce à Tz1rf, nous avons également deux excellentes vidéos : l'une expliquant le processus de construction étape par étape, et une autre montrant comment téléverser le firmware et utiliser l'outil.
Presque tout le travail est effectué directement sur la carte par le logiciel, vous n'avez donc qu'à organiser la connexion avec l'OLED pour la sortie.
À partir de la version 0.8.0 du firmware, USBvalve peut détecter les périphériques HID (utilisés pour détecter les BADUSB). Cela nécessite un port USB supplémentaire agissant comme hôte. Si cela ne vous intéresse pas, vous pouvez utiliser les anciennes instructions dans le dossier docs et utiliser la version 1.1 du PCB. Sinon, continuez avec la version 1.2 du PCB (nous avons une version pour USB-A ou USB-B, voir le dossier).
USBH. Ceci est pour la version A, mais il existe aussi une version pour USB Micro-B si vous préférezCertains OLED ont les broches GND et VCC inversées, j'ai donc conçu le PCB pour être compatible avec les deux versions :
Par exemple, si votre OLED a GND sur PIN1 et VCC sur PIN2 comme ceci :
Vous devez placer un point de soudure sur ces deux pads à l'arrière du PCB :
Sinon, vous devez faire l'inverse et placer la soudure sur les autres PADs :
Si vous utilisez une breadboard ou simplement des câbles, tout ce que vous avez à faire est de vous assurer de connecter les bonnes broches à l'écran OLED et au port hôte USB.
Le câblage est le suivant :
Si vous voulez utiliser les fonctions DEBUG, vous pouvez également placer un connecteur sur les 3 broches SWD en bas de la carte.
[!CAUTION] Ce PCB est destiné aux makers électroniques expérimentés NE L'UTILISEZ PAS SI VOUS N'ÊTES PAS SÛR DE POUVOIR LE MANIPULER !
[!NOTE] R7 et R8 ne sont en réalité connectés à rien. Ils sont ajoutés à des fins de débogage du circuit. Ils n'apparaissent donc pas dans la nomenclature (BOM)
USBpipe est un PCB dédié à ce projet.
Vous trouverez tout ce dont vous avez besoin dans le dossier ./PCB/USBpipe/.
Pour flasher le firmware, suivez ces étapes :
RPI-RP2 (sous Linux, vous devrez peut-être le monter manuellement)uf2) dans le dossier, selon l'OLED que vous utilisezC'est terminé !
Je ne sais pas si cela arrivera un jour, mais vous voudrez peut-être personnaliser le firmware afin d'éviter la détection par des malwares conscients d'USBvalve :-)
J'ai regroupé la plupart des variables que vous voudrez peut-être modifier dans cette section de usb_config.h (voir le Dockerfile ci-dessous pour la recompilation)
// USB anti-detection settings
//
// Set USB IDs strings and numbers, to avoid possible detections.
// Remember that you can cusotmize FAKE_DISK_BLOCK_NUM as well
// for the same reason. Also DISK_LABEL in ramdisk.h can be changed.
//
// You can see here for inspiration: https://the-sz.com/products/usbid/
//
// Example:
// 0x0951 0x16D5 VENDORID_STR: Kingston PRODUCTID_STR: DataTraveler
//
#define USB_VENDORID 0x0951
#define USB_PRODUCTID 0x16D5
#define USB_DESCRIPTOR "DataTraveler"
#define USB_MANUF "Kingston"
#define USB_SERIAL "123456789A"
#define USB_VENDORID_STR "Kingston" // Up to 8 chars
#define USB_PRODUCTID_STR "DataTraveler" // Up to 16 chars
#define USB_VERSION_STR "1.0" // Up to 4 chars
Bien évidemment, vous pouvez aussi compiler votre propre firmware. Pour compiler, vous avez besoin du Raspberry Pi Pico SDK et de ce dépôt.
Instructions de base pour la recompilation :
export PICO_SDK_PATH=</path/to/pico-sdk>
git clone --recursive https://github.com/cecio/USBvalve.git
cd USBvalve
mkdir build && cd build
cmake -DPICO_BOARD=pico .. # or pico2 for standard build
make -j$(nproc)
# Output: build/src/USBvalve.uf2
Si vous voulez recréer un nouveau système de fichiers factice, vous pouvez jeter un œil au dossier utils, où j'ai placé quelques utilitaires pour en construire un nouveau.
Si vous voulez compiler votre propre firmware, après l'avoir personnalisé, je fournis un Dockerfile qui construit un environnement de compilation complet et compile le firmware.
Saisissez les commandes suivantes dans le dossier principal USBvalve pour compiler :
# To Build:
# docker build -t usbvalve-sdk -f Dockerfile.sdk .
#
# To Run (default: pico, SSD1306 OLED 128x32):
# docker run --rm -v $PWD:/mnt usbvalve-sdk
#
# Options (via environment variables):
# BOARD=pico|pico2 Board target (default: pico)
# OLED_HEIGHT=32|64 OLED display height (default: 32)
# PIWATCH=1 Use GC9A01 round TFT instead of SSD1306
# USE_BOOTSEL=1 Enable BOOTSEL button (disrupts Low Speed USB)
#
# Examples:
# docker run --rm -e BOARD=pico2 -v $PWD:/mnt usbvalve-sdk
# docker run --rm -e PIWATCH=1 -v $PWD:/mnt usbvalve-sdk
# docker run --rm -e BOARD=pico2 -e OLED_HEIGHT=64 -v $PWD:/mnt usbvalve-sdk
Le firmware sera placé avec l'extension uf2 dans le dossier USBvalve_out.
Si vous avez des idées ou des améliorations en tête, je vous encourage à ouvrir une issue afin que nous puissions améliorer le projet ensemble ! Merci !
Si vous avez une question ou besoin d'aide, vous pouvez ouvrir une Issue ici ou me contacter sur Twitter/X @red5heep
La communauté a créé quelques forks implémentant la prise en charge d'autres cartes, ou d'autres modifications. Merci à tous ceux qui ont contribué au développement d'USBvalve. Voici ci-dessous une liste non officielle/incomplète/non supportée :
[!WARNING] J'ai reçu beaucoup de questions sur USBvalve et les USB killer devices. USBvalve n'est pas conçu pour tester ces dispositifs, il ne dispose d'aucune sorte d'isolation ou de protection. Par conséquent, si vous pensez avoir affaire à l'un de ces dispositifs, testez-le avec autre chose, PAS avec USBvalve, sinon vous risquez d'endommager l'appareil, vous-même ou les objets à proximité.