python / python/cpython

Heap-buffer-overflow in the `hz` incremental decoder on a trailing `~`

未關閉
#157,325 1 則留言 0 個 reaction 已指派 1 人 在 GitHub 檢視

@StanFromIreland 已經在處理了。

開始於 2026年9月11日。

extension-modules type-bug
主要語言
Python
星號
77.2k
分支
36k
PR 合併指標
PR 指標待擷取

描述

Bug report

Bug description:
import codecs
d = codecs.getincrementaldecoder('hz')()
d.decode(b'~', False)   
d.decode(b'', True)
=================================================================
==1==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x5020000040d1 at pc 0xffff7feff068 bp 0xffffd608df50 sp 0xffffd608df40
READ of size 1 at 0x5020000040d1 thread T0
    #0 0xffff7feff064 in hz_decode Modules/cjkcodecs/_codecs_cn.c:417
    #1 0xffff7fe7426c in decoder_feed_buffer Modules/cjkcodecs/multibytecodec.c:921
    #2 0xffff7fe76238 in _multibytecodec_MultibyteIncrementalDecoder_decode_impl Modules/cjkcodecs/multibytecodec.c:1214
    #3 0xffff7fe76238 in _multibytecodec_MultibyteIncrementalDecoder_decode Modules/cjkcodecs/clinic/multibytecodec.c.h:395
    #4 0xaaaad3656320 in _PyObject_VectorcallTstate Include/internal/pycore_call.h:144
    #5 0xaaaad3656320 in PyObject_Vectorcall Objects/call.c:327
    #6 0xaaaad3ca1bc8 in _Py_VectorCallInstrumentation_StackRefSteal Python/ceval.c:768
    #7 0xaaaad33d1de8 in _PyEval_EvalFrameDefault Python/generated_cases.c.h:1906
    #8 0xaaaad3cc0b1c in _PyEval_EvalFrame Include/internal/pycore_ceval.h:122
    #9 0xaaaad3cc0b1c in _PyEval_Vector Python/ceval.c:2174
    #10 0xaaaad3cc0b1c in PyEval_EvalCode Python/ceval.c:679
    #11 0xaaaad3ebfeb4 in run_mod Python/pythonrun.c:1509
    #12 0xaaaad3ec0d38 in _PyRun_File Python/pythonrun.c:1332
    #13 0xaaaad3ec4ffc in _PyRun_SimpleFile Python/pythonrun.c:544
    #14 0xaaaad3ec8dd0 in _PyRun_AnyFile Python/pythonrun.c:92
    #15 0xaaaad3f9390c in pymain_run_file_obj Modules/main.c:478
    #16 0xaaaad3f9390c in pymain_run_file Modules/main.c:494
    #17 0xaaaad3f9390c in pymain_run_python Modules/main.c:804
    #18 0xaaaad3f9390c in Py_RunMain Modules/main.c:891
    #19 0xaaaad3f95c38 in pymain_main Modules/main.c:921
    #20 0xaaaad3f95c38 in Py_BytesMain Modules/main.c:945
    #21 0xffff82c484c0  (/lib/aarch64-linux-gnu/libc.so.6+0x284c0) (BuildId: 27027b96e5b8c475fc327aa445bea1c71d37b4e2)
    #22 0xffff82c48594 in __libc_start_main (/lib/aarch64-linux-gnu/libc.so.6+0x28594) (BuildId: 27027b96e5b8c475fc327aa445bea1c71d37b4e2)
    #23 0xaaaad343beec in _start (/src/cpython/python+0x183beec) (BuildId: eba909a3db0adabacf151d7dc3081dda7999191a)

0x5020000040d1 is located 0 bytes after 1-byte region [0x5020000040d0,0x5020000040d1)
allocated by thread T0 here:
    #0 0xffff835e76d0 in malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
    #1 0xffff7fe76090 in _multibytecodec_MultibyteIncrementalDecoder_decode_impl Modules/cjkcodecs/multibytecodec.c:1201
    #2 0xffff7fe76090 in _multibytecodec_MultibyteIncrementalDecoder_decode Modules/cjkcodecs/clinic/multibytecodec.c.h:395
    #3 0xaaaad3656320 in _PyObject_VectorcallTstate Include/internal/pycore_call.h:144
    #4 0xaaaad3656320 in PyObject_Vectorcall Objects/call.c:327
    #5 0xaaaad3ca1bc8 in _Py_VectorCallInstrumentation_StackRefSteal Python/ceval.c:768
    #6 0xaaaad33d1de8 in _PyEval_EvalFrameDefault Python/generated_cases.c.h:1906
    #7 0xaaaad3cc0b1c in _PyEval_EvalFrame Include/internal/pycore_ceval.h:122
    #8 0xaaaad3cc0b1c in _PyEval_Vector Python/ceval.c:2174
    #9 0xaaaad3cc0b1c in PyEval_EvalCode Python/ceval.c:679
    #10 0xaaaad3ebfeb4 in run_mod Python/pythonrun.c:1509
    #11 0xaaaad3ec0d38 in _PyRun_File Python/pythonrun.c:1332
    #12 0xaaaad3ec4ffc in _PyRun_SimpleFile Python/pythonrun.c:544
    #13 0xaaaad3ec8dd0 in _PyRun_AnyFile Python/pythonrun.c:92
    #14 0xaaaad3f9390c in pymain_run_file_obj Modules/main.c:478
    #15 0xaaaad3f9390c in pymain_run_file Modules/main.c:494
    #16 0xaaaad3f9390c in pymain_run_python Modules/main.c:804
    #17 0xaaaad3f9390c in Py_RunMain Modules/main.c:891
    #18 0xaaaad3f95c38 in pymain_main Modules/main.c:921
    #19 0xaaaad3f95c38 in Py_BytesMain Modules/main.c:945
    #20 0xffff82c484c0  (/lib/aarch64-linux-gnu/libc.so.6+0x284c0) (BuildId: 27027b96e5b8c475fc327aa445bea1c71d37b4e2)
    #21 0xffff82c48594 in __libc_start_main (/lib/aarch64-linux-gnu/libc.so.6+0x28594) (BuildId: 27027b96e5b8c475fc327aa445bea1c71d37b4e2)
    #22 0xaaaad343beec in _start (/src/cpython/python+0x183beec) (BuildId: eba909a3db0adabacf151d7dc3081dda7999191a)

SUMMARY: AddressSanitizer: heap-buffer-overflow Modules/cjkcodecs/_codecs_cn.c:417 in hz_decode
Shadow bytes around the buggy address:
  0x502000003e00: fa fa fd fd fa fa fd fd fa fa fd fd fa fa fd fd
  0x502000003e80: fa fa fd fa fa fa fd fd fa fa fd fa fa fa fd fa
  0x502000003f00: fa fa fd fa fa fa fd fa fa fa fd fa fa fa fd fa
  0x502000003f80: fa fa fd fa fa fa fd fa fa fa fd fa fa fa fd fa
  0x502000004000: fa fa fd fa fa fa fd fd fa fa fd fa fa fa fd fa
=>0x502000004080: fa fa fd fa fa fa fd fa fa fa[01]fa fa fa fa fa
  0x502000004100: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x502000004180: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x502000004200: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x502000004280: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x502000004300: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
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
==1==ABORTING
CPython versions tested on:

CPython main branch

Operating systems tested on:

Linux

Linked PRs
  • gh-157333

貢獻指南

開啟貢獻指南

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

評估

這個 Issue 還沒有評估資料。

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。