[BUG] heap-use-after-free(read) pstrcmp() src/mystring.c

Aleksander Ushakov <[email protected]> Fri, 30 May 2025 20:37:09 +0300
Newsgroups org.kernel.vger.dash
Message-ID <[email protected]>
Hello Dash maintainers,

I encountered a bug in Dash in commit fd725b7a75 and would like to 
report it. The details are provided below.
The target crashed when reading from memory after it has been freed.
==119==ERROR: AddressSanitizer: heap-use-after-free on address 
0x515000008f08 at pc 0x62b3e92a9f96 bp 0x7ffe2076bc00 sp 0x7ffe2076b3b0
READ of size 1 at 0x515000008f08 thread T0
     #0 0x62b3e92a9f95 in __interceptor_strcmp 
../../../../src/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:466
     #1 0x62b3e9353a34 in bsearch 
/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h:33
     #2 0x62b3e9353a34 in findstring /upstream/dash/src/mystring.c:260
     #3 0x62b3e935c140 in readtoken /upstream/dash/src/parser.c:737
     #4 0x62b3e935ce76 in list /upstream/dash/src/parser.c:181
     #5 0x62b3e936072e in readtoken1 /upstream/dash/src/parser.c:1587
     #6 0x62b3e93693ff in parseheredoc /upstream/dash/src/parser.c:690
     #7 0x62b3e93601d6 in readtoken1 /upstream/dash/src/parser.c:1597
     #8 0x62b3e9369bc3 in xxreadtoken /upstream/dash/src/parser.c:843
     #9 0x62b3e935bfb6 in readtoken /upstream/dash/src/parser.c:711
     #10 0x62b3e935ce76 in list /upstream/dash/src/parser.c:181
     #11 0x62b3e934a242 in cmdloop /upstream/dash/src/main.c:223
     #12 0x62b3e922543c in main /upstream/dash/src/main.c:180
     #13 0x7ab34e084249 in __libc_start_call_main 
../sysdeps/nptl/libc_start_call_main.h:58
     #14 0x7ab34e084304 in __libc_start_main_impl ../csu/libc-start.c:360
     #15 0x62b3e9226520 in _start (/upstream/dash/src/dash+0x1a520)

0x515000008f08 is located 8 bytes inside of 512-byte region 
[0x515000008f00,0x515000009100)
freed by thread T0 here:
     #0 0x62b3e92b9068 in __interceptor_free 
../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:52
     #1 0x62b3e934c8cd in popstackmark /upstream/dash/src/memalloc.c:187

previously allocated by thread T0 here:
     #0 0x62b3e92ba38f in __interceptor_malloc 
../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
     #1 0x62b3e934b728 in ckmalloc /upstream/dash/src/memalloc.c:66

SUMMARY: AddressSanitizer: heap-use-after-free 
../../../../src/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:466 
in __interceptor_strcmp


Environment:
Debian-12, x86-64
afl-clang-lto compiler AFL++ project

Steps to reproduce:

export CC=afl-clang-lto
export AFL_USE_ASAN=1
./autogen.sh
./configure
make
cd src
./debian -i crash.txt

Steps to generate crash.txt:
copy the text into file bs64.txt
=====================================================================================
fWZmZmZmZmZmZmZmZmZmb289YGNhdCA8PEVPKApoaQojYSQoMSAvdGhVCnVjLjIKcHJpbnRmICIl
IyouKmZcIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJp
YnV0ZSBpdCBhbl0vb3IgbW9kaWZ5CiMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojICAgdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKIyAgIChh
dCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyAgIFRoaXMgcHJvZ3JhbSBpcyBk
aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojICAgYnV0IFdJ
VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK
IyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g
IFNlZSB0aGUKIyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMu
CiMKIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlCiMgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2Vl
IDxodHRwOi8vd3d3d3dudS5vcmcvbGljZW5zZXMvPi4KIwp4PXgKZT0KCnJlY2hvICR7eDorIiJ9
CnJlY2hvICR7eDorICIifQpyZWNobyAke3g6KyIiIH0KcmVjaG8gJHt4OisiJGUifQpyZWNobyAk
e3g6KyAiJGUifQpyZWNobyAke3g64ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODgKyIkZSIi
JGUiIiJ9CnJlY2hvICR7eDorIiRlIiIkZSIiIn0KcmVjaG8gJHt4OisiJGUiICIkZSIiIn0KcmVj
aG8gJHt4OisiJGUiIiRlIiAiIn0KcmVjaG8gJHt4OisgIiRlIiIkZSIiIn0KCmVjaG8gPT09PT0K
cmVjaG8gJHt4OisnJ14KcmVjaG8gJHt4OisgJyd9CnJlY2hvICR7eDorJycgfQpyZWNobyAke3g6
KycnICcnfQoKcmVjaG8gJHt4OiskZScnfQpyZWNobyAke3g6KycnJGV9CgpyZWNobyAke3g6Kycn
JGUgJGUnJ30KCmVjaG8gPT09PT0KcmVjaG8gJHt4OisiJCg6KSJ9CnJlY2hvICR7eDorICIkKDop
In0uCiMKeD14CmU9CisiJCg6KSIiJCg6KSIiIn0KcmVjaG8gJHt4OisiJCg6KSIiJCg6KSIiIn0K
cmVjaG8gJHt4OisiJCg6KSIgIiQoOikiIiJ9CnJlY2hvICR7eDorIiQoOikiIiQoOikiICIifQpy
ZWNobyAke3g6KyAiJCg6KSIiJCg6KSIiIn0KCmVjaG8gPT09PT0KcmVjaG8gJHt4OisiYDpgIn0K
cmVjaG8gJHt4OisgImA6YCJ9CnJlY2hvICR7eDorImA6YCIiYDpgIiIifQpyZWNobyAke3g6KyJg
OmAiImA6YCIiIn0KcmVjaG8gJG54OisiYDpg
======================================================================================
Then do the action:
base64 -d bs64.txt > crash.txt