bytearray.strip() reads freed memory if the argument's __release_buffer__ resizes the bytearray

Aperta
#161,688 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
25/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Ferma
Stack tecnologico
c, python
Ambito
backend

Direzione di ricerca

Read the strip implementation at Objects/bytearrayobject.c:2460-2462 and inspect the existing bytearray strip tests. Check how buffer release can run Python code and resize the bytearray before the result is copied. Done when strip(), lstrip(), and rstrip() avoid the reported crash and return bytes consistent with the bounds they computed.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

interpreter-core type-crash
Crash report

bytearray.strip(chars) (and lstrip/rstrip) takes a pointer into the bytearray, finds the bounds, then releases the argument's buffer, and only then copies the bytes. If the argument's class defines __release_buffer__ (PEP 688), that release runs Python code, which can resize the bytearray and free the storage the pointer refers to.

ba = bytearray(b"x" * (1 << 22))

class S:
    def __buffer__(self, flags):
        return memoryview(b" ")
    def __release_buffer__(self, view):
        ba.clear()

ba.strip(S())   # segfault

Output: Segmentation fault, the same for lstrip and rstrip. With a small bytearray and an in-place write instead of clear(), the result is built from the modified bytes, not the ones the bounds were computed on.

Cause: Objects/bytearrayobject.c:2460-2462 calls PyBuffer_Release(&vbytes) before PyByteArray_FromStringAndSize(myptr + left, right - left). Copying first and releasing after would fix it.

CPython versions tested on:

3.15, CPython main branch

Operating systems tested on:

Linux

Output from running 'python -VV' on the command line:

Python 3.15.2 (tags/v3.15.2:5e58eaa, Nov 5 2026, 20:20:36) [GCC 11.4.0]


Found while building a Lean 4 model of CPython (https://broyojo.com/python-formalization/). AI tools (Claude and Codex) helped investigate the findings and prepare this report. The examples were rerun on CPython 3.15.2 and main, and the report received technical review. Record: bytesobj-bytearray-strip-release-uaf

Linked PRs
  • gh-161701
Lingua principale
Python
Stelle
78.2k
Fork
36.6k
Merge medio
19h 57m
PR unite (30g)
630

Preparare l'ambiente

Apri in Codespaces

Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di python/cpython

Tutte le issue di python/cpython

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.