Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / clang / docs / ShadowCallStack.rst
blob04c04d259d7dc6f21ddddba795ede5abf793df47
1 ===============
2 ShadowCallStack
3 ===============
5 .. contents::
6    :local:
8 Introduction
9 ============
11 ShadowCallStack is an instrumentation pass, currently only implemented for
12 aarch64, that protects programs against return address overwrites
13 (e.g. stack buffer overflows.) It works by saving a function's return address
14 to a separately allocated 'shadow call stack' in the function prolog in
15 non-leaf functions and loading the return address from the shadow call stack
16 in the function epilog. The return address is also stored on the regular stack
17 for compatibility with unwinders, but is otherwise unused.
19 The aarch64 implementation is considered production ready, and
20 an `implementation of the runtime`_ has been added to Android's libc
21 (bionic). An x86_64 implementation was evaluated using Chromium and was found
22 to have critical performance and security deficiencies--it was removed in
23 LLVM 9.0. Details on the x86_64 implementation can be found in the
24 `Clang 7.0.1 documentation`_.
26 .. _`implementation of the runtime`: https://android.googlesource.com/platform/bionic/+/808d176e7e0dd727c7f929622ec017f6e065c582/libc/bionic/pthread_create.cpp#128
27 .. _`Clang 7.0.1 documentation`: https://releases.llvm.org/7.0.1/tools/clang/docs/ShadowCallStack.html
29 Comparison
30 ----------
32 To optimize for memory consumption and cache locality, the shadow call
33 stack stores only an array of return addresses. This is in contrast to other
34 schemes, like :doc:`SafeStack`, that mirror the entire stack and trade-off
35 consuming more memory for shorter function prologs and epilogs with fewer
36 memory accesses.
38 `Return Flow Guard`_ is a pure software implementation of shadow call stacks
39 on x86_64. Like the previous implementation of ShadowCallStack on x86_64, it is
40 inherently racy due to the architecture's use of the stack for calls and
41 returns.
43 Intel `Control-flow Enforcement Technology`_ (CET) is a proposed hardware
44 extension that would add native support to use a shadow stack to store/check
45 return addresses at call/return time. Being a hardware implementation, it
46 would not suffer from race conditions and would not incur the overhead of
47 function instrumentation, but it does require operating system support.
49 .. _`Return Flow Guard`: https://xlab.tencent.com/en/2016/11/02/return-flow-guard/
50 .. _`Control-flow Enforcement Technology`: https://software.intel.com/sites/default/files/managed/4d/2a/control-flow-enforcement-technology-preview.pdf
52 Compatibility
53 -------------
55 A runtime is not provided in compiler-rt so one must be provided by the
56 compiled application or the operating system. Integrating the runtime into
57 the operating system should be preferred since otherwise all thread creation
58 and destruction would need to be intercepted by the application.
60 The instrumentation makes use of the platform register ``x18`` on AArch64 and
61 ``x3`` (``gp``) on RISC-V. For simplicity we will refer to this as the
62 ``SCSReg``. On some platforms, ``SCSReg`` is reserved, and on others, it is
63 designated as a scratch register.  This generally means that any code that may
64 run on the same thread as code compiled with ShadowCallStack must either target
65 one of the platforms whose ABI reserves ``SCSReg`` (currently Android, Darwin,
66 Fuchsia and Windows) or be compiled with a flag to reserve that register (e.g.,
67 ``-ffixed-x18``). If absolutely necessary, code compiled without reserving the
68 register may be run on the same thread as code that uses ShadowCallStack by
69 saving the register value temporarily on the stack (`example in Android`_) but
70 this should be done with care since it risks leaking the shadow call stack
71 address.
73 .. _`example in Android`: https://android-review.googlesource.com/c/platform/frameworks/base/+/803717
75 Because it requires a dedicated register, the ShadowCallStack feature is
76 incompatible with any other feature that may use ``SCSReg``. However, there is
77 no inherent reason why ShadowCallStack needs to use a specific register; in
78 principle, a platform could choose to reserve and use another register for
79 ShadowCallStack, but this would be incompatible with the ABI standards
80 published in AAPCS64 and the RISC-V psABI.
82 Special unwind information is required on functions that are compiled
83 with ShadowCallStack and that may be unwound, i.e. functions compiled with
84 ``-fexceptions`` (which is the default in C++). Some unwinders (such as the
85 libgcc 4.9 unwinder) do not understand this unwind info and will segfault
86 when encountering it. LLVM libunwind processes this unwind info correctly,
87 however. This means that if exceptions are used together with ShadowCallStack,
88 the program must use a compatible unwinder.
90 Security
91 ========
93 ShadowCallStack is intended to be a stronger alternative to
94 ``-fstack-protector``. It protects from non-linear overflows and arbitrary
95 memory writes to the return address slot.
97 The instrumentation makes use of the ``SCSReg`` register to reference the shadow
98 call stack, meaning that references to the shadow call stack do not have
99 to be stored in memory. This makes it possible to implement a runtime that
100 avoids exposing the address of the shadow call stack to attackers that can
101 read arbitrary memory. However, attackers could still try to exploit side
102 channels exposed by the operating system `[1]`_ `[2]`_ or processor `[3]`_
103 to discover the address of the shadow call stack.
105 .. _`[1]`: https://eyalitkin.wordpress.com/2017/09/01/cartography-lighting-up-the-shadows/
106 .. _`[2]`: https://www.blackhat.com/docs/eu-16/materials/eu-16-Goktas-Bypassing-Clangs-SafeStack.pdf
107 .. _`[3]`: https://www.vusec.net/projects/anc/
109 Unless care is taken when allocating the shadow call stack, it may be
110 possible for an attacker to guess its address using the addresses of
111 other allocations. Therefore, the address should be chosen to make this
112 difficult. One way to do this is to allocate a large guard region without
113 read/write permissions, randomly select a small region within it to be
114 used as the address of the shadow call stack and mark only that region as
115 read/write. This also mitigates somewhat against processor side channels.
116 The intent is that the Android runtime `will do this`_, but the platform will
117 first need to be `changed`_ to avoid using ``setrlimit(RLIMIT_AS)`` to limit
118 memory allocations in certain processes, as this also limits the number of
119 guard regions that can be allocated.
121 .. _`will do this`: https://android-review.googlesource.com/c/platform/bionic/+/891622
122 .. _`changed`: https://android-review.googlesource.com/c/platform/frameworks/av/+/837745
124 The runtime will need the address of the shadow call stack in order to
125 deallocate it when destroying the thread. If the entire program is compiled
126 with ``SCSReg`` reserved, this is trivial: the address can be derived from the
127 value stored in ``SCSReg`` (e.g. by masking out the lower bits). If a guard
128 region is used, the address of the start of the guard region could then be
129 stored at the start of the shadow call stack itself. But if it is possible
130 for code compiled without reserving ``SCSReg`` to run on a thread managed by the
131 runtime, which is the case on Android for example, the address must be stored
132 somewhere else instead. On Android we store the address of the start of the
133 guard region in TLS and deallocate the entire guard region including the
134 shadow call stack at thread exit. This is considered acceptable given that
135 the address of the start of the guard region is already somewhat guessable.
137 One way in which the address of the shadow call stack could leak is in the
138 ``jmp_buf`` data structure used by ``setjmp`` and ``longjmp``. The Android
139 runtime `avoids this`_ by only storing the low bits of ``SCSReg`` in the
140 ``jmp_buf``, which requires the address of the shadow call stack to be
141 aligned to its size.
143 .. _`avoids this`: https://android.googlesource.com/platform/bionic/+/808d176e7e0dd727c7f929622ec017f6e065c582/libc/arch-arm64/bionic/setjmp.S#49
145 The architecture's call and return instructions (``bl`` and ``ret``) operate on
146 a register rather than the stack, which means that leaf functions are generally
147 protected from return address overwrites even without ShadowCallStack.
149 Usage
150 =====
152 To enable ShadowCallStack, just pass the ``-fsanitize=shadow-call-stack`` flag
153 to both compile and link command lines. On aarch64, you also need to pass
154 ``-ffixed-x18`` unless your target already reserves ``x18``. On RISC-V, ``x3``
155 (``gp``) is always reserved. It is, however, important to disable GP relaxation
156 in the linker. This can be done with the ``--no-relax-gp`` flag in GNU ld.
158 Low-level API
159 -------------
161 ``__has_feature(shadow_call_stack)``
162 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
164 In some cases one may need to execute different code depending on whether
165 ShadowCallStack is enabled. The macro ``__has_feature(shadow_call_stack)`` can
166 be used for this purpose.
168 .. code-block:: c
170     #if defined(__has_feature)
171     #  if __has_feature(shadow_call_stack)
172     // code that builds only under ShadowCallStack
173     #  endif
174     #endif
176 ``__attribute__((no_sanitize("shadow-call-stack")))``
177 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
179 Use ``__attribute__((no_sanitize("shadow-call-stack")))`` on a function
180 declaration to specify that the shadow call stack instrumentation should not be
181 applied to that function, even if enabled globally.
183 Example
184 =======
186 The following example code:
188 .. code-block:: c++
190     int foo() {
191       return bar() + 1;
192     }
194 Generates the following aarch64 assembly when compiled with ``-O2``:
196 .. code-block:: none
198     stp     x29, x30, [sp, #-16]!
199     mov     x29, sp
200     bl      bar
201     add     w0, w0, #1
202     ldp     x29, x30, [sp], #16
203     ret
205 Adding ``-fsanitize=shadow-call-stack`` would output the following assembly:
207 .. code-block:: none
209     str     x30, [x18], #8
210     stp     x29, x30, [sp, #-16]!
211     mov     x29, sp
212     bl      bar
213     add     w0, w0, #1
214     ldp     x29, x30, [sp], #16
215     ldr     x30, [x18, #-8]!
216     ret