mbox series

[0/2] nfsd symlink vulnerability patch

Message ID ccb8fb74-7b8d-418b-bbbc-9848aeb8a6c8@hyub.org (mailing list archive)
Headers show
Series nfsd symlink vulnerability patch | expand

Message

Christopher Bii Dec. 5, 2024, 2:04 a.m. UTC
It is hinted in the configuration files that an attacker could gain 
access to arbitrary folders by guessing symlink paths that match 
exported dirs, but this is not the case. They can get access to the root 
export with certainty by simply symlinking to "../../../../../../../", 
which will nearly* always return "/".

This is due to realpath() being called in the main thread which isn't 
chrooted, concatenating the result with the export root to create the 
export entry's final absolute path which the kernel then exports.

Also, a linker issue arose so I have added another small hack just to 
get it compiled correctly.


Christopher Bii (2):
   Exportfs changes - When a export rootdir is present, nfsd_realpath()
     wrapper is used to   avoid symlink exploits. - Removed
     canonicalization of rootdir paths. Export rootdir must now be   an
     absolute path. - Implemented nfsd_path.h
   Temporary fix for build issue for mount util.

  support/export/export.c     |  24 +--
  support/include/nfsd_path.h |   9 +-
  support/misc/nfsd_path.c    | 362 ++++++++++++------------------------
  support/nfs/exports.c       |  59 +++---
  utils/exportfs/exportfs.c   |   8 +-
  5 files changed, 170 insertions(+), 292 deletions(-)

Comments

Christopher Bii Dec. 5, 2024, 2:10 a.m. UTC | #1
Although obvious I believe, I forgot to mention that an alternate export 
root must be configured for this to be an issue.

Christopher Bii wrote:
> It is hinted in the configuration files that an attacker could gain 
> access to arbitrary folders by guessing symlink paths that match 
> exported dirs, but this is not the case. They can get access to the root 
> export with certainty by simply symlinking to "../../../../../../../", 
> which will nearly* always return "/".
> 
> This is due to realpath() being called in the main thread which isn't 
> chrooted, concatenating the result with the export root to create the 
> export entry's final absolute path which the kernel then exports.
> 
> Also, a linker issue arose so I have added another small hack just to 
> get it compiled correctly.
> 
> 
> Christopher Bii (2):
>    Exportfs changes - When a export rootdir is present, nfsd_realpath()
>      wrapper is used to   avoid symlink exploits. - Removed
>      canonicalization of rootdir paths. Export rootdir must now be   an
>      absolute path. - Implemented nfsd_path.h
>    Temporary fix for build issue for mount util.
> 
>   support/export/export.c     |  24 +--
>   support/include/nfsd_path.h |   9 +-
>   support/misc/nfsd_path.c    | 362 ++++++++++++------------------------
>   support/nfs/exports.c       |  59 +++---
>   utils/exportfs/exportfs.c   |   8 +-
>   5 files changed, 170 insertions(+), 292 deletions(-)
>