On Thu, Jul 08, 2021 at 02:12:37PM +0100, Ricardo Mestre wrote:
> my eyes may be tricking me, but it looks like the main proc doesn't speak with
> sockets during the main loop and setpriority plus privdrop at this point are 
> all
> set and done so pledge("inet id") are not required.
> 
> I have it running for a couple of hours now without issues so far so is this
> change also OK?

No problems on my side either with default ntpd.conf(5).

These promises where introduced by

        revision 1.98
        date: 2015/10/23 16:39:13;  author: deraadt;  state: Exp;  lines: +28 
-22;
        Rather than re-opening the driftfile to write, keep it open; rewinding
        and coping with error conditions... that lets us avoid a pledge "wpath".

        Putting it all together, this lets the master ntpd pledge "stdio rpath
        inet settime proc id".  It works like this: "rpath" to load the
        certificates, "proc" to create constraint processes, "id" to chroot
        and lock the constraint processes into a jail, then "inet" to open a
        https session.  "settime" is used by the master to manage the system
        time when the ntp-speaking engine instructs the master.

But reading the code NOW shows no path (to me) that would require "inet"
for the parent:  ntp and dns engines take care of "inet" and "dns"
respectively.

I *think* the very next commit obsoleted "id" as the parent's main()
became the only place ntpd gets user data;  the chroot(2) situation back
then might have still required "id", but I didn't check on that too
closely (the fork/exec model was also different).

        revision 1.99
        date: 2015/11/24 01:03:25;  author: deraadt;  state: Exp;  lines: +15 
-6;
        Cache values from getpwnam() done at initialization, which need to be
        used by the constraint processes setup later (chroot, setuid...)
        [late getpwnam discovered during a further audit]
        ok millert

Now chroot is done only by the children, not the parent process, all
after fork/exec and before their own pledge.

Likewise, the parent process does not drop privileges (only priority)
after pledge;  children/engines do, so again not effected by the
parent's "id" promise.

> whole diff included, but if this is also OK I'll split them in 2 commits.

Yes, please.
OK kn

> Index: ntpd.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/ntpd/ntpd.c,v
> retrieving revision 1.129
> diff -u -p -u -r1.129 ntpd.c
> --- ntpd.c    12 Feb 2020 19:14:56 -0000      1.129
> +++ ntpd.c    8 Jul 2021 10:58:59 -0000
> @@ -283,11 +283,9 @@ main(int argc, char *argv[])
>        * Constraint processes are forked with certificates in memory,
>        * then privdrop into chroot before speaking to the outside world.
>        */
> -     if (unveil(tls_default_ca_cert_file(), "r") == -1)
> -             err(1, "unveil");
>       if (unveil("/usr/sbin/ntpd", "x") == -1)
>               err(1, "unveil");
> -     if (pledge("stdio rpath inet settime proc exec id", NULL) == -1)
> +     if (pledge("stdio settime proc exec", NULL) == -1)
>               err(1, "pledge");
>  
>       while (quit == 0) {

Reply via email to