Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
MITIGATIONS(7)		Miscellaneous Information Manual	MITIGATIONS(7)

NAME
       mitigations -- FreeBSD Security Vulnerability Mitigations

SYNOPSIS
       In  FreeBSD, various security mitigations are employed to limit the im-
       pact of vulnerabilities and protect the system from malicious  attacks.
       Some  of	 these	mitigations have run-time controls to enable them on a
       global or per-process basis, some are optionally	enabled	or disabled at
       compile time, and some are inherent to the implementation and  have  no
       controls.

       The following vulnerability mitigations are covered in this document:

          Address Space Layout	Randomization (ASLR)
          Position Independent	Executable (PIE)
          Write XOR Execute page protection policy
          PROT_MAX
          Relocation Read-Only	(RELRO)
          Bind	Now
          Stack Overflow Protection
          Supervisor Mode Memory Protection
          Capsicum
          Firmware and	Microcode
          Architectural Vulnerability Mitigations

       Please  note  that  the effectiveness and availability of these mitiga-
       tions may vary depending	on the FreeBSD version and  system  configura-
       tion.

DESCRIPTION
       Security	 vulnerability	mitigations are	techniques employed in FreeBSD
       to limit	the potential impact of	security vulnerabilities  in  software
       and  hardware.	It  is essential to understand that mitigations	do not
       directly	address	the underlying security	issues.	 They are not  a  sub-
       stitute	for  secure  coding  practices.	 Mitigations serve as an addi-
       tional layer of defense,	helping	to reduce the likelihood of a success-
       ful exploitation	of vulnerabilities by making it	more difficult for at-
       tackers to achieve their	objectives.

       This manual page	describes  the	security  mitigations  implemented  in
       FreeBSD	to enhance the overall security	of the operating system.  Each
       mitigation is designed to protect against specific types	of attacks and
       vulnerabilities.

