Project

General

Profile

Actions

Bug #22318

closed

heap uaf triggered in array.flatten

Bug #22318: heap uaf triggered in array.flatten

Added by danielchong (Daniel Chong) 5 days ago. Updated about 21 hours ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-core:126730]

Description

Hello, there seems to be a bug in Array's flatten function.

PoC:

a = (1..2000).to_a
bad = Object.new
$a = a
def bad.to_ary; $a.clear; [1,2,3]; end
a << bad       
a.flatten

ASAN output (truncated):

7==ERROR: AddressSanitizer: heap-buffer-overflow ...
READ of size 16000 ... thread T0
    #3 ary_memcpy0  array.c:354
    #4 ary_memcpy   array.c:371
    #5 flatten       array.c:6715            <-- USE (stale count i)
    #6 rb_ary_flatten array.c:6924
0x... is located 0 bytes after 256-byte region [...]
allocated by thread T0 here:
    #4 ary_heap_realloc  array.c:396
    #5 ary_resize_capa   array.c:439
    #6 rb_ary_clear      array.c:4988         <-- SHRINK (via to_ary)
    ...
    #18 convert_type_with_id       object.c:3303
    #21 rb_check_array_type        array.c:1032
    #22 flatten                    array.c:6705  <-- reentrant conversion

Updated by peterzhu2118 (Peter Zhu) 5 days ago Actions #1 [ruby-core:126733]

  • Backport changed from 3.3: UNKNOWN, 3.4: UNKNOWN, 4.0: UNKNOWN to 3.3: WONTFIX, 3.4: REQUIRED, 4.0: REQUIRED

Thank you for the bug report. I have a fix here. I have also requested backports to Ruby 3.4 and 4.0.

Updated by peterzhu2118 (Peter Zhu) 5 days ago Actions #2

  • Status changed from Open to Closed

Applied in changeset git|5eeaedc3d3014a12264aa252c751e14ba0fc5507.


Fix use-after-free when clearing array during flatten

[Bug #22318]

Array#flatten triggers an use-after-free it does not account for when the
call to rb_check_array_type modifies the source array. The following script
crashes:

a = (1..100_000).to_a
$a = a
bad = Object.new
def bad.to_ary; $a.clear; [1,2,3]; end
a << bad
a.flatten

Updated by nagachika (Tomoyuki Chikanaga) about 21 hours ago ยท Edited Actions #3 [ruby-core:126796]

  • Backport changed from 3.3: WONTFIX, 3.4: REQUIRED, 4.0: REQUIRED to 3.3: WONTFIX, 3.4: DONE, 4.0: REQUIRED

Updated by nagachika (Tomoyuki Chikanaga) about 21 hours ago Actions #4

  • Backport changed from 3.3: WONTFIX, 3.4: DONE, 4.0: REQUIRED to 3.3: WONTFIX, 3.4: REQUIRED, 4.0: REQUIRED

Updated by nagachika (Tomoyuki Chikanaga) about 21 hours ago Actions #5 [ruby-core:126803]

  • Backport changed from 3.3: WONTFIX, 3.4: REQUIRED, 4.0: REQUIRED to 3.3: WONTFIX, 3.4: DONE, 4.0: REQUIRED
Actions

Also available in: PDF Atom