Mengapa konsole membaca / etc / passwd?

8

Sehubungan dengan pertanyaan ini:

Saat mengamati perilaku fatrace, saya memperhatikan sesuatu yang mengkhawatirkan saya. Berikut adalah beberapa baris pertama dari perintah "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
...

Masalahnya adalah lsof | grep passwd menunjukkan bahwa passwd tidak terbuka oleh proses apa pun.

Jadi ada yang tahu apa yang sedang terjadi?

Mouse. Lucky. Dog
sumber
Mengapa itu menjadi masalah keamanan yang dibaca Konsole /etc/passwd? File ini berisi semua informasi tentang akun pengguna, termasuk direktori home dan shell.
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles: Anda menjawab pertanyaan Anda sendiri. :)
Evi1M4chine
Masalah keamanan: Tidak. Masalah kinerja: agak. Ada yang lama dilaporkan (2013) dan baru-baru ini diperbaiki (hulu, Agu 2016) Bug KDE tentang ini: bugs.kde.org/show_bug.cgi?id=325442
arielf

Jawaban:

9

Anda dapat membaca kode sumber; berbicara tentang ... Saya melakukannya untuk Anda; sepertinya itu dari ProcessInfo.cppfile. Itu mendapatkan nama pengguna. Tidak hanya itu /etc/passwdbukan masalah bagi Anda, siapa pun dapat membacanya. Anda mungkin khawatir jika itu mencoba membaca /etc/shadow.


sumber
2
Saya pikir pertanyaan yang lebih besar adalah: Mengapa tidak mendaftar? Mengapa konsole tidak hanya membaca / etc / paswd sekali? Juga mengapa konsole memerlukan daftar nama pengguna?
Mouse. Lucky .OG
8

Menggunakan straceAnda dapat melihat apa yang konsolesedang dilakukan.

$ 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 membaca konten /etc/passwddengan cukup cepat dan Anda tidak melihatnya lsof. Ini adalah masalah umum ketika file dibuka, dibaca dengan cepat, dan kemudian ditutup.

Haruskah saya khawatir?

Omong-omong, ini bukan masalah. Saya gnome-terminalmelakukan hal yang sama. Alur hal-hal dapat sedikit membingungkan tetapi Konsole meminta sistem untuk sepotong informasi. Dalam hal ini sesuatu seperti direktori home pengguna.

Jadi sistem membuat panggilan ke NSS (file konfigurasi Switch Layanan Nama):

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

Ada baris dalam file ini, khususnya baris ini:

passwd:     files

Baris ini memberitahu NSS di mana "database" 'passwd' dapat ditemukan. Baris ini memberi tahu NSS bahwa sumber daya terletak di file. Jadi sistem kemudian membuka /etc/passwdfile untuk mencari direktori home pengguna.

CATATAN: Menggali lebih jauh perilaku ini tampaknya disebabkan oleh Bash. Melakukan straceBash yang adil menunjukkan hal yang sama.

$ strace -s 2000 -o bash.log bash

Bacaan lebih lanjut

Jika Anda benar-benar tertarik dengan cara kerja NSS, bacalah halaman manual nsswitch.confdan nss. NSS bersifat modular dan dapat menggunakan teknologi backend yang berbeda untuk "databases" -nya.

Sebagai contoh:

       /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
sumber
1
Bukan itu /etc/nsswitch.confyang memicu pemuatan /etc/passwd, melainkan sebaliknya. Konsole ingin mendapatkan beberapa informasi tentang akun pengguna, sehingga terbuka /etc/nsswitch.conf, yang memberitahukannya (di dalam kode libc, bukan kode di dalam dari sumber Konsole) tempat akun pengguna itu berada /etc/passwd.
Gilles 'SO- stop being evil'
@Gilles - OK, saya akan menulis ulang bagian itu, terima kasih.
slm
@Gilles - diperbarui.
slm
7

Untuk alasan yang sama dengan ls -lmembaca / etc / passwd, itu adalah data yang mengaitkan UID dengan nama. Ketika lspanggilan stat(2)pada file itu mendapat UID numerik untuk pemilik file. Untuk menampilkan itu sebagai nama yang dapat dibaca manusia, perlu mencarinya di satu-satunya tempat yang memiliki asosiasi tersebut /etc/passwd,. Misalnya baris pertama tipikal /etc/passwdadalah

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

Ketika ls -l /etc/hostsperlu menghasilkan output

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

perlu menerjemahkan UID 0 menjadi "root" untuk itu sehingga memanggil rutin perpustakaan seperti getpwuid yang berbunyi /etc/passwduntuk menyediakan terjemahan. Itulah sebagian besar alasan yang /etc/passwdada: untuk menyediakan terjemahan semacam itu untuk tujuan yang sepenuhnya biasa.

Mencari nama pengguna hadiah tidak lebih dari masalah keamanan daripada menelepon localtime sehingga lsdapat memberitahu Anda "14 Jan 2013" untuk waktu modifikasi file. Seperti yang dicatat slm , tidak ada alasan untuk membiarkan file tetap terbuka, jadi ditutup segera setelah isinya dibaca.

File /etc/passwditu awalnya berisi kata sandi hash dalam waktu yang lebih sederhana. Hash kata sandi dipindahkan ke /etc/shadowmana pengguna biasa tidak bisa membaca karena itu adalah lubang keamanan. Nama /etc/passwdtetap sama tetapi sekarang berisi xdi bidang hash kata sandi sebelumnya yang bukan hash yang valid untuk kata sandi apa pun.

msw
sumber