Platforms offer varying security features; we'd like to support the best.

This is a document that notes which security hardening we have implemented and
which things we'd like to see implemented for various platforms. We
specifically address exploitation mitigation and containment; security issues
such as x509 certification validation are not addressed here, yet. Patches,
suggestions and improvements are welcome! We always want the strongest set of
options by default on each supported platform.

We attempt to use the C programming language correctly and in a standard way.
We do however use some compiler specific options such as defining integer
wrapping because we believe the practical benefit outweights the implied risks.
As such, we prefer to be explicit rather than implicit in our casting or other
possible ambiguity.

We should treat all compiler and linker warnings as fatal errors. Currently,
consider autotools warnings to be an exception as we would like to support
platforms imperfectly rather than not at all. We generally wish to support
autotools bootstrapping on all of our supported platforms. This is not possible
on Plan 9. Currently autotools will complain on the BSD systems.

On all platforms we attempt to support available compiler hardening and linking
options. Please do not disable these options. Additional compiler and linker
hardening options are welcome and the current options are implemented in the
following file:

  configure.ac

On all platforms, we attempt to switch from the administrative user to an
unimportant role account which shares data with no other processes. If we start
as any user other than an administrative user, we will likely be unable to
switch to our normal unprivileged account. These users are defined at
`configure` time. It is most effective if such a user is not the traditional
'nobody' or group 'nogroup' as is often the tradition.

In addition to the above hardening options, we have tried to extend our
hardening when the platform supports it. Each additional security measure that
we take is documented as well as planned or desired improvements.

We do not currently support or set ulimits, we should do so where possible.

On Debian Gnu/Linux platforms, we ship with a minimal AppArmor profile, see
the policy for details:

  apparmor-profile

We'd like to have an SELinux policy specifically for tlsdate.
We'd like to support capability dropping with libcap or libcap-ng.
We'd like to support libseccomp2 filters.
Other kernel hardening suggestions are welcome.

On ChromeOS we use minijail and seccomp filters, see the following policies for
details:

  tlsdate-seccomp-amd64.policy
  tlsdate-seccomp-arm.policy
  tlsdate-seccomp-x86.policy

These are enabled by default in ChromeOS.

On FreeBSD, we'd like to support jails, chroot, and Capsicum.

On OpenBSD, we'd like to support chroot and systrace.

On NetBSD, we'd like to chroot.

On DragonFly BSD, we'd like to support chroot and jails.

On Mac OS X, we'd like to support chroot and seatbelt.

On Plan9, we'd like to chroot.

On Windows, we do nothing beyond compile time hardening. We'd like to do more.

On other platforms, we'll try to run correctly with the understanding that any
bug is likely a much more serious problem.
