A resposta é (ou pelo menos começa ) em fs/proc/base.c
(inalterado do kernel 3.12 para 4.2 pelo menos)
742 static int proc_pid_permission(struct inode *inode, int mask)
743 {
744 struct pid_namespace *pid = inode->i_sb->s_fs_info;
745 struct task_struct *task;
746 bool has_perms;
747
748 task = get_proc_task(inode);
749 if (!task)
750 return -ESRCH;
751 has_perms = has_pid_permissions(pid, task, 1);
752 put_task_struct(task);
753
754 if (!has_perms) {
755 if (pid->hide_pid == 2) {
756 /*
757 * Let's make getdents(), stat(), and open()
758 * consistent with each other. If a process
759 * may not stat() a file, it shouldn't be seen
760 * in procfs at all.
761 */
762 return -ENOENT;
763 }
764
765 return -EPERM;
766 }
767 return generic_permission(inode, mask);
768 }
O código acima é o ponto de partida para determinar se uma entrada /proc/PID
específica pode ser vista como existente ou não. Quando hide_pid
é definido como 2, ele retorna -ENOENT
se você não tiver a permissão necessária. As permissões são verificadas por meio de:
has_pid_permissions()
→
ptrace_may_access()
→
__ptrace_may_access()
__ptrace_may_access()
nega acesso porque o processo não é "dumpable", pois foi criado a partir de uma imagem executável ilegível, conforme determinado durante a criação do processo:
setup_new_exec()
→
would_dump()
1118 void would_dump(struct linux_binprm *bprm, struct file *file)
1119 {
1120 if (inode_permission(file_inode(file), MAY_READ) < 0)
1121 bprm->interp_flags |= BINPRM_FLAGS_ENFORCE_NONDUMP;
1122 }