为什么Konsole读取/ etc / passwd?


8

关于这个问题:

在观察宽容行为时,我注意到一些与我有关的事情。这是命令“ 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
...

问题是lsof | grep passwd表示passwd未被任何进程打开。

所以知道发生了什么吗?


为什么Konsole会读取安全性问题/etc/passwd?该文件包含有关用户帐户的所有信息,包括主目录和外壳程序。
吉尔斯(Gilles)'所以

@吉尔斯:你回答了自己的问题。:)
Evi1M4chine 2015年

安全问题:否。性能问题:有点。有很长的报道(2013年),最近已修复(上游,2016年8月)有关此的KDE错误:bugs.kde.org/show_bug.cgi?id=325442
arielf

Answers:


9

您可以阅读源代码。说到...我为你做了;看起来像是来自ProcessInfo.cpp文件。正在获取用户名。不仅/etc/passwd您不必担心,任何人都可以阅读它。您可能会担心它是否正在尝试阅读/etc/shadow


2
我认为更大的问题是:lsof为什么不注册它?konsole为什么不读一次/ etc / paswd?另外,konsole为什么需要用户名列表?
Mouse.The.Lucky.Dog 2014年

8

使用strace您可以查看最新konsole内容。

$ 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正在/etc/passwd相当快地阅读in 的内容,而您只是没有看到它lsof。当打开文件,快速读取然后关闭文件时,这是一个典型的问题。

我应该担心吗?

顺便说一下,这无关紧要。我gnome-terminal做同样的事情。事情的流程可能会有些混乱,但是Konsole正在向系统查询一条信息。在这种情况下,类似用户的主目录。

因此,系统会调用NSS(名称服务交换机配置文件):

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

此文件中有一行,特别是以下行:

passwd:     files

此行告诉NSS在哪里可以找到“数据库”“ passwd”。此行告诉NSS,该资源位于文件中。因此,系统随后打开/etc/passwd文件以查找用户的主目录。

注意:进一步挖掘此行为似乎是由Bash引起的。这样做的strace只是猛砸显示了同样的事情。

$ strace -s 2000 -o bash.log bash

进一步阅读

如果您真的对NSS的工作方式感兴趣,请查阅手册页nsswitch.confnss。NSS是模块化的,可以将不同的后端技术用于其“数据库”。

例如:

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

1
不是/etc/nsswitch.conf触发加载/etc/passwd,而是相反。Konsole希望获取有关用户帐户的一些信息,因此将其打开/etc/nsswitch.conf,并告诉用户帐户位于(在libc代码内部,而不是Konsole来源的内部代码中)/etc/passwd
吉尔斯(Gilles)“所以,别再邪恶了”

@吉尔斯-好的,我会改写那部分,谢谢。
slm

@Gilles-更新。
slm

7

出于相同的原因,ls -l读取/ etc / passwd也是将UID与名称相关联的数据。当ls调用stat(2)一个文件时,它获取该文件的所有者数字UID。为了将其显示为易于理解的名称,它需要在唯一具有这些关联的位置进行查找/etc/passwd。例如,典型的第一行/etc/passwd

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

什么时候ls -l /etc/hosts需要产生输出

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

它需要将UID 0转换为“ root”,因此它需要调用getpwuid之类的库例程来读取/etc/passwd并提供转换。这是存在的很大一部分原因/etc/passwd:为了完全平凡的目的而提供此类翻译。

查找用户名不会带来比调用本地时间更多的安全性问题,因此ls可以告诉您“ Jan 14 2013”​​文件的修改时间。正如slm所指出的,没有理由保持文件打开,因此一旦读取文件的内容就将其关闭。

该文件/etc/passwd最初确实在更简单的时间内包含哈希密码。密码散列已转移到/etc/shadow普通用户无法读取的地方,因为这是一个安全漏洞。名称/etc/passwd保持不变,但现在包含x在以前的密码哈希字段中,该字段对于任何密码都不是有效的哈希。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.