đĄïž windows-wfp : Un wrapper Rust safe pour le firewall kernel Windows
Depuis quelques mois, je travaille sur un projet personnel en Rust liĂ© Ă la sĂ©curitĂ© rĂ©seau sous Windows. Un projet ambitieux dont je ne dĂ©voilerai pas encore tous les dĂ©tails â disons simplement qu’il nĂ©cessite d’interagir directement avec le firewall kernel-level de Windows. Et quand on plonge dans cet univers, on tombe inĂ©vitablement sur la Windows Filtering Platform (WFP).
Le problĂšme ? Manipuler WFP depuis Rust, c’est du sport. J’ai donc construit un wrapper pour mes propres besoins, et j’ai dĂ©cidĂ© de le partager en open-source sur crates.io : windows-wfp.
đŻ C’est quoi la Windows Filtering Platform ?
La WFP (Windows Filtering Platform) est le framework de filtrage rĂ©seau au niveau kernel intĂ©grĂ© Ă Windows depuis Vista/Server 2008. C’est le moteur qui fait tourner le Pare-feu Windows lui-mĂȘme, ainsi que la plupart des solutions de sĂ©curitĂ© rĂ©seau : antivirus, EDR, VPN…
ConcrĂštement, WFP vous permet de :
- Bloquer ou autoriser du trafic réseau selon des rÚgles fines
- Filtrer par application : autoriser Firefox mais bloquer une autre app
- Filtrer par protocole, port, IP : avec support CIDR pour les plages d’adresses
- Monitorer en temps réel les événements réseau du systÚme
- Intervenir au niveau kernel : avant mĂȘme que le trafic n’atteigne l’application
C’est une API extrĂȘmement puissante, utilisĂ©e par les outils de sĂ©curitĂ© professionnels. Mais elle a un gros dĂ©faut : elle est conçue pour le C/C++, et l’utiliser depuis Rust demande de jongler avec des abstractions bas-niveau peu ergonomiques.
â ïž Le problĂšme : manipuler WFP sans wrapper
Quand j’ai commencĂ© Ă intĂ©grer WFP dans mon projet Rust, je me suis vite retrouvĂ© face Ă trois obstacles majeurs :
1. Du FFI brut partout
Le FFI (Foreign Function Interface), c’est le mĂ©canisme qui permet Ă Rust d’appeler les API C de Windows. Le problĂšme, c’est qu’en passant par du FFI brut, on perd toutes les garanties de sĂ©curitĂ© mĂ©moire qui font la force de Rust. On manipule des pointeurs bruts, des structures C, et on se retrouve Ă Ă©crire du code unsafe (c’est-Ă -dire du code oĂč on dit au compilateur : “fais-moi confiance, je sais ce que je fais” â spoiler : on ne sait pas toujours ce qu’on fait đ
).
2. Des handles Windows non sécurisés
Un handle sous Windows, c’est un identifiant opaque que le systĂšme vous donne quand vous ouvrez une ressource (une session WFP, un fichier, un processus…). Le souci : il faut penser Ă fermer chaque handle manuellement. Si on oublie â fuite de ressources. Si on l’utilise aprĂšs l’avoir fermĂ© â comportement indĂ©fini. Le genre de bugs silencieux qui ne se manifestent qu’en production, 3 mois plus tard, Ă 2h du matin.
3. Le piĂšge des chemins NT kernel
C’est probablement le piĂšge le plus vicieux. WFP opĂšre au niveau kernel et utilise des chemins NT kernel (\Device\HarddiskVolume3\Windows\System32\notepad.exe), pas les chemins DOS habituels (C:\Windows\System32\notepad.exe).
Le rĂ©sultat ? Vous ajoutez un filtre pour bloquer notepad.exe en utilisant son chemin classique. L’API WFP ne renvoie aucune erreur â tout semble fonctionner. Mais le filtre ne matche jamais le moindre paquet. Vos rĂšgles existent, mais elles sont muettes. đ
J’ai perdu un temps considĂ©rable Ă debugger ce comportement avant de comprendre le problĂšme. C’est d’ailleurs ce genre de frustration qui m’a motivĂ© Ă encapsuler toute cette complexitĂ© dans un wrapper propre.
đ windows-wfp : l’approche Rust idiomatique
Le crate windows-wfp encapsule toute cette complexité derriÚre une API safe, ergonomique et idiomatique en Rust.
Architecture du crate
| |
Les principes de conception
â RAII pour les handles : Chaque session WFP, chaque provider, chaque filtre est wrappĂ© dans un type Rust qui ferme automatiquement le handle quand l’objet sort du scope. Impossible d’oublier de nettoyer.
â Builder pattern pour les filtres : Au lieu de remplir des structures C avec des pointeurs, on construit les rĂšgles avec une API fluide et typĂ©e.
â Conversion automatique des chemins : Le crate convertit de façon transparente les chemins DOS en chemins NT kernel. Plus de filtres silencieusement cassĂ©s.
â
API 100% safe : Le code unsafe (nĂ©cessaire pour parler aux API Windows) est isolĂ© et encapsulĂ© Ă l’intĂ©rieur du crate. L’utilisateur n’a jamais Ă Ă©crire d’unsafe.
â Monitoring rĂ©seau : Souscription aux Ă©vĂ©nements rĂ©seau en temps rĂ©el via un callback Rust.
Exemple : bloquer une application
| |
Le ? Ă la fin de chaque appel, c’est l’opĂ©rateur de propagation d’erreur en Rust : si l’appel Ă©choue, l’erreur est renvoyĂ©e proprement Ă l’appelant. Pas de try/catch, pas d’exceptions â tout passe par le systĂšme de types.
Exemple : monitorer le réseau en temps réel
| |
đ§ CapacitĂ©s de filtrage
Le crate supporte un large éventail de conditions de filtrage, combinables entre elles :
| Condition | Description | Exemple |
|---|---|---|
| Application | Filtrer par chemin d’exĂ©cutable | notepad.exe, chrome.exe |
| Protocole | TCP, UDP, ICMP, ICMPv6 | Protocol::Tcp |
| Port distant | Port du serveur cible | Port 443 (HTTPS) |
| Port local | Port de l’application locale | Port 8080 |
| Adresse IP | IPv4/IPv6 avec CIDR | 192.168.1.0/24 |
| Service Windows | Filtrer par nom de service | svchost, dns |
| AppContainer | SID pour apps UWP/Microsoft Store | Edge, apps packagées |
Ces conditions peuvent ĂȘtre combinĂ©es pour crĂ©er des rĂšgles trĂšs prĂ©cises. Par exemple : bloquer chrome.exe uniquement sur le port 80 (HTTP) tout en autorisant le port 443 (HTTPS).
đĄ Ce que j’ai appris en construisant ce crate
Le FFI Windows en Rust, c’est un monde
Le crate windows de Microsoft a Ă©normĂ©ment simplifiĂ© l’accĂšs aux API Windows depuis Rust. Mais WFP reste une API kernel complexe avec des structures imbriquĂ©es, des unions C, et des comportements parfois sous-documentĂ©s. Chaque filtre WFP implique de construire des structures FWPM_FILTER0, FWPM_FILTER_CONDITION0, etc., avec des allocations mĂ©moire manuelles et des durĂ©es de vie Ă gĂ©rer soigneusement.
La conversion de chemins est critique
La fonction FilterAPI.dll!FwpmGetAppIdFromFileName fait la conversion DOS â NT kernel, mais elle a ses subtilitĂ©s. Les chemins rĂ©seau (UNC), les liens symboliques, et les variables d’environnement sont autant de cas Ă gĂ©rer. C’est le genre de dĂ©tail invisible qui fait la diffĂ©rence entre un filtre qui fonctionne et un filtre fantĂŽme.
Le monitoring réseau révÚle beaucoup de choses
En dĂ©veloppant la fonctionnalitĂ© de monitoring, j’ai Ă©tĂ© surpris de voir le volume et la diversitĂ© du trafic rĂ©seau sur un poste Windows classique. Des dizaines de services communiquent en permanence â c’est un rappel que la surface d’attaque rĂ©seau est bien plus large qu’on ne l’imagine.
đź Et la suite ?
windows-wfp est la premiĂšre brique d’un projet plus large sur lequel je travaille actuellement. Un projet liĂ© Ă la sĂ©curitĂ© rĂ©seau sous Windows, toujours en Rust. Je n’en dis pas plus pour le moment… mais restez connectĂ©s, ça promet d’ĂȘtre intĂ©ressant. đ
En attendant, le crate est disponible et fonctionnel. Voici la feuille de route pour windows-wfp lui-mĂȘme :
Prochaines évolutions
- đ Support des callouts : Interception et modification de paquets en temps rĂ©el
- đ Statistiques de filtrage : Compteurs de paquets bloquĂ©s/autorisĂ©s par filtre
- đ§Ș Tests d’intĂ©gration : Suite de tests automatisĂ©s avec crĂ©ation/suppression de filtres rĂ©els
- đ Documentation enrichie : Guides d’utilisation avancĂ©e et cas d’usage concrets
đ Ressources et liens
Le crate
Références techniques
Post LinkedIn
- đŁ Annonce LinkedIn : Le post qui accompagne cette publication
đ Conclusion
Construire windows-wfp m’a permis de plonger dans les entrailles du rĂ©seau Windows au niveau kernel â un domaine fascinant mais exigeant. Le wrapper transforme une API C complexe et piĂ©geuse en quelque chose de sĂ»r, ergonomique et idiomatique en Rust.
Si vous travaillez sur de la sĂ©curitĂ© rĂ©seau sous Windows, ou si vous ĂȘtes simplement curieux de voir comment on wrappe proprement une API kernel en Rust, n’hĂ©sitez pas Ă explorer le code, ouvrir des issues, ou proposer des contributions.
Des questions ? Des retours ? Je suis preneur de tous les feedbacks, que ce soit sur l’API, la documentation, ou les cas d’usage que vous aimeriez voir supportĂ©s.
đ§ Email : lostyzen@gmail.com
đ PGP Key : Download from keys.openpgp.org
đ Fingerprint : 0205 9854 864D EE62 C2BB 455F D825 3521 EDD1 630B
