¿Por qué Konsole lee / etc / passwd?

8

En relación con esta pregunta:

Al observar el comportamiento de fatrace, noto algo que me preocupa. Aquí están las primeras líneas de salida del comando "fatrace | grep konsole"

konsole(4112): O /etc/passwd
konsole(4112): CO /etc/passwd
konsole(4112): C /etc/passwd
konsole(4112): O /etc/passwd
konsole(4112): C /etc/passwd
konsole(4112): O /etc/passwd
konsole(4112): C /etc/passwd
konsole(4112): O /etc/passwd
konsole(4112): C /etc/passwd
konsole(4112): O /etc/passwd
konsole(4112): C /etc/passwd
konsole(4112): O /etc/passwd
konsole(4112): C /etc/passwd
konsole(4112): O /etc/passwd
konsole(4112): C /etc/passwd
konsole(4112): O /etc/passwd
...

El caso es que lsof | grep passwd muestra que passwd no está abierto por ningún proceso.

¿Alguna idea de lo que está pasando?

Ratón. La suerte. Perro
fuente
¿Por qué sería una preocupación de seguridad de la que Konsole lee /etc/passwd? Este archivo contiene toda la información sobre las cuentas de usuario, incluido el directorio de inicio y el shell.
Gilles 'SO- deja de ser malvado'
@Gilles: Respondiste tu propia pregunta. :)
Evi1M4chine
Preocupación de seguridad: No. Preocupación de rendimiento: algo. Hay un error KDE largamente reportado (2013) y recientemente corregido (upstream, agosto de 2016) sobre esto: bugs.kde.org/show_bug.cgi?id=325442
arielf

Respuestas:

9

Puedes leer el código fuente; hablando de ... lo hice por ti; parece que es del ProcessInfo.cpparchivo. Está obteniendo los nombres de usuario. No solo eso /etc/passwdno es una preocupación para usted, cualquiera puede leerlo. Sin embargo, podría estar preocupado si estaba tratando de leer /etc/shadow.


fuente
2
Creo que las preguntas más importantes son: ¿Por qué no estoy registrando? ¿Por qué Konsole no lee / etc / paswd una vez? Además, ¿por qué necesita Konsole una lista de nombres de usuario?
Mouse.The.Lucky.Dog
8

Usando straceusted puede ver lo que konsoleestá haciendo.

