Ricardo Mestre (2017-07-04 18:22 +0200):
> What about applying the pledge early on only if snaplen is not being defined,
> but if it is then call pledge as well but only after the filter is applied
> (this is where the offending ioctl is called)?
I think there are two problems with this approach:
- It doesn't cover the case where -s has not been used, but the logfile
does have a nonstandard snaplen.
- If the logfile has a different snaplen, then the snaplen will have to
be changed for a second time later on, when the logfile has been
rotated. But at that point pledge has already been called.
> A better strategy probably would involve something similar to tcpdump to check
> if PRIV_INIT_DONE was reached and only apply the single pledge there, but that
> involves quite some restructure. So is the below OK? If not then the best for
> now is to put back the pledge inside #if 0.
>
> Index: pflogd.c
> ===================================================================
> RCS file: /cvs/src/sbin/pflogd/pflogd.c,v
> retrieving revision 1.53
> diff -u -p -u -r1.53 pflogd.c
> --- pflogd.c 16 Jan 2016 03:17:48 -0000 1.53
> +++ pflogd.c 4 Jul 2017 16:10:51 -0000
> @@ -557,6 +557,7 @@ main(int argc, char **argv)
> const char *errstr = NULL;
>
> ret = 0;
> + setsnaplen = 0;
>
> closefrom(STDERR_FILENO + 1);
>
> @@ -583,6 +584,7 @@ main(int argc, char **argv)
> snaplen = DEF_SNAPLEN;
> if (errstr)
> snaplen = PFLOGD_MAXSNAPLEN;
> + setsnaplen = 1;
> break;
> case 'x':
> Xflag = 1;
> Index: pflogd.h
> ===================================================================
> RCS file: /cvs/src/sbin/pflogd/pflogd.h,v
> retrieving revision 1.5
> diff -u -p -u -r1.5 pflogd.h
> --- pflogd.h 10 Oct 2015 22:36:06 -0000 1.5
> +++ pflogd.h 4 Jul 2017 16:10:51 -0000
> @@ -47,3 +47,4 @@ void send_fd(int, int);
> int receive_fd(int);
>
> extern int Debug;
> +int setsnaplen;
> Index: privsep.c
> ===================================================================
> RCS file: /cvs/src/sbin/pflogd/privsep.c,v
> retrieving revision 1.25
> diff -u -p -u -r1.25 privsep.c
> --- privsep.c 12 Jun 2017 23:37:44 -0000 1.25
> +++ privsep.c 4 Jul 2017 16:10:51 -0000
> @@ -118,8 +118,10 @@ priv_init(void)
> setproctitle("[priv]");
> close(socks[1]);
>
> - if (pledge("stdio rpath wpath cpath sendfd proc bpf", NULL) == -1)
> - err(1, "pledge");
> + if (setsnaplen == 0) {
> + if (pledge("stdio rpath wpath cpath sendfd proc bpf", NULL) ==
> -1)
> + err(1, "pledge");
> + }
>
> while (!gotsig_chld) {
> if (may_read(socks[0], &cmd, sizeof(int)))
> @@ -185,6 +187,9 @@ set_snaplen(int snap)
>
> hpcap->snapshot = snap;
> set_pcap_filter();
> +
> + if (pledge("stdio rpath wpath cpath sendfd proc bpf", NULL) == -1)
> + err(1, "pledge");
>
> return 0;
> }