linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 2/2] taskstats: restrict access to user
@ 2011-06-24 12:09 Vasiliy Kulikov
  2011-06-29  1:27 ` Balbir Singh
  2011-06-29 20:09 ` [Security] " Linus Torvalds
  0 siblings, 2 replies; 27+ messages in thread
From: Vasiliy Kulikov @ 2011-06-24 12:09 UTC (permalink / raw)
  To: linux-kernel
  Cc: Balbir Singh, Andrew Morton, Al Viro, David Rientjes,
	Stephen Wilson, KOSAKI Motohiro, security, Eric Paris,
	Solar Designer

taskstats information may be used for gathering private information.
E.g. for openssh and vsftpd daemons read_characters/write_characters may
be used to learn the precise password length.  Restrict it to processes
being able to ptrace the target process.

For TASKSTATS_CMD_ATTR_REGISTER_CPUMASK the fix is euid check instead of
a ptrace check as the handler is processed in the context of the target
process, not the listener process'.  When ptrace_task_may_access_current()
is introduced, it should be used instead of euid check.  Currently there
is a small race when a process temporarily changes its euid (e.g. to
access user's files), until the process sets euid back user's processes
may gather privileged process' statistics.

Signed-off-by: Vasiliy Kulikov <segoon@openwall.com>
---
 kernel/taskstats.c |   23 ++++++++++++++++++++++-
 1 files changed, 22 insertions(+), 1 deletions(-)

diff --git a/kernel/taskstats.c b/kernel/taskstats.c
index 9ffea36..d92c95a 100644
--- a/kernel/taskstats.c
+++ b/kernel/taskstats.c
@@ -27,6 +27,7 @@
 #include <linux/cgroup.h>
 #include <linux/fs.h>
 #include <linux/file.h>
+#include <linux/ptrace.h>
 #include <net/genetlink.h>
 #include <asm/atomic.h>
 
@@ -132,6 +133,8 @@ static void send_cpu_listeners(struct sk_buff *skb,
 	struct sk_buff *skb_next, *skb_cur = skb;
 	void *reply = genlmsg_data(genlhdr);
 	int rc, delcount = 0;
+	const struct cred *cred = current_cred();
+	struct task_struct *task;
 
 	rc = genlmsg_end(skb, reply);
 	if (rc < 0) {
@@ -142,6 +145,15 @@ static void send_cpu_listeners(struct sk_buff *skb,
 	rc = 0;
 	down_read(&listeners->sem);
 	list_for_each_entry(s, &listeners->list, list) {
+
+		rcu_read_lock();
+		task = find_task_by_vpid(s->pid);
+		if (!task || __task_cred(task)->euid != cred->euid) {
+			rcu_read_unlock();
+			continue;
+		}
+		rcu_read_unlock();
+
 		skb_next = NULL;
 		if (!list_is_last(&s->list, &listeners->list)) {
 			skb_next = skb_clone(skb_cur, GFP_KERNEL);
@@ -199,14 +211,19 @@ static void fill_stats(struct task_struct *tsk, struct taskstats *stats)
 static int fill_stats_for_pid(pid_t pid, struct taskstats *stats)
 {
 	struct task_struct *tsk;
+	int rc = -ESRCH;
 
 	rcu_read_lock();
 	tsk = find_task_by_vpid(pid);
+	if (tsk && !ptrace_may_access(tsk, PTRACE_MODE_READ)) {
+		tsk = NULL;
+		rc = -EACCES;
+	}
 	if (tsk)
 		get_task_struct(tsk);
 	rcu_read_unlock();
 	if (!tsk)
-		return -ESRCH;
+		return rc;
 	fill_stats(tsk, stats);
 	put_task_struct(tsk);
 	return 0;
@@ -224,6 +241,10 @@ static int fill_stats_for_tgid(pid_t tgid, struct taskstats *stats)
 	 */
 	rcu_read_lock();
 	first = find_task_by_vpid(tgid);
+	if (first && !ptrace_may_access(first, PTRACE_MODE_READ)) {
+		rc = -EACCES;
+		goto out;
+	}
 
 	if (!first || !lock_task_sighand(first, &flags))
 		goto out;
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 27+ messages in thread

end of thread, other threads:[~2011-09-20  5:47 UTC | newest]

Thread overview: 27+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-06-24 12:09 [PATCH 2/2] taskstats: restrict access to user Vasiliy Kulikov
2011-06-29  1:27 ` Balbir Singh
2011-06-29 11:42   ` Vasiliy Kulikov
2011-06-29 20:17   ` Vasiliy Kulikov
2011-07-02  7:36     ` Vasiliy Kulikov
2011-07-04  2:57       ` Balbir Singh
2011-07-04 17:45         ` Vasiliy Kulikov
2011-07-07  8:55           ` Vasiliy Kulikov
2011-07-07 11:53             ` Balbir Singh
2011-07-07 16:23               ` Vasiliy Kulikov
2011-07-09 15:36                 ` Balbir Singh
2011-07-11 14:07                   ` Vasiliy Kulikov
2011-06-29 20:09 ` [Security] " Linus Torvalds
2011-06-30  7:57   ` Vasiliy Kulikov
2011-06-30 10:59     ` Balbir Singh
2011-06-30 12:08       ` Vasiliy Kulikov
2011-06-30 16:40       ` Linus Torvalds
2011-07-01  3:02         ` Balbir Singh
2011-09-19 16:40           ` Linus Torvalds
2011-09-19 17:20             ` Balbir Singh
2011-09-19 17:39             ` Vasiliy Kulikov
2011-09-19 17:45               ` Linus Torvalds
2011-09-20  3:35                 ` Eric W. Biederman
2011-09-20  5:47                 ` Alexey Dobriyan
2011-09-19 17:47               ` Balbir Singh
2011-09-19 18:29             ` Andi Kleen
2011-09-19 18:32               ` Linus Torvalds

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).