Почему консоль читает / 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 не открывается ни одним процессом.

Так есть идеи, что происходит?

Mouse.The.Lucky.Dog
источник
Почему это проблема безопасности, из которой Konsole читает /etc/passwd? Этот файл содержит всю информацию об учетных записях пользователей, включая домашний каталог и оболочку.
Жиль "ТАК - перестань быть злым"
@ Жиль: Вы ответили на свой вопрос. :)
Evi1M4chine
Проблемы безопасности: Нет. Проблемы производительности: несколько. Об этом давно сообщалось (2013 г.) и недавно исправлена ​​(вверх по течению, август 2016 г.) ошибка KDE по этому поводу: bugs.kde.org/show_bug.cgi?id=325442
arielf

Ответы:

9

Вы можете прочитать исходный код; говоря о ... я сделал это для тебя; похоже, это из ProcessInfo.cppфайла. Это получает имена пользователей. Мало того, что /etc/passwdэто не беспокоит вас, любой может прочитать это. Вы могли бы волноваться, хотя, если он пытался читать /etc/shadow.


источник
2
Я думаю, что большие вопросы: почему я не регистрирую это? Почему konsole просто не читает / etc / paswd один раз? Кроме того, зачем konsole нужен список имен пользователей?
Mouse.The.Lucky.Dog
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довольно быстро, и вы просто не видите его lsof. Это типичная проблема, когда файл открывается, быстро читается, а затем закрывается.

Должен ли я быть обеспокоен?

Это, кстати, не имеет значения. Мой gnome-terminalделает то же самое. Поток вещей может быть немного запутанным, но Konsole запрашивает у системы информацию. В этом случае что-то вроде домашнего каталога пользователя.

Таким образом, система выполняет вызов в NSS (файл конфигурации Name Service Switch):

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

В этом файле есть строка, а именно эта строка:

passwd:     files

Эта строка сообщает NSS, где находится «база данных» «passwd». Эта строка сообщает NSS, что ресурс находится в файлах. Таким образом, система открывает /etc/passwdфайл для поиска домашнего каталога пользователя.

ПРИМЕЧАНИЕ: Копание дальше, похоже, вызвано Bash. Выполнение straceтолько что Bash показывает то же самое.

$ strace -s 2000 -o bash.log bash

Дальнейшие чтения

Если вы действительно заинтересованы в том, как работает NSS, обратитесь к справочным страницам nsswitch.confи nss. 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.
SLM
источник
1
Это не /etc/nsswitch.confвызывает загрузку /etc/passwd, скорее наоборот. Konsole хочет получить некоторую информацию об учетных записях пользователей, поэтому он открывает /etc/nsswitch.conf(внутри кода libc, а не внутри кода из источника Konsole), в которых находятся учетные записи пользователей /etc/passwd.
Жиль "ТАК - перестать быть злым"
@ Жиль - Хорошо, я перефразирую эту часть, спасибо.
SLM
@ Жиль - обновлено.
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: предоставлять такие переводы для совершенно мирских целей.

Поиск имен пользователей представляет собой не большую проблему безопасности, чем вызов localtime, так что lsвы можете указать «14 января 2013» о времени изменения файла. Как отметил slm , нет причин оставлять файл открытым, поэтому он закрывается, как только его содержимое читается.

Файл /etc/passwdизначально содержал хешированные пароли в более простые времена. Хеши паролей были перемещены, и /etc/shadowобычные пользователи не могут их прочитать, потому что это была дыра в безопасности. Имя /etc/passwdосталось прежним, но теперь содержится xв бывшем поле хэша пароля, которое не является действительным хэшем для любого пароля.

MSW
источник