## Vulnerability Overview **Software**: GNU Bison **Vulnerability Type**: Assertion Failure leading to Denial of Service
## Description This report documents a variant of the GNU Bison obprintf.c assertion failure vulnerability. this variant demonstrates different input conditions that trigger the identical assertion failure, confirming the widespread nature of the buffer management issue in Bison's obstack implementation. ## Technical Analysis ### Stack Trace ``` #0 __pthread_kill_implementation (no_tid=0, signo=6, threadid=140737351530368) at ./nptl/pthread_kill.c:44 #1 __pthread_kill_internal (signo=6, threadid=140737351530368) at ./nptl/pthread_kill.c:78 #2 __GI___pthread_kill (threadid=140737351530368, signo=signo@entry=6) at ./nptl/pthread_kill.c:89 #3 0x00007ffff7dc8476 in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26 #4 0x00007ffff7dae7f3 in __GI_abort () at ./stdlib/abort.c:79 #5 0x00007ffff7dae71b in __assert_fail_base (fmt=0x7ffff7f63130 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n", assertion=0x7ffff7f63c08 "size == (new_f.ofile.file.file._IO_write_end - new_f.ofile.file.file._IO_write_base)", file=0x7ffff7f5f416 "obprintf.c", line=158, function=<optimized out>) at ./assert/assert.c:94 #6 0x00007ffff7dbfe96 in __GI___assert_fail (assertion=assertion@entry=0x7ffff7f63c08 "size == (new_f.ofile.file.file._IO_write_end - new_f.ofile.file.file._IO_write_base)", file=file@entry=0x7ffff7f5f416 "obprintf.c", line=line@entry=158, function=function@entry=0x7ffff7f67740 <__PRETTY_FUNCTION__.1> "__obstack_vprintf_internal") at ./assert/assert.c:103 #7 0x00007ffff7e0e81a in __obstack_vprintf_internal (obstack=0x5555558656c0 <obstack_for_string>, format=0x55555555fab8 "]b4_lhs_value(orig %d, ", args=args@entry=0x7fffffff8200, mode_flags=2) at ./libio/obprintf.c:158 #8 0x00007ffff7ebc353 in __obstack_printf_chk (obstack=<optimized out>, flag=<optimized out>, format=<optimized out>) at ./debug/obprintf_chk.c:34 #9 0x00005555555f8c8b in handle_action_dollar (rule=0x555555887bd0, text=<optimized out>, dollar_loc=<optimized out>) at src/scan-code.l:661 #10 code_lex (self=0x555555887c68, sc_context=<optimized out>) at src/scan-code.l:171 #11 translate_action (self=0x555555887c68, sc_context=<optimized out>) at src/scan-code.l:768 #12 0x00005555555f8c8b in code_props_translate_code (self=0x555555887c68) #13 0x00005555555f0ffc in check_and_convert_grammar () at src/reader.c:1002 #14 reader (gram=<optimized out>) at src/reader.c:772 #15 0x00005555555a4f52 in main (argc=<optimized out>, argv=0x7fffffffdce8) at src/main.c:118 ``` ### Variant Analysis This variant exhibits the identical technical characteristics as the primary obprintf vulnerability: **Identical Assertion**: `size == (new_f.ofile.file.file._IO_write_end - new_f.ofile.file.file._IO_write_base)` **Same Failure Location**: obprintf.c:158 in `__obstack_vprintf_internal` **Same Call Chain**: `handle_action_dollar` → `obstack_printf_chk` → assertion failure ### Root Cause Confirmation The identical stack trace confirms that this is the same underlying vulnerability in Bison's obstack buffer management. The fact that different input files can trigger the same assertion failure demonstrates: 1. **Systemic Issue**: The buffer management problem is not tied to specific input patterns 2. **Multiple Trigger Paths**: Various grammar constructs can expose the vulnerability 3. **Widespread Impact**: The vulnerability affects different types of grammar files ## Proof of Concept The vulnerability variant can be triggered using the provided POC file: **File**: `POC_bison_obprintf_assertion_failure_variant`[ https://drive.google.com/file/d/1vaT0s1LChBK158jHycNIvedMQ6brdM3k/view?usp=drive_link ] **Reproduction Steps**: 1. Execute: `bison POC_bison_obprintf_assertion_failure_variant` 2. Observe the identical assertion failure as the primary vulnerability 3. Verify the same SIGABRT signal generation **Expected Output**: ``` bison: obprintf.c:158: __obstack_vprintf_internal: Assertion `size == (new_f.ofile.file.file._IO_write_end - new_f.ofile.file.file._IO_write_base)' failed. Aborted (core dumped) ``` ### Trigger Mechanism Despite the different grammar structure, the vulnerability is triggered through the same mechanism: 1. Grammar parsing reaches action code processing 2. `handle_action_dollar` function processes `$variable` references 3. Obstack buffer state becomes inconsistent during printf formatting 4. Assertion failure occurs in obprintf.c:158 ### *Credit Xudong Cao (UCAS) Yuqing Zhang (UCAS, Zhongguancun Laboratory)*