Bonjour,
Je suis en train d’écrire une sandbox intrusive multiplate-forme (pour ceux qui connaissent bien ça sous linux, comprendre seccomp/capsicum) pour un logiciel opensource et je n’arrive pas à avoir une solution aussi satisfaisante sous Windows.
Pour modéliser ma situation, on peut dire que j’ai des blocs de données à transférer régulièrement dans une chaîne de processus, j’utilise donc des mémoires partagées sous linux, que je crée avec memfd_create
, puis je donne l’accès au processus suivant en envoyant via SCM une nouvelle copie du descripteur de fichier vers cette mémoire sur un socket unix.
J’aimerai garder le même modèle pour Windows, et donc générer des mémoires partagées au fur et à mesure que mes données arrivent puis les transférer au processus suivant. Pour cela il y a deux méthodes :
DuplicateHandle
permet de transférer un descripteur de fichier d’un processus à l’autre, mais peut s’utiliser autant depuis le processus source que le processus cible. Il faut également les mêmes droits des deux côtés et peut permettre de transférer (et donc récupérer) n’importe quelle ressource d’un processus à l’autre. Il faut donc que ce soit un troisième processus (un broker privilégié) qui copie d’un processus à l’autre.
Comme j’ai des contraintes de performance, j’essaie d’éviter que ce broker-là soit sur le chemin de données.
L’autre solution consiste à créer des mémoires partagées nommées (elles seront de toute façon nommées dû aux contraintes d’ACL qui sont inexistantes avec les sections mémoires sous windows, mais c’est surtout pour le modèle). On peut donc mettre des ACL sur la mémoire pour qu’elle soit accessible par le processus courant et le processus suivant, en jouant plutôt sur les PACLs. Malheureusement, cela signifie qu’on s’ouvre à des races conditions possibles.
Est-ce que vous avez une idée de solution qui permettrait de corriger ces races conditions ? J’ai l’impression qu’il n’y a pas vraiment de solution si on ne peut pas passer l’ownership de la ressource en même temps que les droits d’accès, mais l’API windows est tellement complexe et incompréhensible que j’espère avoir oublié une solution.