| What is a GCC security bug? |
| =========================== |
| |
| A security bug is one that threatens the security of a system or |
| network, or might compromise the security of data stored on it. |
| In the context of GCC, there are multiple ways in which this might |
| happen and some common scenarios are detailed below. |
| |
| If you're reporting a security issue and feel like it does not fit |
| into any of the descriptions below, you're encouraged to reach out |
| through the GCC bugzilla or, if needed, privately, by following the |
| instructions in the last two sections of this document. |
| |
| Compiler drivers, programs, libgccjit and support libraries |
| ----------------------------------------------------------- |
| |
| The compiler driver processes source code, invokes other programs |
| such as the assembler and linker and generates the output result, |
| which may be assembly code or machine code. Compiling untrusted |
| sources can result in arbitrary code execution and unconstrained |
| resource consumption in the compiler. As a result, compilation of |
| such code should be done inside a sandboxed environment to ensure |
| that it does not compromise the host environment. |
| |
| The libgccjit library can, despite the name, be used both for |
| ahead-of-time compilation and for just-in-compilation. In both |
| cases, it can be used to translate input representations (such as |
| source code) in the application context; in the latter case, the |
| generated code is also run in the application context. |
| |
| Limitations that apply to the compiler driver apply here too in |
| terms of trusting inputs and it is recommended that both the |
| compilation *and* execution context of the code are appropriately |
| sandboxed to contain the effects of any bugs in libgccjit, the |
| application code using it, or its generated code to the sandboxed |
| environment. |
| |
| Libraries such as libiberty, libcc1 and libcpp are not distributed |
| for runtime support and have similar challenges to compiler drivers. |
| While they are expected to be robust against arbitrary input, they |
| should only be used with trusted inputs when linked into the |
| compiler. |
| |
| Libraries such as zlib that are bundled with GCC to build it will be |
| treated the same as the compiler drivers and programs as far as |
| security coverage is concerned. However, if you find an issue in |
| these libraries independent of their use in GCC, you should reach |
| out to their upstream projects to report them. |
| |
| As a result, the only case for a potential security issue in the |
| compiler is when it generates vulnerable application code for |
| trusted input source code that is conforming to the relevant |
| programming standard or extensions documented as supported by GCC |
| and the algorithm expressed in the source code does not have the |
| vulnerability. The output application code could be considered |
| vulnerable if it produces an actual vulnerability in the target |
| application, for example: |
| |
| - The application dereferences an invalid memory location despite |
| the application sources being valid. |
| - The application reads from or writes to a valid but incorrect |
| memory location, resulting in an information integrity issue or an |
| information leak. |
| - The application ends up running in an infinite loop or with |
| severe degradation in performance despite the input sources having |
| no such issue, resulting in a Denial of Service. Note that |
| correct but non-performant code is not a security issue candidate, |
| this only applies to incorrect code that may result in performance |
| degradation severe enough to amount to a denial of service. |
| - The application crashes due to the generated incorrect code, |
| resulting in a Denial of Service. |
| |
| Language runtime libraries |
| -------------------------- |
| |
| GCC also builds and distributes libraries that are intended to be |
| used widely to implement runtime support for various programming |
| languages. These include the following: |
| |
| * libada |
| * libatomic |
| * libbacktrace |
| * libcc1 |
| * libcody |
| * libcpp |
| * libdecnumber |
| * libffi |
| * libgcc |
| * libgfortran |
| * libgm2 |
| * libgo |
| * libgomp |
| * libitm |
| * libobjc |
| * libphobos |
| * libquadmath |
| * libssp |
| * libstdc++ |
| |
| These libraries are intended to be used in arbitrary contexts and, as |
| a result, bugs in these libraries may be evaluated for security |
| impact. However, some of these libraries, e.g. libgo, libphobos, |
| etc. are not maintained in the GCC project, due to which the GCC |
| project may not be the correct point of contact for them. You are |
| encouraged to look at README files within those library directories |
| to locate the canonical security contact point for those projects |
| and include them in the report. Once the issue is fixed in the |
| upstream project, the fix will be synced into GCC in a future |
| release. |
| |
| Most security vulnerabilities in these runtime libraries arise when |
| an application uses functionality in a specific way. As a result, |
| not all bugs qualify as security relevant. The following guidelines |
| can help with the decision: |
| |
| - Buffer overflows and integer overflows should be treated as |
| security issues if it is conceivable that the data triggering them |
| can come from an untrusted source. |
| - Bugs that cause memory corruption which is likely exploitable |
| should be treated as security bugs. |
| - Information disclosure can be security bugs, especially if |
| exposure through applications can be determined. |
| - Memory leaks and races are security bugs if they cause service |
| breakage. |
| - Stack overflow through unbounded alloca calls or variable-length |
| arrays are security bugs if it is conceivable that the data |
| triggering the overflow could come from an untrusted source. |
| - Stack overflow through deep recursion and other crashes are |
| security bugs if they cause service breakage. |
| - Bugs that cripple the whole system (so that it doesn't even boot |
| or does not run most applications) are not security bugs because |
| they will not be exploitable in practice, due to general system |
| instability. |
| |
| Diagnostic libraries |
| -------------------- |
| |
| Libraries like libvtv and the sanitizers are intended to be used in |
| diagnostic cases and not intended for use in sensitive environments. |
| As a result, bugs in these libraries will not be considered security |
| sensitive. |
| |
| GCC plugins |
| ----------- |
| |
| It should be noted that GCC may execute arbitrary code loaded by a |
| user through the GCC plugin mechanism or through system preloading |
| mechanism. Such custom code should be vetted by the user for safety, |
| as bugs exposed through such code will not be considered security |
| issues. |
| |
| Security features implemented in GCC |
| ------------------------------------ |
| |
| GCC implements a number of security features that reduce the impact |
| of security issues in applications, such as -fstack-protector, |
| -fstack-clash-protection, _FORTIFY_SOURCE and so on. A failure of |
| these features to function perfectly in all situations is not a |
| vulnerability in itself since it does not affect the correctness of |
| programs. Further, they're dependent on heuristics and may not |
| always have full coverage for protection. |
| |
| Similarly, GCC may transform code in a way that the correctness of |
| the expressed algorithm is preserved, but supplementary properties |
| that are not specifically expressible in a high-level language |
| are not preserved. Examples of such supplementary properties |
| include absence of sensitive data in the program's address space |
| after an attempt to wipe it, or data-independent timing of code. |
| When the source code attempts to express such properties, failure |
| to preserve them in resulting machine code is not a security issue |
| in GCC. |
| |
| Reporting private security bugs |
| =============================== |
| |
| *All bugs reported in the GCC Bugzilla are public.* |
| |
| In order to report a private security bug that is not immediately |
| public, please contact one of the downstream distributions with |
| security teams. The following teams have volunteered to handle |
| such bugs: |
| |
| Debian: security@debian.org |
| Red Hat: secalert@redhat.com |
| SUSE: security@suse.de |
| AdaCore: product-security@adacore.com |
| |
| Please report the bug to just one of these teams. It will be shared |
| with other teams as necessary. |
| |
| The team contacted will take care of details such as vulnerability |
| rating and CVE assignment (http://cve.mitre.org/about/). It is likely |
| that the team will ask to file a public bug because the issue is |
| sufficiently minor and does not warrant an embargo. An embargo is not |
| a requirement for being credited with the discovery of a security |
| vulnerability. |
| |
| Reporting public security bugs |
| ============================== |
| |
| It is expected that critical security bugs will be rare, and that most |
| security bugs can be reported in GCC, thus making |
| them public immediately. The system can be found here: |
| |
| https://gcc.gnu.org/bugzilla/ |