Gilfoyle tourne sous un utilisateur dédié sans privilèges et ne les élève jamais. L’unité systemd fournie met le processus en bac à sable, et le build Rust rejette les constructions risquées.
L’unité
packaging/gilfoyle.service est durcie par défaut :
[Service]
User=gilfoyle
Group=gilfoyle
NoNewPrivileges=yes
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yes
PrivateDevices=yes
ProtectKernelTunables=yes
ProtectKernelModules=yes
ProtectControlGroups=yes
ProtectClock=yes
ProtectHostname=yes
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX
RestrictNamespaces=yes
RestrictRealtime=yes
RestrictSUIDSGID=yes
LockPersonality=yes
MemoryDenyWriteExecute=yes
CapabilityBoundingSet=
AmbientCapabilities=
SystemCallArchitectures=native
SystemCallFilter=@system-service
SystemCallErrorNumber=EPERM
ReadOnlyPaths=/proc/uptime
- Aucune capacité.
CapabilityBoundingSet=etAmbientCapabilities=sont vides, etNoNewPrivileges=yessignifie que le processus ne peut jamais en acquérir. - Une vue en lecture seule de l’hôte.
ProtectSystem=strictetProtectHome=yesrendent le système de fichiers en lecture seule ;/proc/uptimeest le seul fichier de l’hôte que le service peut lire. - Un filtre d’appels système.
SystemCallFilter=@system-servicen’autorise que les appels système de service ; tout le reste renvoieEPERM. - Pas de mémoire à la fois inscriptible et exécutable.
MemoryDenyWriteExecute=yes. - Un réseau limité au nécessaire.
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX— le bus système est joint viaAF_UNIX.
Garde-fous à la compilation
Ces règles sont vérifiées à la compilation, pas à l’exécution.
unsafeest interdit dans tout le workspace.clippy::disallowed_methods(voirclippy.toml) refusestd::process::Commandetstd::process::exit: toute tentative de lancer un processus échoue au lint.- Le cœur du domaine ne fait aucune E/S et n’a accès ni au réseau, ni au système de fichiers, ni à la table de processus.
Chaîne d’approvisionnement
cargo-deny (voir deny.toml) refuse les registres et sources git inconnus, porte une liste
d’avis ignorés vide, fixe une liste blanche de licences et bannit openssl.
Docker n’a pas de polkit
Docker est joint via son socket UNIX. Contrairement à systemd et PackageKit, il n’y a pas de
polkit derrière : l’accès à /var/run/docker.sock équivaut à root. L’unité systemd
autorise déjà AF_UNIX, et ProtectSystem=strict n’empêche pas connect() sur un socket :
aucune directive supplémentaire n’est nécessaire — mais le socket doit être accordé étroitement
(un proxy de socket), et [docker] manage_containers reste en refus par défaut. Voir
Conteneurs.
Ce qui n’est pas durci
La limitation de débit est laissée au pare-feu et à systemd, la rotation des clés exige un
redémarrage, et les certificats OpenSSH ne sont pas pris en charge. Le transport SSH ajoute
une surface de parseur avant authentification et un backend crypto C (ring) — un compromis
assumé.