Las diversas set*gid()
llamadas al sistema requieren privilegios para cambiar de grupo, excepto en muy pocos casos. Cambiar el grupo primario a uno de los grupos suplementarios de los procesos no parece ser uno de ellos, lo que significa que los comandos newgrp
/ sg
por ejemplo necesitan elevar los privilegios para cambiar el grupo primario.
¿Hay alguna razón por la cual setgid()
/ setegid()
/ setregid()
/ setfsgid()
no permita cambiar a un grupo suplementario sin privs? Si es así, ¿cuál es la razón?
security
group
system-calls
William Hay
fuente
fuente
/usr/bin/env
con permiso setgid).newgrp/sg
refiere a la base de datos de la cuenta, no a la lista de grupos complementarios del proceso.setgid()
le permitiría abandonar la membresía de un grupo (lo que sería un problema de seguridad), pero nuevamente podría hacerlo con el mismo truco ejecutable setgid que el anterior, y su gid generalmente también está en su lista complementaria (initgroups(3)
toma un argumento gid solo para eso).Respuestas:
Por supuesto, el enigma fundamental aquí es que las verificaciones de permisos del sistema de archivos se basan en la combinación de (el UID efectivo y) el GID efectivo y los GID suplementarios. Entonces, desde el punto de vista de las verificaciones de permisos de archivos, el GID efectivo es equivalente a los GID suplementarios, lo que lleva a la pregunta del OP. (De paso: si estamos hablando de Linux, en realidad es el UID / GID del sistema de archivos que se usa en las verificaciones de permisos del sistema de archivos, en lugar del UID y GID efectivos, pero las ID anteriores casi siempre tienen los mismos valores que las últimas ID. )
Por lo tanto, debe haber algunos casos en los que los GID reales / efectivos / guardados no sean equivalentes a los GID suplementarios. (Agrupo los GID de conjunto real / efectivo / guardado, porque las reglas de permiso set * gid () normales dicen que un proceso no privilegiado puede cambiar cualquiera de esos GID al mismo valor que uno de los otros dos).
Y de hecho, hay algunos de esos casos. access (2) realiza sus comprobaciones en función de la ID de usuario real y la ID de grupo del proceso. Si un usuario no privilegiado pudo cambiar la ID de grupo real para que sea la misma que una de las GID adicionales que no es la GID establecida efectiva o guardada, entonces el comportamiento de acceso (2) podría ser manipulado.
Hay otros casos de este tipo. Consulte la página del comando man mkdir (2) de Linux , por ejemplo. Dependiendo de si el bit de modo set-GID está configurado en el directorio padre, un nuevo archivo creado en el directorio toma la propiedad de su grupo del GID efectivo del proceso de creación. Nuevamente, si un proceso no privilegiado podría cambiar su GID efectivo para que sea el mismo que uno de sus GID suplementarios, podría manipular la propiedad del grupo de nuevos archivos de maneras inesperadas. Se aplican comentarios similares para mknod (2) y las llamadas IPC de System V semget (2), shmget (2) y msgget (2).
También hay algunos casos específicos de Linux donde los GID del conjunto real / efectivo / guardado no son equivalentes a los GID suplementarios. Ver process_vm_readv (2) y prlimit (2), por ejemplo.
fuente
Creo que la razón es principalmente histórica. Los grupos suplementarios no se agregaron hasta 4.2BSD (alrededor de 1983). Antes de eso, solo tenía los fluidos y fluidos reales y efectivos.
El comportamiento de setuid / setgid era completamente simétrico y no tenía razón para no serlo. Cambiaría de usuario
su
y grupo consg
/newgrp
todos los ejecutables setuid. La información sobre la pertenencia al grupo de usuarios residía solo en la base de datos de usuarios, no en los atributos de los procesos.Y la interfaz setuid / setgid no cambió cuando se agregaron gids suplementarios.
Técnicamente ahora, si tiene acceso de escritura a un sistema de archivos (donde la ejecución y setuid / setgid no están deshabilitados), aún puede configurar su ID de usuario real o real en cualquiera de sus gids adicionales (sin tener que recurrir a
sg
/newgrp
que por cierto solo permitir cambiar a grupos definidos en la base de datos de usuarios, que no es necesariamente la misma que la lista de gids suplementarios del proceso).Y al ejecutar
env
, su egid cambia aany-sup-group
.fuente