Patch "pipe: actually allow root to exceed the pipe buffer limits" has been added to the 4.14-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
pipe: actually allow root to exceed the pipe buffer limits
to the 4.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
pipe-actually-allow-root-to-exceed-the-pipe-buffer-limits.patch
and it can be found in the queue-4.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
85c2dd5473b2718b4b63e74bfeb1ca876868e11fMon Sep 17 00:00:00 2001
From: Eric Biggers <[email protected]>
Date: Tue, 6 Feb 2018 15:41:53 -0800
Subject: pipe: actually allow root to exceed the pipe buffer limits
From: Eric Biggers <[email protected]>
commit 85c2dd5473b2718b4b63e74bfeb1ca876868e11f upstream.
pipe-user-pages-hard and pipe-user-pages-soft are only supposed to apply to unprivileged users, as documented in both Documentation/sysctl/fs.txt and the pipe(7) man page.
However, the capabilities are actually only checked when increasing a pipe's size using F_SETPIPE_SZ, not when creating a new pipe. Therefore, if pipe-user-pages-hard has been set, the root user can run into it and be unable to create pipes. Similarly, if pipe-user-pages-soft has been set, the root user can run into it and have their pipes limited to 1 page each.
Fix this by allowing the privileged override in both cases.
--- fs/pipe.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
fs/pipe.c +8 -3
@@ -618,6 +618,11 @@ static bool too_many_pipe_buffers_hard(ureturn pipe_user_pages_hard && user_bufs >= pipe_user_pages_hard; } +static bool is_unprivileged_user (void ) +{ +return !capable (CAP_SYS_RESOURCE ) && !capable (CAP_SYS_ADMIN ); +} +struct pipe_inode_info *alloc_pipe_info (void ) {struct pipe_inode_info *pipe;
@@ -634,12 +639,12 @@ struct pipe_inode_info *alloc_pipe_info( user_bufs =account_pipe_buffers (user,0 , pipe_bufs); -if (too_many_pipe_buffers_soft (user_bufs)) { +if (too_many_pipe_buffers_soft (user_bufs) &&is_unprivileged_user ()) { user_bufs =account_pipe_buffers (user, pipe_bufs,1 ); pipe_bufs =1 ; } -if (too_many_pipe_buffers_hard (user_bufs)) +if (too_many_pipe_buffers_hard (user_bufs) &&is_unprivileged_user ()) goto out_revert_acct; pipe->bufs = kcalloc(pipe_bufs, sizeof(struct pipe_buffer),
@@ -1069,7 +1074,7 @@ static long pipe_set_size(struct pipe_inif (nr_pages > pipe->buffers && (too_many_pipe_buffers_hard (user_bufs) ||too_many_pipe_buffers_soft (user_bufs)) && - !capable (CAP_SYS_RESOURCE ) && !capable (CAP_SYS_ADMIN )) { +is_unprivileged_user ()) { ret = -EPERM ; goto out_revert_acct; }
Patches currently in stable-queue which might be from [email protected] are
queue-4.14/pipe-fix-off-by-one-error-when-checking-buffer-limits.patch queue-4.14/crypto-hash-annotate-algorithms-taking-optional-key.patch queue-4.14/crypto-cryptd-pass-through-absence-of-setkey.patch queue-4.14/crypto-hash-prevent-using-keyed-hashes-without-setting-key.patch queue-4.14/ubifs-free-the-encrypted-symlink-target.patch queue-4.14/pipe-actually-allow-root-to-exceed-the-pipe-buffer-limits.patch queue-4.14/kernel-relay.c-revert-kernel-relay.c-fix-potential-memory-leak.patch queue-4.14/nfs-reject-request-for-id_legacy-key-without-auxdata.patch queue-4.14/crypto-poly1305-remove-setkey-method.patch queue-4.14/crypto-sha512-mb-initialize-pending-lengths-correctly.patch queue-4.14/crypto-hash-introduce-crypto_hash_alg_has_setkey.patch queue-4.14/crypto-mcryptd-pass-through-absence-of-setkey.patch