Por que o konsole está lendo / etc / passwd?

8

Em relação a esta pergunta:

Ao observar o comportamento da fadrace, noto algo que me preocupa. Aqui estão as primeiras linhas de saída do 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
...

O problema é que lsof | grep passwd mostra que o passwd não está aberto por nenhum processo.

Alguma idéia do que está acontecendo?

Mouse.The.Lucky.Dog
fonte
Por que seria uma preocupação de segurança que o Konsole lê /etc/passwd? Este arquivo contém todas as informações sobre contas de usuário, incluindo o diretório inicial e o shell.
Gilles 'SO- stop be evil'
@ Gilles: Você respondeu sua própria pergunta. :)
Evi1M4chine
Preocupação com segurança: Não. Preocupação com o desempenho: um pouco. Há uma longa relatado (2013) e recentemente fixo (a montante, agosto 2016) bug KDE sobre isso: bugs.kde.org/show_bug.cgi?id=325442
arielf

Respostas:

9

Você pode ler o código fonte; falando de ... eu fiz isso por você; parece que é do ProcessInfo.cpparquivo. Está recebendo os nomes de usuário. Não só isso /etc/passwdnão é uma preocupação para você, qualquer um pode lê-lo. Você pode estar preocupado se estiver tentando ler /etc/shadow.


fonte
2
Penso que as questões maiores são: Por que não estou registrando? Por que o konsole não lê o / etc / paswd apenas uma vez? Por que o konsole precisa de uma lista de nomes de usuários?
precisa saber sobre o arquivo
8

Usando stracevocê pode ver o que konsoleestá acontecendo .

$ 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
...

O Konsole está lendo o conteúdo do site /etc/passwdrapidamente e você não o vê lsof. Esse é um problema típico quando um arquivo é aberto, lido rapidamente e depois fechado.

Devo me preocupar?

A propósito, isso não é motivo de preocupação. Meu gnome-terminalfaz a mesma coisa. O fluxo de coisas pode ser um pouco confuso, mas o Konsole está consultando o sistema em busca de informações. Nesse caso, algo como o diretório inicial do usuário.

Portanto, o sistema faz uma chamada para o NSS (arquivo de configuração do Name Service Switch):

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

Há uma linha neste arquivo, especificamente esta linha:

passwd:     files

Essa linha informa ao NSS onde o "banco de dados" 'passwd' pode ser encontrado. Esta linha está informando ao NSS que o recurso está localizado nos arquivos. Portanto, o sistema abre o /etc/passwdarquivo para procurar o diretório inicial do usuário.

Observação: cavando mais esse comportamento parece ser causado por Bash. Fazer straceapenas Bash mostra a mesma coisa.

$ strace -s 2000 -o bash.log bash

Leituras adicionais

Se você está realmente interessado em saber como o NSS funciona, consulte as páginas de manual nsswitch.confe nss. O NSS é modular e pode usar diferentes tecnologias de back-end para seus "bancos de dados".

Por exemplo:

       /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
fonte
1
Não é isso /etc/nsswitch.confque desencadeia o carregamento de /etc/passwd, pelo contrário, o oposto. O Konsole deseja obter algumas informações sobre contas de usuário, para que seja aberto /etc/nsswitch.conf, o que informa (dentro do código libc, não dentro do código da fonte do Konsole) que as contas do usuário estão /etc/passwd.
Gilles 'SO- stop being evil'
@ Gilles - OK, vou reformular essa parte, obrigado.
Slm
@Gilles - atualizado.
Slm
7

Pelo mesmo motivo, ls -llê / etc / passwd, são os dados que associam UIDs aos nomes. Quando lschama stat(2)um arquivo, ele recebe um UID numérico para o proprietário do arquivo. Para exibir isso como um nome legível por humanos, ele precisa procurá-lo no único local que possui essas associações /etc/passwd. Por exemplo, uma primeira linha típica /etc/passwdé

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

Quando ls -l /etc/hostsprecisa produzir a saída

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

ele precisa converter o UID 0 em "raiz", para chamar uma rotina de biblioteca como getpwuid, que lê /etc/passwdpara fornecer a tradução. Essa é uma grande parte da razão da /etc/passwdexistência: fornecer essas traduções para propósitos completamente mundanos.

Procurar nomes de usuário não representa mais um problema de segurança do que chamar a hora local, para que lsvocê possa indicar "14 de janeiro de 2013" para a hora da modificação do arquivo. Como slm observou, não há razão para manter o arquivo aberto, por isso é fechado assim que seu conteúdo é lido.

O arquivo /etc/passwdoriginalmente continha senhas com hash em tempos mais simples. Os hashes de senha foram movidos para os /etc/shadowquais os usuários normais não podem ler porque era uma falha de segurança. O nome /etc/passwdpermaneceu o mesmo, mas agora contém xo campo de hash da senha anterior, que não é válido para nenhuma senha.

msw
fonte