Naturalmente, il puzzle fondamentale qui è che i controlli delle autorizzazioni del filesystem si basano sulla combinazione di (l'UID effettivo e) GID effettivo e GID supplementare. Quindi, dal punto di vista dei controlli delle autorizzazioni dei file, il GID effettivo equivale ai GID supplementari, il che porta alla domanda del PO. (Per inciso: se stiamo parlando di Linux, in realtà è l'UID / GID del filesystem che viene utilizzato nei controlli delle autorizzazioni del filesystem, piuttosto che l'UID e GID effettivi, ma i primi ID hanno quasi sempre gli stessi valori dei secondi ID. )
Quindi, ci devono essere alcuni casi in cui i GID reali / effettivi / salvati non sono equivalenti ai GID supplementari. (Raggruppo insieme i GID reali / effettivi / salvati, poiché le normali regole di autorizzazione set * gid () dicono che un processo senza privilegi può cambiare uno di questi GID allo stesso valore di uno degli altri due.)
E in effetti, ci sono alcuni casi del genere. access (2) effettua i controlli in base all'ID utente reale del processo e all'ID gruppo. Se un utente senza privilegi fosse in grado di modificare l'ID del gruppo reale in modo che fosse uguale a uno dei GID supplementari che non è il GID impostato effettivo o salvato, il comportamento dell'accesso (2) potrebbe essere manipolato.
Ci sono altri casi simili. Vedi la pagina man di Linux mkdir (2) , per un esempio. A seconda che il bit della modalità set-GID sia impostato nella directory principale, un nuovo file creato nella directory prende la proprietà del gruppo dal GID effettivo del processo di creazione. Ancora una volta, se un processo senza privilegi potrebbe cambiare il suo GID effettivo in modo che sia uguale a uno dei suoi GID supplementari, potrebbe manipolare la proprietà del gruppo di nuovi file in modi inaspettati. Commenti simili si applicano per mknod (2) e System V IPC chiama semget (2), shmget (2) e msgget (2).
Esistono anche alcuni casi specifici di Linux in cui i GID set reali / effettivi / salvati non sono equivalenti ai GID supplementari. Vedi process_vm_readv (2) e prlimit (2), per esempio.
/usr/bin/env
con il permesso setgid).