mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Jeff Layton <jlayton@kernel.org>
To: Hyunsol Mun <muumthf@gmail.com>, Chuck Lever <cel@kernel.org>,
	NeilBrown <neil@brown.name>,
	Olga Kornievskaia <okorniev@redhat.com>,
	Dai Ngo <Dai.Ngo@oracle.com>, Tom Talpey <tom@talpey.com>
Cc: linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org,
	 stable@vger.kernel.org, bobtobabz@gmail.com
Subject: Re: [PATCH] nfsd: truncate LISTXATTRS replies on error
Date: Wed, 21 Oct 2026 10:58:22 -0400	[thread overview]
Message-ID: <b63858bd8260934ce26def00112db9ffce380198.camel@kernel.org> (raw)
In-Reply-To: <20261021023715.315727-1-muumthf@gmail.com>

On Wed, 2026-10-21 at 11:37 +0900, Hyunsol Mun wrote:
> nfsd4_encode_listxattrs() reserves 12 bytes for the reply cookie and
> array count before it starts encoding attribute names. If the first user
> attribute name does not fit in the client's maxcount, the encoder returns
> NFS4ERR_TOOSMALL without initializing the reservation.
> 
> The generic COMPOUND encoder does not truncate replies for this error, so
> the reserved bytes are transmitted after the operation status and can
> disclose stale reply-buffer contents.
> 
> Save the XDR length on entry and restore it whenever the LISTXATTRS
> encoder returns an error. This also discards partial output from other
> errors after encoding has started.
> 
> Validation used nfsd-testing b4e06bef3884. On the unpatched x86_64
> kernel, all 1,000 NFS4ERR_TOOSMALL replies contained the extra 12-byte
> body. The leaked windows reconstructed another client's exact session ID
> and enabled cached OPEN replay, stateid use, creation of a new session
> for the victim client, and callback-state modification.
> 
> With this patch, two runs totaling 2,000 NFS4ERR_TOOSMALL replies
> contained no extra body or leak window, so session reconstruction
> failed. The victim's cached OPEN completed normally in both runs.
> 
> A patched-kernel smoke run also completed a successful LISTXATTRS
> through an NFSv4.2 mount. NFSv4.2 and NFSv3 read/write/unmount tests
> passed. All test kernels built with GCC 13.3 and CONFIG_WERROR, and no
> kernel warning, Oops, or panic occurred. The reproducer and complete
> logs are available privately on request.
> 
> The vulnerability research and validation were conducted by members of
> the Tobabz team as part of the Best of the Best 15th program.
> 
> Fixes: 23e50fe3a5e6 ("nfsd: implement the xattr functions and en/decode logic")
> Cc: stable@vger.kernel.org
> Assisted-by: LLM
> Signed-off-by: Hyunsol Mun <muumthf@gmail.com>
> ---
>  fs/nfsd/nfs4xdr.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
> index c4fd840da4d9..c7c2be555b59 100644
> --- a/fs/nfsd/nfs4xdr.c
> +++ b/fs/nfsd/nfs4xdr.c
> @@ -6438,6 +6438,7 @@ nfsd4_encode_listxattrs(struct nfsd4_compoundres *resp, __be32 nfserr,
>  {
>  	struct nfsd4_listxattrs *listxattrs = &u->listxattrs;
>  	struct xdr_stream *xdr = resp->xdr;
> +	unsigned int starting_len = xdr->buf->len;
>  	u32 cookie_offset, count_offset, eof;
>  	u32 left, xdrleft, slen, count;
>  	u32 xdrlen, offset;
> @@ -6545,6 +6546,8 @@ nfsd4_encode_listxattrs(struct nfsd4_compoundres *resp, __be32 nfserr,
>  out:
>  	if (listxattrs->lsxa_len)
>  		kvfree(listxattrs->lsxa_buf);
> +	if (status)
> +		xdr_truncate_encode(xdr, starting_len);
>  	return status;
>  }
>  
> 
> base-commit: b4e06bef38843c8b909d0b4317dfaaf87dba6d72

Reviewed-by: Jeff Layton <jlayton@kernel.org>

      parent reply	other threads:[~2026-10-21 14:58 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-21  2:37 Hyunsol Mun
2026-10-21 14:56 ` Chuck Lever
2026-10-21 14:58 ` Jeff Layton [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=b63858bd8260934ce26def00112db9ffce380198.camel@kernel.org \
    --to=jlayton@kernel.org \
    --cc=Dai.Ngo@oracle.com \
    --cc=bobtobabz@gmail.com \
    --cc=cel@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=muumthf@gmail.com \
    --cc=neil@brown.name \
    --cc=okorniev@redhat.com \
    --cc=stable@vger.kernel.org \
    --cc=tom@talpey.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®