Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 292283
b: refs/heads/master
c: bf06189
h: refs/heads/master
i:
  292281: cfdf9dc
  292279: 5541e28
v: v3
  • Loading branch information
Kees Cook authored and James Morris committed Feb 15, 2012
1 parent fb8f1da commit a6f99ce
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 4 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 3ab1aff89477dafb1aaeafe8c8669114a02b7226
refs/heads/master: bf06189e4d14641c0148bea16e9dd24943862215
7 changes: 6 additions & 1 deletion trunk/Documentation/security/Yama.txt
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,12 @@ other process (and its descendents) are allowed to call PTRACE_ATTACH
against it. Only one such declared debugging process can exists for
each inferior at a time. For example, this is used by KDE, Chromium, and
Firefox's crash handlers, and by Wine for allowing only Wine processes
to ptrace each other.
to ptrace each other. If a process wishes to entirely disable these ptrace
restrictions, it can call prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY, ...)
so that any otherwise allowed process (even those in external pid namespaces)
may attach.

The sysctl settings are:

0 - classic ptrace permissions: a process can PTRACE_ATTACH to any other
process running under the same uid, as long as it is dumpable (i.e.
Expand Down
1 change: 1 addition & 0 deletions trunk/include/linux/prctl.h
Original file line number Diff line number Diff line change
Expand Up @@ -119,5 +119,6 @@
* A value of 0 mean "no process".
*/
#define PR_SET_PTRACER 0x59616d61
# define PR_SET_PTRACER_ANY ((unsigned long)-1)

#endif /* _LINUX_PRCTL_H */
8 changes: 6 additions & 2 deletions trunk/security/yama/yama_lsm.c
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ static void yama_ptracer_del(struct task_struct *tracer,
spin_lock_bh(&ptracer_relations_lock);
list_for_each_entry_safe(relation, safe, &ptracer_relations, node)
if (relation->tracee == tracee ||
relation->tracer == tracer) {
(tracer && relation->tracer == tracer)) {
list_del(&relation->node);
kfree(relation);
}
Expand Down Expand Up @@ -138,6 +138,8 @@ static int yama_task_prctl(int option, unsigned long arg2, unsigned long arg3,
if (arg2 == 0) {
yama_ptracer_del(NULL, myself);
rc = 0;
} else if (arg2 == PR_SET_PTRACER_ANY) {
rc = yama_ptracer_add(NULL, myself);
} else {
struct task_struct *tracer;

Expand Down Expand Up @@ -208,6 +210,7 @@ static int ptracer_exception_found(struct task_struct *tracer,
int rc = 0;
struct ptrace_relation *relation;
struct task_struct *parent = NULL;
bool found = false;

spin_lock_bh(&ptracer_relations_lock);
rcu_read_lock();
Expand All @@ -216,10 +219,11 @@ static int ptracer_exception_found(struct task_struct *tracer,
list_for_each_entry(relation, &ptracer_relations, node)
if (relation->tracee == tracee) {
parent = relation->tracer;
found = true;
break;
}

if (task_is_descendant(parent, tracer))
if (found && (parent == NULL || task_is_descendant(parent, tracer)))
rc = 1;
rcu_read_unlock();
spin_unlock_bh(&ptracer_relations_lock);
Expand Down

0 comments on commit a6f99ce

Please sign in to comment.