Re: [PATCH] ash: fix out-of-bounds read in ifsbreakup()

Sanghyun Park via busybox <[email protected]> Tue, 16 Jun 2026 23:09:47 +0900
Newsgroups gmane.linux.busybox
Message-ID <[email protected]>
On 6/16/26 15:22, Harald van Dijk wrote:
> It should not be possible for the last byte in a recorded region to be
> an unescaped CTLESC. Do you have a test case for what this patch fixes?

Thanks, you are right. The CTLESC-at-the-end explanation was wrong for
this reproducer, and the extra CTLESC guards in my original patch were not
justified.

The issue I can reproduce is stale IFS region state. argstr() raises an
arithmetic syntax error after IFS regions have been recorded, and the
longjmp skips expandarg()'s final ifsfree(). A later expansion then reuses
the stack for a shorter string, while ifsbreakup() still walks the stale
offsets.

Test case:

  base64 -d > poc.sh <<'EOF'
  IyEvYmJiAS0tIGE6YjpjCmVjZSA8PCB2Yf+AYWJsZSBhbmQ7YUVPRgpoZW4KRU9cCmVjaG8AJC0t
  LS0tLS0tYjpjCiR7XzooKDdiACByZWEtLS1iOmMKJQskJCQIJCQkCCQkI3t9Ch0/Yw==
  EOF
  busybox ash poc.sh

With an ASAN build, this reports a heap-buffer-overflow in ifsbreakup():

  ERROR: AddressSanitizer: heap-buffer-overflow
  READ of size 1
  #0 ifsbreakup shell/ash.c:6463

So I will send a v2 that removes the CTLESC-specific claim and guards.
The v2 only caps each saved IFS region to the current stack block.

Thanks,
Sanghyun