On Wed, Aug 28, 2019 at 12:03:07PM -0600, Theo de Raadt wrote:
> ping and traceroute are setuid programs, so increased access-reduction
> features are worthwhile.
> 
> they can both lock their filesystem visibility to "readonly" very early on.
> 
> the attack model being prevented against is very obscure.  it imagines a
> bug in something between start-of-program and call-to-pledge (which
> entirely removes filesystem access).  implying a getaddrinfo related
> bug.  meanwhile, there is privdrop as another protection. 
> 
> these still feel like improvements.

I think so too. Restricting filesystem access early here only helps.

OK brynet@

> Index: usr.sbin/traceroute/traceroute.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/traceroute/traceroute.c,v
> retrieving revision 1.161
> diff -u -p -u -r1.161 traceroute.c
> --- usr.sbin/traceroute/traceroute.c  28 Jun 2019 13:32:51 -0000      1.161
> +++ usr.sbin/traceroute/traceroute.c  27 Aug 2019 17:56:56 -0000
> @@ -327,6 +327,12 @@ main(int argc, char *argv[])
>       uid_t            ouid, uid;
>       gid_t            gid;
>  
> +     /* Cannot pledge due to special setsockopt()s below */
> +     if (unveil("/", "r") == -1)
> +             err(1, "unveil");
> +     if (unveil(NULL, NULL) == -1)
> +             err(1, "unveil");
> +
>       if ((conf = calloc(1, sizeof(*conf))) == NULL)
>               err(1,NULL);
>  
> Index: sbin/ping/ping.c
> ===================================================================
> RCS file: /cvs/src/sbin/ping/ping.c,v
> retrieving revision 1.237
> diff -u -p -u -r1.237 ping.c
> --- sbin/ping/ping.c  20 Jul 2019 00:49:54 -0000      1.237
> +++ sbin/ping/ping.c  27 Aug 2019 17:56:17 -0000
> @@ -264,6 +264,12 @@ main(int argc, char *argv[])
>       u_int rtableid = 0;
>       extern char *__progname;
>  
> +     /* Cannot pledge due to special setsockopt()s below */
> +     if (unveil("/", "r") == -1)
> +             err(1, "unveil");
> +     if (unveil(NULL, NULL) == -1)
> +             err(1, "unveil");
> +
>       if (strcmp("ping6", __progname) == 0) {
>               v6flag = 1;
>               maxpayload = MAXPAYLOAD6;
> 
> 

Reply via email to