Tại sao đọc konsole / etc / passwd?


8

Liên quan đến câu hỏi này:

Trong khi quan sát hành vi của fatrace, tôi nhận thấy điều gì đó liên quan đến tôi. Dưới đây là một vài dòng đầu ra của lệnh "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
...

Vấn đề là lsof | grep passwd cho thấy passwd không được mở bởi bất kỳ quy trình nào.

Vì vậy, bất kỳ ý tưởng những gì đang xảy ra?


Tại sao nó là một mối quan tâm bảo mật mà Konsole đọc từ /etc/passwd? Tệp này chứa tất cả thông tin về tài khoản người dùng, bao gồm thư mục chính và shell.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles: Bạn đã trả lời câu hỏi của riêng bạn. :)
Evi1M4chine

Mối quan tâm bảo mật: Không. Hiệu suất quan tâm: phần nào. Có một báo cáo dài (2013) và gần đây cố định (thượng nguồn, tháng 8 năm 2016) lỗi KDE về điều này: bugs.kde.org/show_bug.cgi?id=325442
arielf

Câu trả lời:


9

Bạn có thể đọc mã nguồn; nói về ... tôi đã làm điều đó cho bạn; có vẻ như nó từ ProcessInfo.cpptập tin. Đó là nhận được tên người dùng. Không chỉ đó /etc/passwdkhông phải là mối quan tâm của bạn, bất cứ ai cũng có thể đọc nó. Bạn có thể lo lắng mặc dù nếu nó đang cố đọc /etc/shadow.


2
Tôi nghĩ những câu hỏi lớn hơn là: Tại sao không đăng ký nó? Tại sao konsole chỉ đọc / etc / paswd một lần? Ngoài ra tại sao konsole cần một danh sách tên người dùng?
MouseThe.Lucky.Dog

8

Sử dụng stracebạn có thể thấy những gì konsoleđang lên đến.

$ 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 đang đọc nội dung /etc/passwdkhá nhanh và bạn không thấy nó lsof. Đây là một vấn đề điển hình khi một tệp được mở, đọc nhanh và sau đó đóng lại.

Tôi có nên quan tâm không?

Điều này, nhân tiện, không phải là mối quan tâm. My gnome-terminallàm điều tương tự. Dòng chảy của mọi thứ có thể hơi khó hiểu nhưng Konsole đang truy vấn hệ thống để lấy một phần thông tin. Trong trường hợp này một cái gì đó giống như thư mục nhà của người dùng.

Vì vậy, hệ thống thực hiện cuộc gọi đến NSS (tệp cấu hình Name Service Switch):

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

Có một dòng trong tệp này, cụ thể là dòng này:

passwd:     files

Dòng này cho NSS biết nơi "cơ sở dữ liệu" 'passwd' có thể được tìm thấy. Dòng này nói với NSS rằng tài nguyên được đặt trong các tệp. Vì vậy, hệ thống sau đó mở /etc/passwdtệp để tìm thư mục chính của người dùng.

LƯU Ý: Đào sâu hơn hành vi này dường như là do Bash. Làm một stracechỉ Bash cho thấy điều tương tự.

$ strace -s 2000 -o bash.log bash

Đọc thêm

Nếu bạn thực sự quan tâm đến cách thức hoạt động của NSS thì hãy tham khảo các trang hướng dẫn nsswitch.confnss. NSS là mô-đun và có thể sử dụng các công nghệ phụ trợ khác nhau cho "cơ sở dữ liệu" của nó.

Ví dụ:

       /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
Nó không phải /etc/nsswitch.conflà kích hoạt tải /etc/passwd, thay vì ngược lại. Konsole muốn có được một số thông tin về tài khoản người dùng, vì vậy nó sẽ mở ra /etc/nsswitch.conf, thông báo cho nó (bên trong mã libc, không phải mã bên trong từ nguồn Konsole) mà tài khoản người dùng đang ở /etc/passwd.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles - OK, tôi sẽ điều chỉnh lại phần đó, cảm ơn.
slm

@Gilles - cập nhật.
slm

7

Với cùng lý do ls -lđọc / etc / passwd, đó là dữ liệu liên kết UID với tên. Khi lsgọi stat(2)trên một tệp, nó nhận được một UID số cho chủ sở hữu của tệp. Để hiển thị tên đó có thể đọc được, con người cần tìm kiếm nó ở nơi duy nhất có các liên kết đó /etc/passwd. Ví dụ, một dòng đầu tiên điển hình trong /etc/passwd

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

Khi ls -l /etc/hostscần sản xuất đầu ra

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

nó cần dịch UID 0 thành "root" để nó gọi một thói quen thư viện như getpwuid đọc /etc/passwdđể cung cấp bản dịch. Đó là một phần lớn lý do /etc/passwdtồn tại: để cung cấp các bản dịch như vậy cho các mục đích hoàn toàn trần tục.

Nhìn lên tên người dùng những món quà không nhiều hơn một vấn đề an ninh vì gọi localtime để lscó thể nói với bạn "14 tháng 1 năm 2013" cho lần sửa đổi của tập tin. Như slm đã lưu ý, không có lý do gì để giữ tệp mở, vì vậy nó sẽ bị đóng ngay khi nội dung của nó được đọc.

Các tập tin /etc/passwdban đầu đã chứa mật khẩu băm trong thời gian đơn giản hơn. Các băm mật khẩu đã được chuyển đến /etc/shadowmà người dùng bình thường không thể đọc được vì đó là một lỗ hổng bảo mật. Tên /etc/passwdvẫn giữ nguyên nhưng bây giờ chứa xtrong trường băm mật khẩu trước đây không phải là hàm băm hợp lệ cho bất kỳ mật khẩu nào.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.