NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: bin/54971: sockstat command output incorrect for normal user
The following reply was made to PR bin/54971; it has been noted by GNATS.
From: scole_mail <scole_mail%gmx.com@localhost>
To: gnats-bugs%NetBSD.org@localhost
Cc:
Subject: Re: bin/54971: sockstat command output incorrect for normal user
Date: Mon, 24 Aug 2020 19:04:43 -0700
I've been looking into this a little and I believe it is permission
issue that changed between 8.0 and 9.0. I see a sysctl variable
kern.expose_address was added
https://nxr.netbsd.org/xref/src/sys/kern/kern_descrip.c#2342
to allow fstat/pstat -f/netstat to read kernel-protected addresses as a
normal user when enabled.
But sockstat still can't read those protected fields even with
kern.expose_address=3D1. I think there are at least 2 reasons.
1) Unlike the other *stat commands (fstat/netstat/pstat/...), sockstat
is not set-group-id-on-execution.
2) src/usr.bin/sockstat/sockstat.c is only using sysctls
(prog_sysctlnametomib & prog_sysctl) to populate its file structures,
and some fields (kinfo_file->ki_fdata) are unreadable, even with
kern.expose_address=3D1. For example, ki_fdata is always read as "0",
and since there is hash of sockets addresses used for displaying the
"PROTO LOCAL ADDRESS FOREIGN ADDRESS"
fields, it doesn't work correctly.
So I tried making sockstat match other permissions of
fstat/netstat/pstat:
-r-xr-sr-x 1 root kmem
That didn't work by itself, even when whole sockstat exe ran as
setegid(getegid()). But, if I do a call to kvm_open, don't even use the
descriptor, then close it (right after parsing input args):
// set-group-id-on-exec
kd =3D kvm_openfiles(NULL, NULL, NULL, O_RDONLY, buf);
if (kd =3D=3D NULL)
errx(1, "%s", buf);
kvm_close(kd);
// unset-group-id-on-exec
then the sysctl calls work correctly, and the sockstat program runs as
before
Is there "proper" way to give these sysctl's enough permissions to read
kernel addresses, or should sockstat really be using for kvm(3)?
Why does kvm_open/kvm_close/sysctl even work at all?
I know sysctl is only for live kernels, but I saw some of the other
*stat (pstat/fstat/...) use both sysctl and kvm, wouldn't it be easier
to maintain just to use only kvm?
This is was all tested on NetBSD 9.
Home |
Main Index |
Thread Index |
Old Index