kid3 easytag linux privileges setuid

linux - kid3 - easytag



RealUID, UID guardado, UID efectivo. ¿Que esta pasando? (3)

Este es un programa set-root-uid

$ls -l -rwsr-sr-x 1 root root 7406 2011-12-13 22:37 ./x*

El código fuente:

int main(void) { printf( " UID GID /n" "Real %d Real %d /n" "Effective %d Effective %d /n", getuid (), getgid (), geteuid(), getegid() ); seteuid(600); printf( " UID GID /n" "Real %d Real %d /n" "Effective %d Effective %d /n", getuid (), getgid (), geteuid(), getegid() ); setuid(1000); printf( " UID GID /n" "Real %d Real %d /n" "Effective %d Effective %d /n", getuid (), getgid (), geteuid(), getegid() ); setuid(0); // HOW DOES THIS SUCCEED IN SETTING THE EUID BACK TO 0 printf( " UID GID /n" "Real %d Real %d /n" "Effective %d Effective %d /n", getuid (), getgid (), geteuid(), getegid() ); return 0 ; }

SALIDA

UID GID Real 1000 Real 1000 Effective 0 Effective 0 UID GID Real 1000 Real 1000 Effective 600 Effective 0 UID GID Real 1000 Real 1000 Effective 1000 Effective 1000 UID GID Real 1000 Real 1000 Effective 0 Effective 1000

Mi pregunta

La página man indica que setuid cambiará el uid real, guardado y efectivo. Entonces, después de llamar a setuid(1000) , los tres cambian a 1000 . ¿Cómo es ese setuid(0) vamos a cambiar euid a 0 ?


DESCRIPCIÓN setuid () establece la identificación de usuario efectiva del proceso de llamada. Si el UID efectivo de la persona que llama es la raíz, también se configuran el UID real y el ID de usuario-set guardado.

En Linux, setuid () se implementa como la versión POSIX con la característica _POSIX_SAVED_IDS. Esto permite que un programa set-user-ID (que no sea root) suelte todos sus privilegios de usuario, haga un trabajo sin privilegios y luego vuelva a conectar el ID de usuario efectivo original de forma segura.

Si el usuario es root o el programa es set-user-ID-root, se debe tener especial cuidado. La función setuid () comprueba la identificación de usuario efectiva de la persona que llama y, si es el superusuario, todos los ID de usuario relacionados con el proceso están configurados en uid. Después de que esto haya ocurrido, es imposible que el programa recupere los privilegios de root.

Por lo tanto, un programa set-user-ID-root que desee eliminar temporalmente los privilegios de root, asumir la identidad de un usuario sin privilegios y luego recuperar los privilegios de root posteriormente no puede usar setuid (). Puedes lograr esto con seteuid (2).

(del Manual de programadores de Linux, 2014-09-21, página setuid.2 )


Hay dos casos,

  1. Desea soltar temporalmente el privilegio de root mientras ejecuta el programa setuid
  2. Desea soltar permanentemente el privilegio de root mientras ejecuta el programa setuid ...
  • Puede hacerlo temporalmente estableciendo el euid en la identificación del usuario real y luego cambiando el uid a cualquier cosa que desee. Y luego, cuando necesite recuperar el privilegio raíz, puede establecer como root y el ID de usuario efectivo volverá a ser root. Esto se debe a que el ID de usuario guardado no se cambia.
  • Puede soltar el privilegio permanentemente cambiando el uid directamente a una identificación de usuario con menos privilegios. Después de esto, no importa lo que no puedas recuperar el privilegio de root.

Caso 1:

Después de que un programa setuid comience a ejecutarse

1.seteuid(600); 2.setuid(1000); 3.setuid(0);

En este caso, el privilegio de root se puede recuperar nuevamente.

+----+------+------------+ | uid|euid |saved-uid | |----|------|------------| 1.|1000| 0 | 0 | 2.|1000| 600 | 0 | 3.|1000| 1000 | 0 | 4.|1000| 0 | 0 | | | | | +------------------------+

Caso 2

Después de que un programa setuid comience a ejecutarse ,

1.setuid(1000); 2.setuid(0); +----+------+------------+ | uid|euid |saved-uid | |----|------|------------| 1.|1000|0 | 0 | 2.|1000|1000 | 1000 | | | | | +------------------------+

En este caso, no puede recuperar el privilegio de root. Esto se puede verificar con el siguiente comando:

cat / proc / PROCID / task / PROCID / estado | Menos

Uid: 1000 0 0 0 Gid: 1000 0 0 0

Este comando mostrará un Uid y Gid y tendrá 4 campos (los primeros tres campos son los que nos conciernen). Algo como el anterior

Los tres campos representan uid, euid y saved-user-id. Puede introducir una pausa (una entrada del usuario) en su programa setuid y verificar en cada paso el cat /proc/PROCID/task/PROCID/status | less cat /proc/PROCID/task/PROCID/status | less comando. Durante cada paso puede verificar que el uid guardado se modifique como se mencionó.

Si youid es root y cambias el uid, los privilegios se eliminan permanentemente. Si el ID de usuario efectivo no es root, nunca se toca el ID de usuario guardado y puedes recuperar el privilegio de root cuando lo desees en tu programa.


O! Estas funciones son difíciles de usar correctamente.

La página man indica que setuid cambiará el uid real, guardado y efectivo. Entonces, después de llamar a setuid (1000), los tres cambian a 1000.

Ese es el caso si y solo si usted es euid 0. En el momento de llamar a setuid(0) , sin embargo, usted es euid 1000 y uid ahorrado 0 (compruebe getresuid(2) , por ejemplo). Es por eso que puedes recuperar privilegios.