linux/fs/ext4
Kees Cook a068acf2ee fs: create and use seq_show_option for escaping
Many file systems that implement the show_options hook fail to correctly
escape their output which could lead to unescaped characters (e.g.  new
lines) leaking into /proc/mounts and /proc/[pid]/mountinfo files.  This
could lead to confusion, spoofed entries (resulting in things like
systemd issuing false d-bus "mount" notifications), and who knows what
else.  This looks like it would only be the root user stepping on
themselves, but it's possible weird things could happen in containers or
in other situations with delegated mount privileges.

Here's an example using overlay with setuid fusermount trusting the
contents of /proc/mounts (via the /etc/mtab symlink).  Imagine the use
of "sudo" is something more sneaky:

  $ BASE="ovl"
  $ MNT="$BASE/mnt"
  $ LOW="$BASE/lower"
  $ UP="$BASE/upper"
  $ WORK="$BASE/work/ 0 0
  none /proc fuse.pwn user_id=1000"
  $ mkdir -p "$LOW" "$UP" "$WORK"
  $ sudo mount -t overlay -o "lowerdir=$LOW,upperdir=$UP,workdir=$WORK" none /mnt
  $ cat /proc/mounts
  none /root/ovl/mnt overlay rw,relatime,lowerdir=ovl/lower,upperdir=ovl/upper,workdir=ovl/work/ 0 0
  none /proc fuse.pwn user_id=1000 0 0
  $ fusermount -u /proc
  $ cat /proc/mounts
  cat: /proc/mounts: No such file or directory

This fixes the problem by adding new seq_show_option and
seq_show_option_n helpers, and updating the vulnerable show_option
handlers to use them as needed.  Some, like SELinux, need to be open
coded due to unusual existing escape mechanisms.

[akpm@linux-foundation.org: add lost chunk, per Kees]
[keescook@chromium.org: seq_show_option should be using const parameters]
Signed-off-by: Kees Cook <keescook@chromium.org>
Acked-by: Serge Hallyn <serge.hallyn@canonical.com>
Acked-by: Jan Kara <jack@suse.com>
Acked-by: Paul Moore <paul@paul-moore.com>
Cc: J. R. Okajima <hooanon05g@gmail.com>
Signed-off-by: Kees Cook <keescook@chromium.org>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2015-09-04 16:54:41 -07:00
..
acl.c ext4: remove unused header files 2015-04-02 23:47:42 -04:00
acl.h ext2/3/4: use generic posix ACL infrastructure 2014-01-25 23:58:19 -05:00
balloc.c ext4: verify block bitmap even after fresh initialization 2015-06-08 11:18:52 -04:00
bitmap.c ext4: remove unused header files 2015-04-02 23:47:42 -04:00
block_validity.c ext4: remove unused header files 2015-04-02 23:47:42 -04:00
crypto_fname.c ext4 crypto: remove duplicate header file 2015-07-28 15:12:18 -04:00
crypto_key.c ext4 crypto: fix spelling typo in comment 2015-07-22 00:09:45 -04:00
crypto_policy.c ext4 crypto: use a jbd2 transaction when adding a crypto policy 2015-07-17 11:16:47 -04:00
crypto.c ext4 crypto: fix ext4_get_crypto_ctx()'s calling convention in ext4_decrypt_one 2015-06-08 11:54:56 -04:00
dir.c ext4 crypto: make sure the encryption info is initialized on opendir(2) 2015-05-31 13:34:57 -04:00
ext4_crypto.h ext4 crypto: allocate bounce pages using GFP_NOWAIT 2015-06-03 09:32:39 -04:00
ext4_extents.h ext4: teach ext4_ext_find_extent() to realloc path if necessary 2014-09-01 14:40:09 -04:00
ext4_jbd2.c ext4: fix NULL pointer dereference when journal restart fails 2015-05-14 18:55:18 -04:00
ext4_jbd2.h ext4: don't use MAXQUOTAS value 2014-09-11 11:15:15 -04:00
ext4.h ext4: replace ext4_io_submit->io_op with ->io_wbc 2015-07-21 23:50:24 -04:00
extents_status.c ext4: fix data corruption caused by unwritten and delayed extents 2015-05-02 21:36:55 -04:00
extents_status.h ext4: introduce aging to extent status tree 2014-11-25 11:55:24 -05:00
extents.c Bug fixes (all for stable kernels) for ext4: 2015-07-05 16:24:54 -07:00
file.c xfs: update for 4.2-rc1 2015-06-30 20:16:08 -07:00
fsync.c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs 2015-04-26 17:22:07 -07:00
hash.c ext4: remove unused header files 2015-04-02 23:47:42 -04:00
ialloc.c ext4: Handle error from dquot_initialize() 2015-07-23 20:59:37 +02:00
indirect.c ext4: don't retry file block mapping on bigalloc fs with non-extent file 2015-06-21 21:10:51 -04:00
inline.c ext4 crypto: optimize filename encryption 2015-05-18 13:14:47 -04:00
inode.c Pretty much all bug fixes and clean ups for 4.3, after a lot of 2015-09-03 12:52:19 -07:00
ioctl.c ioctl_compat: handle FITRIM 2015-07-09 11:42:21 -07:00
Kconfig ext4: Improve ext4 Kconfig test 2015-07-23 20:59:40 +02:00
Makefile ext4 crypto: filename encryption facilities 2015-04-12 00:56:17 -04:00
mballoc.c Bug fixes (all for stable kernels) for ext4: 2015-07-05 16:24:54 -07:00
mballoc.h ext4: remove unused ac_ex_scanned 2014-02-20 13:32:10 -05:00
migrate.c ext4: correctly migrate a file with a hole at the beginning 2015-07-04 00:03:44 -04:00
mmp.c ext4: silence a format string false positive 2015-08-15 11:38:13 -04:00
move_extent.c ext4: make online defrag error reporting consistent 2015-06-21 21:38:03 -04:00
namei.c ext4: memory leak on error in ext4_symlink() 2015-07-27 14:30:45 +02:00
page-io.c Pretty much all bug fixes and clean ups for 4.3, after a lot of 2015-09-03 12:52:19 -07:00
readpage.c block: remove bio_get_nr_vecs() 2015-08-13 12:32:04 -06:00
resize.c ext4: fix growing of tiny filesystems 2015-05-02 23:58:32 -04:00
super.c fs: create and use seq_show_option for escaping 2015-09-04 16:54:41 -07:00
symlink.c A very large number of cleanups and bug fixes --- in particular for 2015-06-25 14:06:55 -07:00
truncate.h ext4: move common truncate functions to header file 2011-06-27 19:16:04 -04:00
xattr_security.c VFS: normal filesystems (and lustre): d_inode() annotations 2015-04-15 15:06:57 -04:00
xattr_trusted.c VFS: normal filesystems (and lustre): d_inode() annotations 2015-04-15 15:06:57 -04:00
xattr_user.c VFS: normal filesystems (and lustre): d_inode() annotations 2015-04-15 15:06:57 -04:00
xattr.c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs 2015-04-26 17:22:07 -07:00
xattr.h ext4 crypto: add encryption xattr support 2015-04-11 07:47:00 -04:00