xref: /OK3568_Linux_fs/kernel/Documentation/admin-guide/LSM/Yama.rst (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun====
2*4882a593SmuzhiyunYama
3*4882a593Smuzhiyun====
4*4882a593Smuzhiyun
5*4882a593SmuzhiyunYama is a Linux Security Module that collects system-wide DAC security
6*4882a593Smuzhiyunprotections that are not handled by the core kernel itself. This is
7*4882a593Smuzhiyunselectable at build-time with ``CONFIG_SECURITY_YAMA``, and can be controlled
8*4882a593Smuzhiyunat run-time through sysctls in ``/proc/sys/kernel/yama``:
9*4882a593Smuzhiyun
10*4882a593Smuzhiyunptrace_scope
11*4882a593Smuzhiyun============
12*4882a593Smuzhiyun
13*4882a593SmuzhiyunAs Linux grows in popularity, it will become a larger target for
14*4882a593Smuzhiyunmalware. One particularly troubling weakness of the Linux process
15*4882a593Smuzhiyuninterfaces is that a single user is able to examine the memory and
16*4882a593Smuzhiyunrunning state of any of their processes. For example, if one application
17*4882a593Smuzhiyun(e.g. Pidgin) was compromised, it would be possible for an attacker to
18*4882a593Smuzhiyunattach to other running processes (e.g. Firefox, SSH sessions, GPG agent,
19*4882a593Smuzhiyunetc) to extract additional credentials and continue to expand the scope
20*4882a593Smuzhiyunof their attack without resorting to user-assisted phishing.
21*4882a593Smuzhiyun
22*4882a593SmuzhiyunThis is not a theoretical problem. `SSH session hijacking
23*4882a593Smuzhiyun<https://www.blackhat.com/presentations/bh-usa-05/bh-us-05-boileau.pdf>`_
24*4882a593Smuzhiyunand `arbitrary code injection
25*4882a593Smuzhiyun<https://c-skills.blogspot.com/2007/05/injectso.html>`_ attacks already
26*4882a593Smuzhiyunexist and remain possible if ptrace is allowed to operate as before.
27*4882a593SmuzhiyunSince ptrace is not commonly used by non-developers and non-admins, system
28*4882a593Smuzhiyunbuilders should be allowed the option to disable this debugging system.
29*4882a593Smuzhiyun
30*4882a593SmuzhiyunFor a solution, some applications use ``prctl(PR_SET_DUMPABLE, ...)`` to
31*4882a593Smuzhiyunspecifically disallow such ptrace attachment (e.g. ssh-agent), but many
32*4882a593Smuzhiyundo not. A more general solution is to only allow ptrace directly from a
33*4882a593Smuzhiyunparent to a child process (i.e. direct "gdb EXE" and "strace EXE" still
34*4882a593Smuzhiyunwork), or with ``CAP_SYS_PTRACE`` (i.e. "gdb --pid=PID", and "strace -p PID"
35*4882a593Smuzhiyunstill work as root).
36*4882a593Smuzhiyun
37*4882a593SmuzhiyunIn mode 1, software that has defined application-specific relationships
38*4882a593Smuzhiyunbetween a debugging process and its inferior (crash handlers, etc),
39*4882a593Smuzhiyun``prctl(PR_SET_PTRACER, pid, ...)`` can be used. An inferior can declare which
40*4882a593Smuzhiyunother process (and its descendants) are allowed to call ``PTRACE_ATTACH``
41*4882a593Smuzhiyunagainst it. Only one such declared debugging process can exists for
42*4882a593Smuzhiyuneach inferior at a time. For example, this is used by KDE, Chromium, and
43*4882a593SmuzhiyunFirefox's crash handlers, and by Wine for allowing only Wine processes
44*4882a593Smuzhiyunto ptrace each other. If a process wishes to entirely disable these ptrace
45*4882a593Smuzhiyunrestrictions, it can call ``prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY, ...)``
46*4882a593Smuzhiyunso that any otherwise allowed process (even those in external pid namespaces)
47*4882a593Smuzhiyunmay attach.
48*4882a593Smuzhiyun
49*4882a593SmuzhiyunThe sysctl settings (writable only with ``CAP_SYS_PTRACE``) are:
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun0 - classic ptrace permissions:
52*4882a593Smuzhiyun    a process can ``PTRACE_ATTACH`` to any other
53*4882a593Smuzhiyun    process running under the same uid, as long as it is dumpable (i.e.
54*4882a593Smuzhiyun    did not transition uids, start privileged, or have called
55*4882a593Smuzhiyun    ``prctl(PR_SET_DUMPABLE...)`` already). Similarly, ``PTRACE_TRACEME`` is
56*4882a593Smuzhiyun    unchanged.
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun1 - restricted ptrace:
59*4882a593Smuzhiyun    a process must have a predefined relationship
60*4882a593Smuzhiyun    with the inferior it wants to call ``PTRACE_ATTACH`` on. By default,
61*4882a593Smuzhiyun    this relationship is that of only its descendants when the above
62*4882a593Smuzhiyun    classic criteria is also met. To change the relationship, an
63*4882a593Smuzhiyun    inferior can call ``prctl(PR_SET_PTRACER, debugger, ...)`` to declare
64*4882a593Smuzhiyun    an allowed debugger PID to call ``PTRACE_ATTACH`` on the inferior.
65*4882a593Smuzhiyun    Using ``PTRACE_TRACEME`` is unchanged.
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun2 - admin-only attach:
68*4882a593Smuzhiyun    only processes with ``CAP_SYS_PTRACE`` may use ptrace, either with
69*4882a593Smuzhiyun    ``PTRACE_ATTACH`` or through children calling ``PTRACE_TRACEME``.
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun3 - no attach:
72*4882a593Smuzhiyun    no processes may use ptrace with ``PTRACE_ATTACH`` nor via
73*4882a593Smuzhiyun    ``PTRACE_TRACEME``. Once set, this sysctl value cannot be changed.
74*4882a593Smuzhiyun
75*4882a593SmuzhiyunThe original children-only logic was based on the restrictions in grsecurity.
76