[BUG] DVB subtitle decoder: heap-buffer-overflow write in dvbsub_parse_clut_segment via unbounded entry_id
I maintainer di solito rispondono entro 2 giorni
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 72/100
Direzione di ricerca
Inizia da dvbsub_parse_clut_segment() in src/lib_ccx/dvb_subtitle_decoder.c, dove entry_id indicizza gli array clut4, ilut4, clut16 e ilut16 di DVBSubCLUT senza un controllo dell'intervallo. Leggi la definizione della struct DVBSubCLUT per confermare la dimensione degli array. Il lavoro è completato quando ogni ramo a 2 bit e a 4 bit rifiuta un entry_id fuori intervallo prima di scrivere, e un segmento CLUT costruito ad arte non corrompe più la memoria. Trattandosi di una segnalazione di sicurezza, chiedi ai maintainer come gestire la correzione e l'eventuale test.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Summary
In src/lib_ccx/dvb_subtitle_decoder.c, dvbsub_parse_clut_segment() writes palette entries into fixed-size arrays (clut4, ilut4, clut16, ilut16) using the stream-supplied entry_id byte without verifying that entry_id fits within the array bounds.
When a DVB subtitle stream declares 2-bit depth (depth & 0x80) or 4-bit depth (depth & 0x40), an entry_id >= 4 or entry_id >= 16 causes an out-of-bounds write on the heap, corrupting adjacent members of DVBSubCLUT including the clut->next heap linked-list pointer.
Vulnerability Details
- Affected file:
src/lib_ccx/dvb_subtitle_decoder.c - Function:
dvbsub_parse_clut_segment() - CWE: CWE-787: Out-of-bounds Write (Heap-based Buffer Overflow)
DVBSubCLUT is defined as:
typedef struct DVBSubCLUT
{
int id;
int version;
uint32_t clut4[4]; // 2-bit palette: 4 entries (indices 0..3)
uint32_t clut16[16]; // 4-bit palette: 16 entries (indices 0..15)
uint32_t clut256[256];
uint8_t ilut4[4]; // 2-bit luma: 4 entries (indices 0..3)
uint8_t ilut16[16]; // 4-bit luma: 16 entries (indices 0..15)
uint8_t ilut256[256];
struct DVBSubCLUT *next; // heap linked-list pointer
} DVBSubCLUT;
In dvbsub_parse_clut_segment():
while (buf + 4 < buf_end)
{
entry_id = *buf++; // stream-supplied byte (0..255)
depth = (*buf) & 0xe0;
...
if (depth & 0x80) // 2-bit CLUT
{
clut->clut4[entry_id] = RGBA(r, g, b, 255 - alpha); // OOB write if entry_id >= 4
clut->ilut4[entry_id] = y; // OOB write if entry_id >= 4
}
else if (depth & 0x40) // 4-bit CLUT
{
clut->clut16[entry_id] = RGBA(r, g, b, 255 - alpha); // OOB write if entry_id >= 16
clut->ilut16[entry_id] = y; // OOB write if entry_id >= 16
}
else if (depth & 0x20)
{
clut->clut256[entry_id] = RGBA(r, g, b, 255 - alpha);
clut->ilut256[entry_id] = y;
}
}
- 2-bit CLUT (
depth & 0x80):clut4andilut4have only 4 elements. Ifentry_idis between 4 and 255,clut->clut4[entry_id]writes past the allocated space. - 4-bit CLUT (
depth & 0x40):clut16andilut16have only 16 elements. Ifentry_idis between 16 and 255,clut->clut16[entry_id]writes past the allocated space. - In both cases, the out-of-bounds write overwrites the heap next pointer (
clut->next), leading to crashes or memory corruption during subsequent list traversal or cleanup indvbsub_free().
Reachability
In standard MPEG transport streams with DVB subtitles (stream type 0x06 and DVB subtitling descriptor 0x59), PES packets carrying subtitle segment type 0x12 (DVB_SUB_SEGMENT_CLUT) are decoded by dvbsub_decode() in src/lib_ccx/dvb_subtitle_decoder.c, reaching dvbsub_parse_clut_segment() on the default configuration.
Suggested Fix
Add bounds validation for entry_id against the palette capacity for both 2-bit and 4-bit entries:
--- a/src/lib_ccx/dvb_subtitle_decoder.c
+++ b/src/lib_ccx/dvb_subtitle_decoder.c
@@ -1216,11 +1216,21 @@ static int dvbsub_parse_clut_segment(void *dvb_ctx, const uint8_t *buf,
if (depth & 0x80)
{
+ if (entry_id >= 4)
+ {
+ mprint("dvbsub_parse_clut_segment(): entry_id %d exceeds 2-bit CLUT bounds\n", entry_id);
+ return -1;
+ }
clut->clut4[entry_id] = RGBA(r, g, b, 255 - alpha);
clut->ilut4[entry_id] = y;
}
else if (depth & 0x40)
{
+ if (entry_id >= 16)
+ {
+ mprint("dvbsub_parse_clut_segment(): entry_id %d exceeds 4-bit CLUT bounds\n", entry_id);
+ return -1;
+ }
clut->clut16[entry_id] = RGBA(r, g, b, 255 - alpha);
clut->ilut16[entry_id] = y;
}
- Lingua principale
- C
- Stelle
- 912
- Fork
- 598
- Merge medio
- 1g 23h
- PR unite (30g)
- 25
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di CCExtractor/ccextractor
-
Heap OOB read in parse_ad_cdp: cc_count not bounded by packet lengthForse già presa @Anurag-S1ngh l’ha presa 2 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
CCExtractor/ccextractor#2425 · 3 commenti ·
I maintainer di solito rispondono entro 2 giorni
-
[BUG] Heap buffer overflow in parse_PMT with C0/C1 section lengthForse già presa @kun-codes l’ha presa 10 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
CCExtractor/ccextractor#2419 ·
I maintainer di solito rispondono entro 2 giorni
-
[BUG] Filename sequence expansion (`+`) panics on numeric values exceeding `i32::MAX`Forse già presa @muntasir-396 l’ha presa 14 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
CCExtractor/ccextractor#2402 ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 18/100
CCExtractor/ccextractor#2447 ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 15/100
CCExtractor/ccextractor#2446 ·
I maintainer di solito rispondono entro 2 giorni
Tutte le issue di CCExtractor/ccextractor
Issue simili
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
pocoproject/poco#5626 ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
FujiNetWIFI/fujinet-lib#272 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
facebookincubator/muse-gadget-sdk#301 ·
I maintainer di solito rispondono entro 2 giorni
-
luaebpf: the by-example page's intro names two outcomes of a lowering and omits the stop with the default verdictForse già presa Una pull request collegata a questa issue è aperta o già unita. Apertadocumentation severity: low
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 88/100
luainkernel/lunatik#2231 ·
I maintainer di solito rispondono entro 1 giorno
-
aspect ratio 16:10Apertaenhancement
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
Revivedx/SavageWindRecomp#402 ·
I maintainer di solito rispondono entro 1 giorno