[Devel] [PATCH rh7 v2] proc/pid: Don't show kernel threads inside Containers

Kirill Tkhai ktkhai at virtuozzo.com
Wed Feb 26 16:46:52 MSK 2020


On 26.02.2020 15:08, Konstantin Khorenko wrote:
> We have our home-brew security defence feature from ptrace-ing
> processes entered a Container outside.
> It's based on "vps_dumpable" field of task->mm and is checked in
> __ptrace_may_access() in particular.
> Same function __ptrace_may_access() is used when someone tries to
> readlink /proc/$PID/ns/$SOMENS and gets -EPERM for kthreads because they
> lack task->mm and thus "vps_dumpable" field and we really would like
> people not to ptrace kernel threads from inside a Container.
> 
> We might enhance the security check, but decided just to make Container
> kernel threads invisible (from inside a Container only of course).
> 
> https://jira.sw.ru/browse/PSBM-92107
> 
> Signed-off-by: Konstantin Khorenko <khorenko at virtuozzo.com>

Reviewed-by: Kirill Tkhai <ktkhai at virtuozzo.com>
 
> v2: * check PF_KTHREAD task flag for kthread detection as not all
>       kthreads lack ->mm.
>     * Hide kthreads from direct checking (via, say, /proc/$PID) access
>       as well.
>     * proc entries for kthreads are hidden in procfs mounted in non-init
>       pidns despite the namespace of current process (i.e. if you enter
>       CT's mount ns only, you still won't be able to check entries of
>       CT's kthreads. Check host's procfs for that.)
>     * introduce helpers
> ---
>  fs/proc/base.c | 14 ++++++++++++++
>  1 file changed, 14 insertions(+)
> 
> diff --git a/fs/proc/base.c b/fs/proc/base.c
> index dbf5a84b604f3..965a7467c2b4d 100644
> --- a/fs/proc/base.c
> +++ b/fs/proc/base.c
> @@ -3300,6 +3300,15 @@ static struct dentry *proc_pid_instantiate(struct inode *dir,
>  	return error;
>  }
>  
> +static bool is_visible_task_ve(struct pid_namespace *ns, struct task_struct *task)
> +{
> +	/* Don't show kthreads inside Containers. */
> +	if ((task->flags & PF_KTHREAD) && (ns != &init_pid_ns))
> +		return false;
> +
> +	return true;
> +}
> +
>  struct dentry *proc_pid_lookup(struct inode *dir, struct dentry * dentry, unsigned int flags)
>  {
>  	struct dentry *result = NULL;
> @@ -3314,6 +3323,8 @@ struct dentry *proc_pid_lookup(struct inode *dir, struct dentry * dentry, unsign
>  	ns = dentry->d_sb->s_fs_info;
>  	rcu_read_lock();
>  	task = find_task_by_pid_ns(tgid, ns);
> +	if (task && !is_visible_task_ve(ns, task))
> +		task = NULL;
>  	if (task)
>  		get_task_struct(task);
>  	rcu_read_unlock();
> @@ -3410,6 +3421,9 @@ int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir)
>  	for (iter = next_tgid(ns, iter);
>  	     iter.task;
>  	     iter.tgid += 1, iter = next_tgid(ns, iter)) {
> +		if (!is_visible_task_ve(ns, iter.task))
> +			continue;
> +
>  		if (is_visible_task(ns, iter.task))
>  			__filldir = filldir;
>  		else
> 



More information about the Devel mailing list