Glossary
Mach port
La primitive IPC fondamentale sur macOS — un point de terminaison géré par le noyau, auquel les processus détiennent des droits pour échanger des messages.
Un Mach port est la seule primitive d'IPC dans macOS. Toute forme de communication inter-processus sur la plateforme — XPC, NSXPC, distributed objects, IOKit user clients, événements WindowServer, lookup de services launchd — est implémentée au-dessus de Mach ports.
Conceptuellement, un port est une file de messages gérée par le noyau. Un processus détient des port rights qui décrivent ce qu'il peut faire :
- Send right — peut envoyer des messages.
- Send-once right — peut envoyer exactement un message (utilisé pour les réponses RPC).
- Receive right — peut recevoir des messages. Un seul processus le détient à la fois.
- Port set — collection de receive rights sur laquelle on peut attendre en bloc.
- Dead name — ce qu'un send right devient quand le receive right est détruit.
Les droits sont reference-counted et migrent entre processus via la partie descripteur d'un message Mach. C'est ainsi que le système fait circuler des capacités : donner un send right à un processus, c'est lui donner la capacité de parler à qui détient le receive right.
La surface de trap pour gérer les ports vit dans _kernelrpc_mach_port_* (_kernelrpc_mach_port_allocate_trap, _kernelrpc_mach_port_deallocate_trap, etc.) et la surface de messagerie est mach_msg_trap et son cousin récent mach_msg2_trap.
Le port le plus sensible en sécurité est le task port — en posséder un sur un autre processus équivaut à exécution arbitraire dedans.