¿Puede un proceso de superusuario cambiar la ID de usuario real y la ID de grupo de un proceso, sin coincidir con las del archivo de contraseña?

11

De APUE

La identificación de usuario real y la identificación de grupo real de un proceso identifican quiénes somos realmente. Estos dos campos se toman de nuestra entrada en el archivo de contraseña cuando iniciamos sesión. Normalmente, estos valores no cambian durante una sesión de inicio de sesión, aunque hay formas de que un proceso de superusuario los cambie.

¿Puede un proceso de superusuario cambiar la ID de usuario real y la ID de grupo real de un proceso, de modo que la relación entre la ID de usuario real y la ID de grupo real no coincida con las del archivo de contraseña? Por ejemplo, si el usuario Timno es miembro del grupo oceansegún el archivo de contraseña, ¿puede un proceso de superusuario cambiar la ID de usuario real y la ID de grupo real de un proceso para que sea Timy oceanrespectivamente?

Tim
fuente
55
Una aclaración importante aquí: un proceso que se ejecuta con privilegios de superusuario tiene la capacidad de cambiar su propio UID y GID, no los de otro proceso.
filbranden
La base de datos de información de usuario es puramente userland. Kernel solo se preocupa por UID y GID, no por la base de datos de usuarios o grupos.
炸鱼 薯条 德里克

Respuestas:

15

Sí, un proceso de superusuario puede cambiar su ID de usuario real e ID de grupo real a cualquier valor que desee. Los valores en /etc/passwdy /etc/shadowson la configuración de los valores que deben establecerse, pero no una limitación de los posibles valores.

Editar # 1

Significa que programas como loginleerán los valores de los archivos, por lo que los archivos son archivos de configuración o archivos de entrada. No son restricciones sobre lo que puede hacer un programa. Un proceso de superusuario puede pasar cualquier valor al núcleo, y el núcleo no verificará ningún archivo.

Un programa podría llamar

setgid (54321);
setuid (12345);

y esto funcionaría, incluso si ninguna de las identificaciones se menciona en ningún archivo.

RalfFriedl
fuente
9

El archivo de contraseña y el archivo de grupo no se leen, solo se leen mediante el proceso de inicio de sesión, para establecer la identificación de usuario real y la identificación de grupo real.

No hay nada en el núcleo que mencione estos archivos. El inicio de sesión tiene que abrir los archivos, procesarlos y establecer las dos ID. Se podría escribir de manera diferente para obtener estos ID de otro lugar. Por ejemplo, de una base de datos en red.

Cualquier proceso con capacidad CAP_SETUID puede establecer estos ID, la raíz tiene esta capacidad.

El modelo de seguridad en Unix se implementa en parte en el kernel y en parte en procesos que se ejecutan con capacidades elevadas (por ejemplo, como root).


Tenga en cuenta que /etc/passwdy /etc/grouptambién son leídos por ls, psy cualquier otro programa que necesite traducir nombres de usuario / grupo a / desde ID de usuario / grupo. (Pueden hacerlo a través de una biblioteca, que sepa sobre métodos alternativos para almacenar estos detalles).

ctrl-alt-delor
fuente
1
Ellos ( /etc/passwd, /etc/groups) también son leídos por procesos que desean mostrar o procesar nombres de usuario en lugar de las ID numéricas internas, por ejemplo, psy ls.
Jonas Schäfer
3

Entre otras cosas, el propósito de /etc/passwdes traducir el nombre de un usuario al UID de un usuario . Si no le importa cuál es el UID de bob, no necesita ese archivo. Si solo desea cambiar a un UID / GID arbitrario, use las llamadas al sistema relevantes:

int setuid(uid_t uid);
int setgid(gid_t gid);

Tenga en cuenta que un proceso privilegiado con las capacidadesCAP_SETUID y (que generalmente tiene un proceso raíz) solo puede cambiar su propio UID y GID, no el de otro proceso en ejecución.CAP_SETGID

bosque
fuente