blob: 13468ea696b7160ffd96b8c89d152f9af1d12a10 [file] [log] [blame]
Kees Cook90bb7662017-05-13 04:51:47 -07001====
2Yama
3====
4
Kees Cook730daa12015-07-23 18:02:48 -07005Yama is a Linux Security Module that collects system-wide DAC security
6protections that are not handled by the core kernel itself. This is
Kees Cook90bb7662017-05-13 04:51:47 -07007selectable at build-time with ``CONFIG_SECURITY_YAMA``, and can be controlled
8at run-time through sysctls in ``/proc/sys/kernel/yama``:
Kees Cook2d514482011-12-21 12:17:04 -08009
Kees Cook90bb7662017-05-13 04:51:47 -070010ptrace_scope
11============
Kees Cook2d514482011-12-21 12:17:04 -080012
13As Linux grows in popularity, it will become a larger target for
14malware. One particularly troubling weakness of the Linux process
15interfaces is that a single user is able to examine the memory and
16running state of any of their processes. For example, if one application
17(e.g. Pidgin) was compromised, it would be possible for an attacker to
18attach to other running processes (e.g. Firefox, SSH sessions, GPG agent,
19etc) to extract additional credentials and continue to expand the scope
20of their attack without resorting to user-assisted phishing.
21
22This is not a theoretical problem. SSH session hijacking
23(http://www.storm.net.nz/projects/7) and arbitrary code injection
24(http://c-skills.blogspot.com/2007/05/injectso.html) attacks already
25exist and remain possible if ptrace is allowed to operate as before.
26Since ptrace is not commonly used by non-developers and non-admins, system
27builders should be allowed the option to disable this debugging system.
28
Kees Cook90bb7662017-05-13 04:51:47 -070029For a solution, some applications use ``prctl(PR_SET_DUMPABLE, ...)`` to
Kees Cook2d514482011-12-21 12:17:04 -080030specifically disallow such ptrace attachment (e.g. ssh-agent), but many
31do not. A more general solution is to only allow ptrace directly from a
32parent to a child process (i.e. direct "gdb EXE" and "strace EXE" still
Kees Cook90bb7662017-05-13 04:51:47 -070033work), or with ``CAP_SYS_PTRACE`` (i.e. "gdb --pid=PID", and "strace -p PID"
Kees Cook2d514482011-12-21 12:17:04 -080034still work as root).
35
Kees Cook389da252012-04-16 11:56:45 -070036In mode 1, software that has defined application-specific relationships
Kees Cook2d514482011-12-21 12:17:04 -080037between a debugging process and its inferior (crash handlers, etc),
Kees Cook90bb7662017-05-13 04:51:47 -070038``prctl(PR_SET_PTRACER, pid, ...)`` can be used. An inferior can declare which
39other process (and its descendants) are allowed to call ``PTRACE_ATTACH``
Kees Cook2d514482011-12-21 12:17:04 -080040against it. Only one such declared debugging process can exists for
41each inferior at a time. For example, this is used by KDE, Chromium, and
42Firefox's crash handlers, and by Wine for allowing only Wine processes
Kees Cookbf061892012-02-14 16:48:09 -080043to ptrace each other. If a process wishes to entirely disable these ptrace
Kees Cook90bb7662017-05-13 04:51:47 -070044restrictions, it can call ``prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY, ...)``
Kees Cookbf061892012-02-14 16:48:09 -080045so that any otherwise allowed process (even those in external pid namespaces)
46may attach.
47
Kees Cook90bb7662017-05-13 04:51:47 -070048The sysctl settings (writable only with ``CAP_SYS_PTRACE``) are:
Kees Cook2d514482011-12-21 12:17:04 -080049
Kees Cook90bb7662017-05-13 04:51:47 -0700500 - classic ptrace permissions:
51 a process can ``PTRACE_ATTACH`` to any other
Kees Cook2d514482011-12-21 12:17:04 -080052 process running under the same uid, as long as it is dumpable (i.e.
53 did not transition uids, start privileged, or have called
Kees Cook90bb7662017-05-13 04:51:47 -070054 ``prctl(PR_SET_DUMPABLE...)`` already). Similarly, ``PTRACE_TRACEME`` is
Kees Cook9d8dad72012-08-09 19:01:26 -070055 unchanged.
Kees Cook2d514482011-12-21 12:17:04 -080056
Kees Cook90bb7662017-05-13 04:51:47 -0700571 - restricted ptrace:
58 a process must have a predefined relationship
59 with the inferior it wants to call ``PTRACE_ATTACH`` on. By default,
Kees Cook2d514482011-12-21 12:17:04 -080060 this relationship is that of only its descendants when the above
61 classic criteria is also met. To change the relationship, an
Kees Cook90bb7662017-05-13 04:51:47 -070062 inferior can call ``prctl(PR_SET_PTRACER, debugger, ...)`` to declare
63 an allowed debugger PID to call ``PTRACE_ATTACH`` on the inferior.
64 Using ``PTRACE_TRACEME`` is unchanged.
Kees Cook2d514482011-12-21 12:17:04 -080065
Kees Cook90bb7662017-05-13 04:51:47 -0700662 - admin-only attach:
67 only processes with ``CAP_SYS_PTRACE`` may use ptrace
68 with ``PTRACE_ATTACH``, or through children calling ``PTRACE_TRACEME``.
Kees Cook389da252012-04-16 11:56:45 -070069
Kees Cook90bb7662017-05-13 04:51:47 -0700703 - no attach:
71 no processes may use ptrace with ``PTRACE_ATTACH`` nor via
72 ``PTRACE_TRACEME``. Once set, this sysctl value cannot be changed.
Kees Cook389da252012-04-16 11:56:45 -070073
Kees Cook2d514482011-12-21 12:17:04 -080074The original children-only logic was based on the restrictions in grsecurity.