SOFTWARE VULNERABILITY MITIGATIONS
   Address Space Layout	Randomization (ASLR)
       Address Space Layout Randomization  (ASLR)  is  a  security  mitigation
       technique  that	works by randomizing the memory	addresses where	system
       and application code, data, and libraries are loaded,  making  it  more
       challenging for attackers to predict the	memory layout and exploit vul-
       nerabilities.

       ASLR introduces randomness into the memory layout during	process	execu-
       tion,  reducing	the  predictability  of	memory addresses.  ASLR	is in-
       tended to make exploitation more	difficult in the  event	 that  an  at-
       tacker discovers	a software vulnerability, such as a buffer overflow.

       ASLR  can  be  enabled  on both a global	and per-process	basis.	Global
       control is provided by a	separate set of	sysctl(8) knobs	 for  32-  and
       64-bit  processes.   It	can  be	or disabled on a per-process basis via
       proccontrol(1).	Note that an ASLR mode change takes  effect  upon  ad-
       dress space change, i.e., upon execve(2).

       Global controls for 32-bit processes:

       kern.elf32.aslr.enable	   Enable  ASLR	for 32-bit ELF binaries, other
				   than	Position Independent Exectutable (PIE)
				   binaries.

       kern.elf32.aslr.pie_enable  Enable ASLR for 32-bit Position Independent
				   Executable (PIE) ELF	binaries.

       kern.elf32.aslr.honor_sbrk  Reserve the legacy sbrk(2) region for  com-
				   patibility with older binaries.

       kern.elf32.aslr.stack	   Randomize the stack location	for 32-bit ELF
				   binaries.

       Global controls for 64-bit processes:

       kern.elf64.aslr.enable	   Enable  ASLR	for 64-bit ELF binaries, other
				   than	Position Independent Exectutable (PIE)
				   binaries.

       kern.elf64.aslr.pie_enable  Enable ASLR for 64-bit Position Independent
				   Executable (PIE) ELF	binaries.

       kern.elf64.aslr.honor_sbrk  Reserve the legacy sbrk(2) region for  com-
				   patibility with older binaries.

       kern.elf64.aslr.stack	   Randomize the stack location	for 64-bit ELF
				   binaries.

       To execute a command with ASLR enabled or disabled:

       proccontrol -m aslr [-s enable |	disable] command

   Position Independent	Executable (PIE)
       PIE  binaries  are  executable  files that do not have a	fixed load ad-
       dress.  They can	be loaded  at  an  arbitrary  memory  address  by  the
       rtld(1) run-time	linker.	 With ASLR they	are loaded at a	random address
       on each execution.

   Write XOR Execute page protection policy
       Write  XOR  Execute  (W^X)  is a	vulnerability mitigation strategy that
       strengthens the security	of the system  by  controlling	memory	access
       permissions.

       Under  the  W^X	mitigation,  memory  pages may be writable (W) or exe-
       cutable (E), but	not both at the	same time.  This means that code  exe-
       cution is prevented in areas of memory that are designated as writable,
       and writing or modification of memory is	restricted in areas marked for
       execution.   Applications  that	perform	Just In	Time (JIT) compilation
       need to be adapted to be	compatible with	W^X.

       There are separate sysctl(8) knobs to control  W^X  policy  enforcement
       for 32- and 64-bit processes.  The W^X policy is	enabled	by setting the
       appropriate allow_wx sysctl to 0.

       kern.elf32.allow_wx  Allow 32-bit processes to map pages	simultaneously
			    writable and executable.

       kern.elf64.allow_wx  Allow 64-bit processes to map pages	simultaneously
			    writable and executable.

   PROT_MAX
       PROT_MAX	is a FreeBSD-specific extension	to mmap(2).  PROT_MAX provides
       the  ability  to	 set  the  maximum protection of a region allocated by
       mmap(2) and later altered by mprotect(2).  For  example,	 memory	 allo-
       cated  originally  with	an  mmap prot argument of PROT_MAX(PROT_READ |
       PROT_WRITE) | PROT_READ may be made writable by	a  future  mprotect(2)
       call, but may not be made executable.

   Relocation Read-Only	(RELRO)
       Relocation  Read-Only  (RELRO)  is a mitigation tool that makes certain
       portions	of a program's address space that contain ELF  metadata	 read-
       only, after relocation processing by rtld(1).

       When  enabled in	isolation the RELRO option provides partial RELRO sup-
       port.  In this case the Procedure Linkage Table (PLT)-related  part  of
       the Global Offset Table (GOT) (in the section typically named .got.plt)
       remains writable.

       RELRO  is  enabled  by  default.	  The  src.conf(5)  build-time	option
       WITHOUT_RELRO may be used to disable it.

   BIND_NOW
       The WITH_BIND_NOW src.conf(5) build-time	option causes binaries	to  be
       built  with the DF_BIND_NOW flag	set.  The run-time loader rtld(1) will
       then perform all	relocation processing when the process starts, instead
       of on demand (on	the first access to each symbol).

       When enabled in combination with	RELRO (which is	 enabled  by  default)
       this  provides full RELRO.  The entire GOT (.got	and .got.plt) are made
       read-only at program startup, preventing	attacks	on the relocation  ta-
       ble.  Note that this results in a nonstandard Application Binary	Inter-
       face  (ABI), and	it is possible that some applications may not function
       correctly.

   Stack Overflow Protection
       FreeBSD supports	stack overflow protection  using  the  Stack  Smashing
       Protector  (SSP)	compiler feature.  In userland,	SSP adds a per-process
       randomized canary at the	end of every stack frame which is checked  for
       corruption upon return from the function.  In the kernel, a single ran-
       domized	canary	is  used  globally  except  on	aarch64,  which	 has a
       PERTHREAD_SSP config(8) option  to  enable  per-thread  randomized  ca-
       naries.	 If  stack  corruption is detected, then the process aborts to
       avoid potentially malicious execution as	a result  of  the  corruption.
       SSP  may	 be  enabled  or  disabled when	building FreeBSD base with the
       src.conf(5) SSP knob.

       When WITH_SSP is	enabled, which is the default, world is	built with the
       -fstack-protector-strong	compiler option.  The kernel is	built with the
       -fstack-protector option.

       In addition to SSP, a "FORTIFY_SOURCE" implementation is	 supported  up
       to  level  2 by defining	_FORTIFY_SOURCE	to 1 or	2 before including any
       FreeBSD headers.	 FreeBSD world builds can set FORTIFY_SOURCE  to  pro-
       vide    a   default   value   for   _FORTIFY_SOURCE.    When   enabled,
       "FORTIFY_SOURCE"	enables	extra bounds  checking	in  various  functions
       that accept buffers to be written into.	These functions	currently have
       extra bounds checking support:

	     bcopy()	  bzero()     fgets()	  getcwd()	gets()
	     memcpy()	  memmove()   memset()	  read()	readlink()
	     snprintf()	  sprintf()   stpcpy()	  stpncpy()	strcat()
	     strcpy()	  strncat()   strncpy()	  vsnprintf()	vsprintf()

       "FORTIFY_SOURCE"	 requires  compiler  support  from clang(1) or gcc(1),
       which provide the __builtin_object_size(3) function that	is used	to de-
       termine the bounds of an	object.	 This feature works best at  optimiza-
       tion  levels  -O1  and  above, as some object sizes may be less obvious
       without some data that the compiler would collect  in  an  optimization
       pass.

       Similar	to  SSP, violating the bounds of an object will	cause the pro-
       gram to abort in	an effort to avoid malicious execution.	  This	effec-
       tively  provides	 finer-grained	protection  than SSP for some class of
       function	and system calls, along	with some protection for buffers allo-
       cated as	part of	the program data.

   Supervisor mode memory protection
       Certain processors include features that	prevent	unintended  access  to
       memory  pages accessible	to userspace (non-privileged) code, while in a
       privileged mode.	 One feature prevents execution, intended to  mitigate
       exploitation  of	kernel vulnerabilities from userland.  Another feature
       prevents	unintended reads from or writes	to user	space memory from  the
       kernel.	 This  also provides effective protection against NULL pointer
       dereferences from kernel.

	     Architecture    Feature	Access Type Prevented
	     amd64	     SMAP	Read / Write
	     amd64	     SMEP	Execute
	     arm64	     PAN	Read / Write
	     arm64	     PXN	Execute
	     riscv	     SUM	Read / Write
	     riscv	     -		Execute

       These features are automatically	used by	the kernel.  There is no user-
       facing configuration.

   Capsicum
       Capsicum	is a lightweight OS capability	and  sandbox  framework.   See
       capsicum(4) for more information.

