On Tue, Jan 17, 2023 at 04:23:48PM -0500, Bryan Steele wrote:
> On Tue, Jan 17, 2023 at 09:37:24PM +0100, Jan Klemkow wrote:
> > Hi,
> >
> > This diff adjust the manpage of mem(4) to be more accurate. You can
> > open(2) mem(4) in securelevel 1 in readonly mode, but not writable.
> >
> > kern/spec_vnops.c:
> >
> > if (ap->a_cred != FSCRED && (ap->a_mode & FWRITE)) {
> > ...
> > /*
> > * When running in secure mode, do not allow opens
> > * for writing of /dev/mem, /dev/kmem, or character
> > * devices whose corresponding block devices are
> > * currently mounted.
> > */
> > if (securelevel >= 1) {
> > ...
> > if (iskmemdev(dev))
> > return (EPERM);
> > }
> > }
> >
> > OK?
> >
> > bye,
> > Jan
>
> Are you sure about that? Have you tested it?
>
> https://github.com/openbsd/src/commit/19aedf236181e81baf170421900911c82671fae4
at least this tool works for me:
#include <err.h>
#include <fcntl.h>
#include <limits.h>
#include <paths.h>
#include <stdio.h>
#include <stdlib.h>
#include <kvm.h>
int
main(void)
{
kvm_t *kd;
int mem;
struct nlist nl[] = {
{"_ix_debug_ioctl"},
{NULL}
};
char errbuf[_POSIX2_LINE_MAX];
if ((kd = kvm_open(_PATH_KSYMS, NULL, NULL, O_RDWR, errbuf)) == NULL)
errx(EXIT_FAILURE, "%s", errbuf);
if (kvm_nlist(kd, nl) == -1)
errx(EXIT_SUCCESS, "%s", kvm_geterr(kd));
if (kvm_read(kd, nl[0].n_value, &mem, sizeof mem) != sizeof(mem))
errx(EXIT_SUCCESS, "%s", kvm_geterr(kd));
printf("mem: %d\n", mem);
mem = 1;
if (kvm_write(kd, nl[0].n_value, &mem, sizeof mem) != sizeof(mem))
errx(EXIT_SUCCESS, "%s", kvm_geterr(kd));
if (kvm_close(kd) == -1)
err(EXIT_FAILURE, "kvm_close");
return EXIT_SUCCESS;
}