From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751396AbdHFPE1 (ORCPT ); Sun, 6 Aug 2017 11:04:27 -0400 Received: from out01.mta.xmission.com ([166.70.13.231]:38484 "EHLO out01.mta.xmission.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751323AbdHFPEZ (ORCPT ); Sun, 6 Aug 2017 11:04:25 -0400 From: ebiederm@xmission.com (Eric W. Biederman) To: Aleksa Sarai Cc: Ingo Molnar , Peter Zijlstra , cyphar@cyphar.com, linux-kernel@vger.kernel.org, stable@vger.kernel.org, Jess Frazelle References: <20170806044141.5093-1-asarai@suse.com> Date: Sun, 06 Aug 2017 09:56:01 -0500 In-Reply-To: <20170806044141.5093-1-asarai@suse.com> (Aleksa Sarai's message of "Sun, 6 Aug 2017 14:41:41 +1000") Message-ID: <87a83ciw3i.fsf@xmission.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-XM-SPF: eid=1deN6G-0004kr-N8;;;mid=<87a83ciw3i.fsf@xmission.com>;;;hst=in01.mta.xmission.com;;;ip=67.3.213.87;;;frm=ebiederm@xmission.com;;;spf=neutral X-XM-AID: U2FsdGVkX18b2tclyzzBHdrM95A6XMAT0EOSwhJfLHQ= X-SA-Exim-Connect-IP: 67.3.213.87 X-SA-Exim-Mail-From: ebiederm@xmission.com X-Spam-Report: * -1.0 ALL_TRUSTED Passed through trusted hosts only via SMTP * 0.7 XMSubLong Long Subject * 0.5 XMGappySubj_01 Very gappy subject * 0.0 TVD_RCVD_IP Message was received from an IP address * 1.2 LotsOfNums_01 BODY: Lots of long strings of numbers * 0.0 T_TM2_M_HEADER_IN_MSG BODY: No description available. * 0.8 BAYES_50 BODY: Bayes spam probability is 40 to 60% * [score: 0.5000] * -0.0 DCC_CHECK_NEGATIVE Not listed in DCC * [sa02 1397; Body=1 Fuz1=1 Fuz2=1] * 0.0 T_TooManySym_01 4+ unique symbols in subject X-Spam-DCC: XMission; sa02 1397; Body=1 Fuz1=1 Fuz2=1 X-Spam-Combo: **;Aleksa Sarai X-Spam-Relay-Country: X-Spam-Timing: total 5675 ms - load_scoreonly_sql: 0.05 (0.0%), signal_user_changed: 2.9 (0.1%), b_tie_ro: 1.93 (0.0%), parse: 1.32 (0.0%), extract_message_metadata: 38 (0.7%), get_uri_detail_list: 4.6 (0.1%), tests_pri_-1000: 15 (0.3%), tests_pri_-950: 2.1 (0.0%), tests_pri_-900: 1.71 (0.0%), tests_pri_-400: 45 (0.8%), check_bayes: 43 (0.8%), b_tokenize: 14 (0.2%), b_tok_get_all: 11 (0.2%), b_comp_prob: 4.3 (0.1%), b_tok_touch_all: 10 (0.2%), b_finish: 0.85 (0.0%), tests_pri_0: 658 (11.6%), check_dkim_signature: 0.93 (0.0%), check_dkim_adsp: 5 (0.1%), tests_pri_500: 4908 (86.5%), poll_dns_idle: 4884 (86.1%), rewrite_mail: 0.00 (0.0%) Subject: Re: [PATCH v2] sched: debug: use task_pid_nr_ns in /proc/$pid/sched X-Spam-Flag: No X-SA-Exim-Version: 4.2.1 (built Thu, 05 May 2016 13:38:54 -0600) X-SA-Exim-Scanned: Yes (on in01.mta.xmission.com) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Aleksa Sarai writes: > It appears as though the addition of the PID namespace did not update > the output code for /proc/*/sched, which resulted in it providing PIDs > that were not self-consistent with the /proc mount. This additionally > made it trivial to detect whether a process was inside &init_pid_ns from > userspace (making container detection trivial[1]). This lead to > situations such as: > > % unshare -pmf > % mount -t proc proc /proc > % head -n1 /proc/1/sched > head (10047, #threads: 1) > > Fix this by just using task_pid_nr_ns for the output of /proc/*/sched. > All of the other uses of task_pid_nr in kernel/sched/debug.c are from a > sysctl context and thus don't need to be namespaced. > > [1]: https://github.com/jessfraz/amicontained > > Cc: > Cc: Jess Frazelle > Signed-off-by: Aleksa Sarai Acked-by: "Eric W. Biederman" > --- > fs/proc/base.c | 3 ++- > include/linux/sched/debug.h | 4 +++- > kernel/sched/debug.c | 5 +++-- > 3 files changed, 8 insertions(+), 4 deletions(-) > > diff --git a/fs/proc/base.c b/fs/proc/base.c > index 719c2e943ea1..98fd8f6df851 100644 > --- a/fs/proc/base.c > +++ b/fs/proc/base.c > @@ -1408,12 +1408,13 @@ static const struct file_operations proc_fail_nth_operations = { > static int sched_show(struct seq_file *m, void *v) > { > struct inode *inode = m->private; > + struct pid_namespace *ns = inode->i_sb->s_fs_info; > struct task_struct *p; > > p = get_proc_task(inode); > if (!p) > return -ESRCH; > - proc_sched_show_task(p, m); > + proc_sched_show_task(p, ns, m); > > put_task_struct(p); > > diff --git a/include/linux/sched/debug.h b/include/linux/sched/debug.h > index e0eaee54c5a4..5d58d49e9f87 100644 > --- a/include/linux/sched/debug.h > +++ b/include/linux/sched/debug.h > @@ -6,6 +6,7 @@ > */ > > struct task_struct; > +struct pid_namespace; > > extern void dump_cpu_task(int cpu); > > @@ -34,7 +35,8 @@ extern void sched_show_task(struct task_struct *p); > > #ifdef CONFIG_SCHED_DEBUG > struct seq_file; > -extern void proc_sched_show_task(struct task_struct *p, struct seq_file *m); > +extern void proc_sched_show_task(struct task_struct *p, > + struct pid_namespace *ns, struct seq_file *m); > extern void proc_sched_set_task(struct task_struct *p); > #endif > > diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c > index 4fa66de52bd6..ac345115877b 100644 > --- a/kernel/sched/debug.c > +++ b/kernel/sched/debug.c > @@ -872,11 +872,12 @@ static void sched_show_numa(struct task_struct *p, struct seq_file *m) > #endif > } > > -void proc_sched_show_task(struct task_struct *p, struct seq_file *m) > +void proc_sched_show_task(struct task_struct *p, struct pid_namespace *ns, > + struct seq_file *m) > { > unsigned long nr_switches; > > - SEQ_printf(m, "%s (%d, #threads: %d)\n", p->comm, task_pid_nr(p), > + SEQ_printf(m, "%s (%d, #threads: %d)\n", p->comm, task_pid_nr_ns(p, ns), > get_nr_threads(p)); > SEQ_printf(m, > "---------------------------------------------------------"