HARDWARE VULNERABILITY MITIGATIONS
   Firmware and	Microcode
       Recent  years have seen an unending stream of new hardware vulnerabili-
       ties, notably CPU ones generally	caused	by  detectable	microarchitec-
       tural  side-effects  of	speculative  execution which leak private data
       from some other thread or process or sometimes even internal CPU	 state
       that  is	normally inaccessible.	Hardware vendors usually address these
       vulnerabilities as they are discovered by releasing microcode  updates,
       which  may then be bundled into platform	firmware updates (historically
       called BIOS updates for PCs) or packages	to be updated by the operating
       system at boot time.

       Platform	firmware updates, if available from the	manufacturer, are  the
       best  defense as	they provide coverage during early boot.  Install them
       with sysutils/flashrom from the FreeBSD Ports Collection.

       If platform firmware updates are	no longer available, packaged  microc-
       ode  is available for installation at sysutils/cpu-microcode and	can be
       loaded at runtime using loader.conf(5), see  the	 package  message  for
       more details.

       The  best defense overall against hardware vulnerabilities is to	timely
       apply these updates when	available, as early as possible	 in  the  boot
       process,	and to disable the affected hardware's problematic functional-
       ities when possible (e.g., CPU Simultaneous Multi-Threading).  Software
       mitigations  are	 only  partial	substitutes for	these, but they	can be
       helpful on out-of-support hardware or as	complements  for  just-discov-
       ered vulnerabilities not	yet addressed by vendors.  Some	software miti-
       gations depend on hardware capabilities provided	by a microcode update.

   Architectural Vulnerability Mitigations
       FreeBSD's  usual	policy is to apply by default all OS-level mitigations
       that do not require recompilation, except those the particular hardware
       it is running on	is known not to	 be  vulnerable	 to  (which  sometimes
       requires	 firmware updates), or those that are extremely	detrimental to
       performance in proportion to the	protection they	actually provide.  OS-
       level mitigations generally can have noticeable performance impacts  on
       specific	 workloads.   If  your threat model allows it, you may want to
       try disabling some of them in order to possibly get better performance.
       Conversely, minimizing the risks	may require you	to  explicitly	enable
       the most	expensive ones.	 The description of each vulnerability/mitiga-
       tion  indicates	whether	it is enabled or disabled by default and under
       which conditions.  It also lists	the knobs to tweak to force a particu-
       lar status.

   Zenbleed
       The "Zenbleed" vulnerability exclusively	affects	AMD  processors	 based
       on  the	Zen2  microarchitecture.  In contrast with, e.g., Meltdown and
       the different variants of Spectre, which	leak data by leaving  microar-
       chitectural  traces,  Zenbleed  is a genuine hardware bug affecting the
       CPU's architectural state.  With	particular sequences  of  instructions
       whose last ones are mispredicted	by speculative execution, it is	possi-
       ble  to	make appear in an XMM register data previously put in some XMM
       register	by some	preceding or concurrent	task  executing	 on  the  same
       physical	 core (disabling Simultaneous Muti-Threading (SMT) is thus not
       a sufficient protection).

       According to the	vulnerability's	discoverer, all	Zen2-based  processors
       are affected (see https://lock.cmpxchg8b.com/zenbleed.html).  As	of Au-
       gust 2023, AMD has not publicly listed any corresponding	errata but has
       issued	a  security  bulletin  (AMD-SB-7008)  entitled	"Cross-Process
       Information Leak" indicating that platform firmware fixing the vulnera-
       bility will be distributed to manufacturers no sooner than the  end  of
       2023, except for	Rome processors	for which it is	already	available.  No
       standalone  CPU	microcodes have	been announced so far.	The only read-
       ily-applicable fix mentioned by the discoverer is to set	a  bit	of  an
       undocumented MSR, which reportedly completely stops XMM register	leaks.

       FreeBSD	currently sets this bit	by default on all Zen2 processors.  In
       the future, it might set	it by default only on  those  Zen2  processors
       whose  microcode	 has not been updated to revisions fixing the vulnera-
       bility, once such microcode updates have	 been  actually	 released  and
       community-tested.   To  this  mitigation	 are  associated the following
       knobs:

       machdep.mitigations.zenbleed.enable
	       A read-write integer tunable and	sysctl indicating whether  the
	       mitigation  should  be forcibly disabled	(0), enabled (1) or if
	       it is left to FreeBSD to	selectively apply it (2).   Any	 other
	       integer	value is silently converted to and treated as value 2.
	       Note that this setting is silently ignored when running on non-
	       Zen2 processors to ease applying	a common configuration to het-
	       erogeneous machines.

       machdep.mitigations.zenbleed.state
	       A read-only string indicating the current mitigation state.  It
	       can be  either  "Not  applicable",  if  the  processor  is  not
	       Zen2-based,  "Mitigation	 enabled"  or  "Mitigation  disabled".
	       This state  is  automatically  updated  each  time  the	sysctl
	       machdep.mitigations.zenbleed.enable  is	written	to.  Note that
	       it can become inaccurate	if the chicken bit is set  or  cleared
	       directly	  via  cpuctl(4)  (which  includes  the	 cpucontrol(8)
	       utility).

       The performance impact and threat models	related	to  these  mitigations
       should  be  considered when configuring and deploying them in a FreeBSD
       system.

       Additional mitigation knobs are listed in the "KNOBS AND	 TWEAKS"  sec-
       tion of security(7).

SEE ALSO
       elfctl(1),     proccontrol(1),	  rtld(1),    mmap(2),	  src.conf(5),
       sysctl.conf(5), security(7), cpucontrol(8), sysctl(8)

FreeBSD	14.3			 June 1, 2024			MITIGATIONS(7)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=mitigations&manpath=FreeBSD+14.3-RELEASE+and+Ports>

home | help