1 points par GN⁺ 2025-12-14 | Aucun commentaire pour le moment. | Partager sur WhatsApp
  • La sécurité mémoire et le sandboxing sont deux concepts de sécurité indépendants, et il faut disposer des deux pour mettre en place une défense robuste
  • Fil-C est une implémentation à sécurité mémoire de C/C++, qui garantit cette sécurité jusqu’au niveau des appels système Linux et peut être utilisée même dans des composants système comme OpenSSH
  • Lors du portage du sandbox basé sur seccomp-BPF d’OpenSSH vers Fil-C, les principaux défis ont porté sur les limites de création de threads et l’ajustement du filtre seccomp
  • Pour la gestion des threads d’arrière-plan du runtime Fil-C, l’API zlock_runtime_threads() a été ajoutée afin de contrôler le comportement des threads à l’intérieur du sandbox
  • Fil-C applique de façon synchronisée les appels prctl à tous les threads du runtime, afin que no_new_privs et le filtre seccomp soient appliqués de manière cohérente à l’ensemble du processus

Relation entre sécurité mémoire et sandboxing

  • La sécurité mémoire et le sandboxing sont deux couches de sécurité distinctes, et l’une seule ne fournit pas une protection complète
    • Exemple de programme sûr en mémoire mais non sandboxé : un programme Java qui peut écraser un fichier via une entrée utilisateur
    • Exemple de programme sandboxé mais non sûr en mémoire : un programme écrit en assembleur avec des privilèges limités
  • En pratique, un sandbox présente des failles structurelles, comme l’autorisation de communication avec un processus broker
  • Il est donc préférable de combiner sécurité mémoire et sandboxing

Combinaison de Fil-C et du sandbox OpenSSH

  • Fil-C est une implémentation à sécurité mémoire de C/C++, qui conserve cette sécurité au niveau des appels système Linux
    • Le runtime Fil-C peut fonctionner même dans des composants système de bas niveau comme init ou udevd
    • OpenSSH fonctionne normalement avec Fil-C et utilise un sandbox seccomp-BPF
  • Sous Linux, OpenSSH construit son sandbox avec les outils suivants
    • chroot pour restreindre l’accès au système de fichiers
    • Exécution sous l’utilisateur/groupe sshd
    • setrlimit pour limiter l’ouverture de fichiers et la création de processus
    • Filtre seccomp-BPF pour n’autoriser que les appels système permis
  • Fil-C prend en charge chroot et le changement d’utilisateur par défaut, mais setrlimit et seccomp-BPF peuvent entrer en conflit avec le fonctionnement du runtime, ce qui demande des ajustements supplémentaires

Contrôle des threads dans le runtime Fil-C

  • Le runtime Fil-C utilise des threads d’arrière-plan pour le garbage collection, qu’il suspend et relance automatiquement si nécessaire
  • Le sandbox setrlimit d’OpenSSH vise à interdire la création de nouveaux processus, et la création de threads par le runtime peut donc enfreindre cette règle
  • Pour résoudre ce problème, l’API zlock_runtime_threads() a été ajoutée à <stdfil.h>
    • Le runtime crée immédiatement les threads dont il a besoin, puis désactive leur arrêt automatique par la suite
    • L’appel est effectué dans la fonction ssh_sandbox_child d’OpenSSH avant setrlimit ou seccomp-BPF

Ajustement du filtre seccomp d’OpenSSH

  • Après l’application de zlock_runtime_threads(), la plupart des fonctions du sandbox continuent de fonctionner telles quelles
  • Les changements suivants ont été apportés au filtre seccomp
    • En cas de violation, réglage sur SECCOMP_RET_KILL_PROCESS afin de terminer aussi les threads d’arrière-plan de Fil-C
    • Ajout de MAP_NORESERVE à la liste des autorisations, pour permettre l’utilisation de l’allocateur mémoire de Fil-C
    • Autorisation de l’appel sched_yield, utilisé dans l’implémentation des verrous de Fil-C
  • Les appels futex utilisés par Fil-C pour la synchronisation étaient déjà autorisés, donc aucun changement supplémentaire n’était nécessaire

Mise en œuvre de prctl dans Fil-C

  • OpenSSH utilise deux appels prctl lors de l’installation du filtre seccomp
    • PR_SET_NO_NEW_PRIVS pour empêcher l’acquisition de privilèges supplémentaires
    • PR_SET_SECCOMP, SECCOMP_MODE_FILTER pour activer le filtre
  • Le problème est que prctl ne s’applique qu’au thread appelant, ce qui laisse le risque que d’autres threads du runtime Fil-C restent sans filtre
  • Pour éviter cela, Fil-C utilise l’API filc_runtime_threads_handshake() afin d’appliquer la configuration de manière synchronisée à tous les threads du runtime
    • Elle garantit que chaque thread exécute le même appel prctl
    • En présence de plusieurs threads utilisateur, elle déclenche une erreur de sûreté Fil-C pour renforcer la protection

Conclusion

  • La combinaison de la sécurité mémoire et du sandboxing constitue l’approche de sécurité la plus solide
  • Fil-C intègre complètement le sandbox basé sur seccomp d’OpenSSH tout en préservant la sécurité mémoire sans réduire le niveau de protection
  • Dans un environnement Linux, Fil-C permet d’obtenir à la fois une sécurité au niveau système et une sûreté au niveau du langage

Aucun commentaire pour le moment.

Aucun commentaire pour le moment.