• Tyler Hicks (Microsoft)'s avatar
    proc: Move fdinfo PTRACE_MODE_READ check into the inode .permission operation · 0a960ba4
    Tyler Hicks (Microsoft) authored
    The following commits loosened the permissions of /proc/<PID>/fdinfo/
    directory, as well as the files within it, from 0500 to 0555 while also
    introducing a PTRACE_MODE_READ check between the current task and
    <PID>'s task:
    
     - commit 7bc3fa01 ("procfs: allow reading fdinfo with PTRACE_MODE_READ")
     - commit 1927e498 ("procfs: prevent unprivileged processes accessing fdinfo dir")
    
    Before those changes, inode based system calls like inotify_add_watch(2)
    would fail when the current task didn't have sufficient read permissions:
    
     [...]
     lstat("/proc/1/task/1/fdinfo", {st_mode=S_IFDIR|0500, st_size=0, ...}) = 0
     inotify_add_watch(64, "/proc/1/task/1/fdinfo",
    		   IN_MODIFY|IN_ATTRIB|IN_MOVED_FROM|IN_MOVED_TO|IN_CREATE|IN_DELETE|
    		   IN_ONLYDIR|IN_DONT_FOLLOW|IN_EXCL_UNLINK) = -1 EACCES (Permission denied)
     [...]
    
    This matches the documented behavior in the inotify_add_watch(2) man
    page:
    
     ERRORS
           EACCES Read access to the given file is not permitted.
    
    After those changes, inotify_add_watch(2) started succeeding despite the
    current task not having PTRACE_MODE_READ privileges on the target task:
    
     [...]
     lstat("/proc/1/task/1/fdinfo", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0
     inotify_add_watch(64, "/proc/1/task/1/fdinfo",
    		   IN_MODIFY|IN_ATTRIB|IN_MOVED_FROM|IN_MOVED_TO|IN_CREATE|IN_DELETE|
    		   IN_ONLYDIR|IN_DONT_FOLLOW|IN_EXCL_UNLINK) = 1757
     openat(AT_FDCWD, "/proc/1/task/1/fdinfo",
    	O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = -1 EACCES (Permission denied)
     [...]
    
    This change in behavior broke .NET prior to v7. See the github link
    below for the v7 commit that inadvertently/quietly (?) fixed .NET after
    the kernel changes mentioned above.
    
    Return to the old behavior by moving the PTRACE_MODE_READ check out of
    the file .open operation and into the inode .permission operation:
    
     [...]
     lstat("/proc/1/task/1/fdinfo", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0
     inotify_add_watch(64, "/proc/1/task/1/fdinfo",
    		   IN_MODIFY|IN_ATTRIB|IN_MOVED_FROM|IN_MOVED_TO|IN_CREATE|IN_DELETE|
    		   IN_ONLYDIR|IN_DONT_FOLLOW|IN_EXCL_UNLINK) = -1 EACCES (Permission denied)
     [...]
    Reported-by: default avatarKevin Parsons (Microsoft) <parsonskev@gmail.com>
    Link: https://github.com/dotnet/runtime/commit/89e5469ac591b82d38510fe7de98346cce74ad4f
    Link: https://stackoverflow.com/questions/75379065/start-self-contained-net6-build-exe-as-service-on-raspbian-system-unauthorizeda
    Fixes: 7bc3fa01 ("procfs: allow reading fdinfo with PTRACE_MODE_READ")
    Cc: stable@vger.kernel.org
    Cc: Christian Brauner <brauner@kernel.org>
    Cc: Christian König <christian.koenig@amd.com>
    Cc: Jann Horn <jannh@google.com>
    Cc: Kalesh Singh <kaleshsingh@google.com>
    Cc: Hardik Garg <hargar@linux.microsoft.com>
    Cc: Allen Pais <apais@linux.microsoft.com>
    Signed-off-by: default avatarTyler Hicks (Microsoft) <code@tyhicks.com>
    Link: https://lore.kernel.org/r/20240501005646.745089-1-code@tyhicks.comSigned-off-by: default avatarChristian Brauner <brauner@kernel.org>
    0a960ba4
fd.c 9.22 KB