$ strace -s 2000 -o konsole.log
...
...
open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2655, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f316d8fc000
read(3, "root:x:0:0:root:/root:/bin/bash\nbin:x:1:1:bin:/bin:/sbin/nologin\ndaemon:x:2:2:daemon:/sbin:/sbin/nologin\nadm:x:3:4:adm:/var/adm:/sbin/nologin\nlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin\nsync:x:5:0:sync:/sbin:/bin/sy
nc\nshutdown:x:6:0:shutdown:/sbin:/sbin/shutdown\nhalt:x:7:0:halt:/sbin:/sbin/halt\nmail:x:8:12:mail:/var/spool/mail:/sbin/nologin\noperator:x:11:0:operator:/root:/sbin/nologin\ngames:x:12:100:games:/usr/games:/sbin/nologin\nf
tp:x:14:50:FTP User:/var/ftp:/sbin/nologin\nnobody:x:99:99:Nobody:/:/sbin/nologin\ndbus:x:81:81:System message bus:/:/sbin/nologin\nsystemd-journal-gateway:x:191:191:Journal Gateway:/var/log/journal:/usr/sbin/nologin\npolkitd:
x:999:999:User for polkitd:/:/sbin/nologin\nusbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin\ncolord:x:998:997:User for colord:/var/lib/colord:/sbin/nologin\nrpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin\nqemu:x:107:
107:qemu user:/:/sbin/nologin\nrtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin\ntss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin\nradvd:x:75:75:radvd user:/:/sbin/nologin\nabr
t:x:173:173::/etc/abrt:/sbin/nologin\nopenvpn:x:997:996:OpenVPN:/etc/openvpn:/sbin/nologin\nunbound:x:996:995:Unbound DNS resolver:/etc/unbound:/sbin/nologin\nsaslauth:x:995:76:\"Saslauthd user\":/run/saslauthd:/sbin/nologin\n
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin\navahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin\nrpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin\nnfsnobody
:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin\nnm-openconnect:x:994:994:NetworkManager user for OpenConnect:/:/sbin/nologin\nmailnull:x:47:47::/var/spool/mqueue:/sbin/nologin\nsmmsp:x:51:51::/var/spool/mqueue:/s
bin/nologin\nsshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin\ntcpdump:x:72:72::/:/sbin/nologin\npulse:x:993:993:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin\ngdm:x:42:42::/var/lib/gdm:/sbin/nologin\
ngnome-initial-"..., 4096) = 2655
close(3)                                = 0
...

Konsole está leyendo el contenido de /etc/passwdbastante rápido y simplemente no lo estás viendo lsof. Este es un problema típico cuando se abre un archivo, se lee rápidamente y luego se cierra.

¿Debería Preocuparme?

Esto, por cierto, no es motivo de preocupación. Mi gnome-terminalhace lo mismo. El flujo de cosas puede ser un poco confuso, pero Konsole está buscando información en el sistema. En este caso, algo así como el directorio de inicio del usuario.

Entonces, el sistema realiza una llamada a NSS (archivo de configuración del conmutador de servicio de nombres):

open("/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 3

Hay una línea en este archivo, específicamente esta línea:

passwd:     files

Esta línea le dice a NSS dónde se puede encontrar la "base de datos" 'passwd'. Esta línea le dice a NSS que el recurso está ubicado en archivos. Entonces, el sistema abre el /etc/passwdarchivo para buscar el directorio de inicio del usuario.

NOTA: Cavar aún más este comportamiento parece ser causado por Bash. Hacer un stracesolo Bash muestra lo mismo.

$ strace -s 2000 -o bash.log bash

Lecturas adicionales

Si está realmente interesado en cómo funciona NSS, consulte las páginas de manual nsswitch.confy nss. NSS es modular y puede usar diferentes tecnologías de back-end para sus "bases de datos".

Por ejemplo:

       /etc/nsswitch.conf       NSS configuration file.
       /lib/libnss_compat.so.X  implements "compat" source.
       /lib/libnss_db.so.X      implements "db" source.
       /lib/libnss_dns.so.X     implements "dns" source.
       /lib/libnss_files.so.X   implements "files" source.
       /lib/libnss_hesiod.so.X  implements "hesiod" source.
       /lib/libnss_nis.so.X     implements "nis" source.
       /lib/libnss_nisplus.so.X implements "nisplus" source.
slm
fuente
1
No es lo /etc/nsswitch.confque desencadena la carga /etc/passwd, sino todo lo contrario. Konsole quiere obtener alguna información sobre las cuentas de usuario, por lo que se abre /etc/nsswitch.conf, lo que le dice (dentro del código libc, no dentro del código de la fuente de Konsole) que están las cuentas de usuario /etc/passwd.
Gilles 'SO- deja de ser malvado'
@Gilles - OK, voy a reformular esa parte, gracias.
slm
@Gilles - actualizado.
slm
7

Por la misma razón que ls -llee / etc / passwd, son los datos los que asocian los UID con los nombres. Cuando lsllama stat(2)a un archivo, obtiene un UID numérico para el propietario del archivo. Para mostrarlo como un nombre legible por humanos, debe buscarlo en el único lugar que tiene esas asociaciones /etc/passwd,. Por ejemplo, una primera línea típica en /etc/passwdes

root:x:0:0:root:/root:/bin/bash

Cuando ls -l /etc/hostsnecesita producir la salida

-rw-r--r-- 1 root root 222 Jan 14  2013 /etc/hosts

necesita traducir el UID 0 a "raíz" para que llame a una rutina de biblioteca como getpwuid que se lee /etc/passwdpara proporcionar la traducción. Esa es una gran parte de la razón que /etc/passwdexiste: proporcionar tales traducciones para propósitos completamente mundanos.

Buscar nombres de usuario no presenta más problemas de seguridad que llamar a localtime para que lspueda decirle "14 de enero de 2013" para la hora de modificación del archivo. Como se observó en slm , no hay ninguna razón para mantener el archivo abierto, por lo que se cierra tan pronto como se lee su contenido.

El archivo /etc/passwdoriginalmente contenía contraseñas hash en tiempos más simples. Los hashes de contraseña se movieron a los /etc/shadowque los usuarios normales no pueden leer porque era un agujero de seguridad. El nombre /etc/passwdpermaneció igual pero ahora contiene xel campo de hash de contraseña anterior que no es un hash válido para ninguna contraseña.

msw
fuente