Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* [FFmpeg-devel] CBS
@ 2024-08-06 17:05 Michael Niedermayer
  2024-08-06 17:38 ` Michael Niedermayer
  0 siblings, 1 reply; 9+ messages in thread
From: Michael Niedermayer @ 2024-08-06 17:05 UTC (permalink / raw)
  To: FFmpeg development discussions and patches


[-- Attachment #1.1: Type: text/plain, Size: 1283 bytes --]

Hi

Did CBS win the obfuscated C contest yet?

I was just looking at a msan issue and then looked at this:

CHECK(FUNC_SEI(message_list)(ctx, rw, &current->message_list, 1));


#define CHECK(call) do { \
        err = (call); \
        if (err < 0) \
            return err; \
    } while (0)

#define FUNC_NAME2(rw, codec, name) cbs_ ## codec ## _ ## rw ## _ ## name
#define FUNC_NAME1(rw, codec, name) FUNC_NAME2(rw, codec, name)
#define FUNC_H264(name) FUNC_NAME1(READWRITE, h264, name)
#define FUNC_H265(name) FUNC_NAME1(READWRITE, h265, name)
#define FUNC_H266(name) FUNC_NAME1(READWRITE, h266, name)
#define FUNC_SEI(name)  FUNC_NAME1(READWRITE, sei,  name)

#define SEI_FUNC(name, args) \
static int FUNC(name) args;  \
static int FUNC(name ## _internal)(CodedBitstreamContext *ctx, \
                                   RWContext *rw, void *cur,   \
                                   SEIMessageState *state)     \
{ \
    return FUNC(name)(ctx, rw, cur, state); \
} \
static int FUNC(name) args


anyway, can we remove all preprocessor use from cbs ?

thx

--
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Dictatorship naturally arises out of democracy, and the most aggravated
form of tyranny and slavery out of the most extreme liberty. -- Plato

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]

[-- Attachment #2: Type: text/plain, Size: 251 bytes --]

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [FFmpeg-devel] CBS
  2024-08-06 17:05 [FFmpeg-devel] CBS Michael Niedermayer
@ 2024-08-06 17:38 ` Michael Niedermayer
  2024-08-06 17:54   ` Andreas Rheinhardt
  0 siblings, 1 reply; 9+ messages in thread
From: Michael Niedermayer @ 2024-08-06 17:38 UTC (permalink / raw)
  To: FFmpeg development discussions and patches


[-- Attachment #1.1: Type: text/plain, Size: 1828 bytes --]

On Tue, Aug 06, 2024 at 07:05:38PM +0200, Michael Niedermayer wrote:
> Hi
> 
> Did CBS win the obfuscated C contest yet?
> 
> I was just looking at a msan issue and then looked at this:
> 
> CHECK(FUNC_SEI(message_list)(ctx, rw, &current->message_list, 1));
> 
> 
> #define CHECK(call) do { \
>         err = (call); \
>         if (err < 0) \
>             return err; \
>     } while (0)
> 
> #define FUNC_NAME2(rw, codec, name) cbs_ ## codec ## _ ## rw ## _ ## name
> #define FUNC_NAME1(rw, codec, name) FUNC_NAME2(rw, codec, name)
> #define FUNC_H264(name) FUNC_NAME1(READWRITE, h264, name)
> #define FUNC_H265(name) FUNC_NAME1(READWRITE, h265, name)
> #define FUNC_H266(name) FUNC_NAME1(READWRITE, h266, name)
> #define FUNC_SEI(name)  FUNC_NAME1(READWRITE, sei,  name)
> 
> #define SEI_FUNC(name, args) \
> static int FUNC(name) args;  \
> static int FUNC(name ## _internal)(CodedBitstreamContext *ctx, \
>                                    RWContext *rw, void *cur,   \
>                                    SEIMessageState *state)     \
> { \
>     return FUNC(name)(ctx, rw, cur, state); \
> } \
> static int FUNC(name) args
> 
> 
> anyway, can we remove all preprocessor use from cbs ?

the issue iam looking at is due to

SEI_FUNC(sei_pic_timing, (CodedBitstreamContext *ctx, RWContext *rw, H264RawSEIPicTiming *current, SEIMessageState *sei))

having different active SPS on writing than reading, so the write code
has nal_hrd_parameters_present_flag set while the read had that 0
so uninitialized data is written

I cannot find any match for "cbs" in MAINTAINERS, also there are no copyright
with names in the cbs code.

thx

[...]

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

You can kill me, but you cannot change the truth.

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]

[-- Attachment #2: Type: text/plain, Size: 251 bytes --]

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [FFmpeg-devel] CBS
  2024-08-06 17:38 ` Michael Niedermayer
@ 2024-08-06 17:54   ` Andreas Rheinhardt
  2024-08-06 18:04     ` James Almer
  2024-08-06 18:12     ` Michael Niedermayer
  0 siblings, 2 replies; 9+ messages in thread
From: Andreas Rheinhardt @ 2024-08-06 17:54 UTC (permalink / raw)
  To: ffmpeg-devel

Michael Niedermayer:
> On Tue, Aug 06, 2024 at 07:05:38PM +0200, Michael Niedermayer wrote:
>> Hi
>>
>> Did CBS win the obfuscated C contest yet?
>>
>> I was just looking at a msan issue and then looked at this:
>>
>> CHECK(FUNC_SEI(message_list)(ctx, rw, &current->message_list, 1));
>>
>>
>> #define CHECK(call) do { \
>>         err = (call); \
>>         if (err < 0) \
>>             return err; \
>>     } while (0)
>>
>> #define FUNC_NAME2(rw, codec, name) cbs_ ## codec ## _ ## rw ## _ ## name
>> #define FUNC_NAME1(rw, codec, name) FUNC_NAME2(rw, codec, name)
>> #define FUNC_H264(name) FUNC_NAME1(READWRITE, h264, name)
>> #define FUNC_H265(name) FUNC_NAME1(READWRITE, h265, name)
>> #define FUNC_H266(name) FUNC_NAME1(READWRITE, h266, name)
>> #define FUNC_SEI(name)  FUNC_NAME1(READWRITE, sei,  name)
>>
>> #define SEI_FUNC(name, args) \
>> static int FUNC(name) args;  \
>> static int FUNC(name ## _internal)(CodedBitstreamContext *ctx, \
>>                                    RWContext *rw, void *cur,   \
>>                                    SEIMessageState *state)     \
>> { \
>>     return FUNC(name)(ctx, rw, cur, state); \
>> } \
>> static int FUNC(name) args
>>
>>
>> anyway, can we remove all preprocessor use from cbs ?

I don't think that this is really obfuscated.

> 
> the issue iam looking at is due to
> 
> SEI_FUNC(sei_pic_timing, (CodedBitstreamContext *ctx, RWContext *rw, H264RawSEIPicTiming *current, SEIMessageState *sei))
> 
> having different active SPS on writing than reading, so the write code
> has nal_hrd_parameters_present_flag set while the read had that 0
> so uninitialized data is written
> 
> I cannot find any match for "cbs" in MAINTAINERS, also there are no copyright
> with names in the cbs code.

1. I just sent a patch that "fixes" this.
2. But actually, there is a deeper bug here: We would need to defer
parsing certain SEI message units to a second pass when the currently
active SPS is known. This can happen with spec-compliant input (and even
more so with spec-incompliant input, which is presumably what the fuzzer
produced).

- Andreas

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [FFmpeg-devel] CBS
  2024-08-06 17:54   ` Andreas Rheinhardt
@ 2024-08-06 18:04     ` James Almer
  2024-08-06 18:41       ` Andreas Rheinhardt
  2024-08-06 18:12     ` Michael Niedermayer
  1 sibling, 1 reply; 9+ messages in thread
From: James Almer @ 2024-08-06 18:04 UTC (permalink / raw)
  To: ffmpeg-devel

On 8/6/2024 2:54 PM, Andreas Rheinhardt wrote:
> Michael Niedermayer:
>> On Tue, Aug 06, 2024 at 07:05:38PM +0200, Michael Niedermayer wrote:
>>> Hi
>>>
>>> Did CBS win the obfuscated C contest yet?
>>>
>>> I was just looking at a msan issue and then looked at this:
>>>
>>> CHECK(FUNC_SEI(message_list)(ctx, rw, &current->message_list, 1));
>>>
>>>
>>> #define CHECK(call) do { \
>>>          err = (call); \
>>>          if (err < 0) \
>>>              return err; \
>>>      } while (0)
>>>
>>> #define FUNC_NAME2(rw, codec, name) cbs_ ## codec ## _ ## rw ## _ ## name
>>> #define FUNC_NAME1(rw, codec, name) FUNC_NAME2(rw, codec, name)
>>> #define FUNC_H264(name) FUNC_NAME1(READWRITE, h264, name)
>>> #define FUNC_H265(name) FUNC_NAME1(READWRITE, h265, name)
>>> #define FUNC_H266(name) FUNC_NAME1(READWRITE, h266, name)
>>> #define FUNC_SEI(name)  FUNC_NAME1(READWRITE, sei,  name)
>>>
>>> #define SEI_FUNC(name, args) \
>>> static int FUNC(name) args;  \
>>> static int FUNC(name ## _internal)(CodedBitstreamContext *ctx, \
>>>                                     RWContext *rw, void *cur,   \
>>>                                     SEIMessageState *state)     \
>>> { \
>>>      return FUNC(name)(ctx, rw, cur, state); \
>>> } \
>>> static int FUNC(name) args
>>>
>>>
>>> anyway, can we remove all preprocessor use from cbs ?
> 
> I don't think that this is really obfuscated.
> 
>>
>> the issue iam looking at is due to
>>
>> SEI_FUNC(sei_pic_timing, (CodedBitstreamContext *ctx, RWContext *rw, H264RawSEIPicTiming *current, SEIMessageState *sei))
>>
>> having different active SPS on writing than reading, so the write code
>> has nal_hrd_parameters_present_flag set while the read had that 0
>> so uninitialized data is written
>>
>> I cannot find any match for "cbs" in MAINTAINERS, also there are no copyright
>> with names in the cbs code.
> 
> 1. I just sent a patch that "fixes" this.
> 2. But actually, there is a deeper bug here: We would need to defer
> parsing certain SEI message units to a second pass when the currently
> active SPS is known. This can happen with spec-compliant input (and even

Is this a scenario where a slice that referenced an SPS was parsed, then 
a SEI message, then another slice that references another SPS, and the 
SEI expects the latter to be active despite it being coded before the slice?

> more so with spec-incompliant input, which is presumably what the fuzzer
> produced).
> 
> - Andreas
> 
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [FFmpeg-devel] CBS
  2024-08-06 17:54   ` Andreas Rheinhardt
  2024-08-06 18:04     ` James Almer
@ 2024-08-06 18:12     ` Michael Niedermayer
  1 sibling, 0 replies; 9+ messages in thread
From: Michael Niedermayer @ 2024-08-06 18:12 UTC (permalink / raw)
  To: FFmpeg development discussions and patches


[-- Attachment #1.1: Type: text/plain, Size: 2879 bytes --]

On Tue, Aug 06, 2024 at 07:54:58PM +0200, Andreas Rheinhardt wrote:
> Michael Niedermayer:
> > On Tue, Aug 06, 2024 at 07:05:38PM +0200, Michael Niedermayer wrote:
> >> Hi
> >>
> >> Did CBS win the obfuscated C contest yet?
> >>
> >> I was just looking at a msan issue and then looked at this:
> >>
> >> CHECK(FUNC_SEI(message_list)(ctx, rw, &current->message_list, 1));
> >>
> >>
> >> #define CHECK(call) do { \
> >>         err = (call); \
> >>         if (err < 0) \
> >>             return err; \
> >>     } while (0)
> >>
> >> #define FUNC_NAME2(rw, codec, name) cbs_ ## codec ## _ ## rw ## _ ## name
> >> #define FUNC_NAME1(rw, codec, name) FUNC_NAME2(rw, codec, name)
> >> #define FUNC_H264(name) FUNC_NAME1(READWRITE, h264, name)
> >> #define FUNC_H265(name) FUNC_NAME1(READWRITE, h265, name)
> >> #define FUNC_H266(name) FUNC_NAME1(READWRITE, h266, name)
> >> #define FUNC_SEI(name)  FUNC_NAME1(READWRITE, sei,  name)
> >>
> >> #define SEI_FUNC(name, args) \
> >> static int FUNC(name) args;  \
> >> static int FUNC(name ## _internal)(CodedBitstreamContext *ctx, \
> >>                                    RWContext *rw, void *cur,   \
> >>                                    SEIMessageState *state)     \
> >> { \
> >>     return FUNC(name)(ctx, rw, cur, state); \
> >> } \
> >> static int FUNC(name) args
> >>
> >>
> >> anyway, can we remove all preprocessor use from cbs ?
> 
> I don't think that this is really obfuscated.

Then you qualify as maintainer for this code.
Thanks!


> 
> > 
> > the issue iam looking at is due to
> > 
> > SEI_FUNC(sei_pic_timing, (CodedBitstreamContext *ctx, RWContext *rw, H264RawSEIPicTiming *current, SEIMessageState *sei))
> > 
> > having different active SPS on writing than reading, so the write code
> > has nal_hrd_parameters_present_flag set while the read had that 0
> > so uninitialized data is written
> > 
> > I cannot find any match for "cbs" in MAINTAINERS, also there are no copyright
> > with names in the cbs code.
> 
> 1. I just sent a patch that "fixes" this.

Thats what i came up with too (and it works). Given we both hit that,
please apply


> 2. But actually, there is a deeper bug here: We would need to defer
> parsing certain SEI message units to a second pass when the currently
> active SPS is known. This can happen with spec-compliant input (and even
> more so with spec-incompliant input, which is presumably what the fuzzer
> produced).

Thats a deeper analysis than what i did. I stoped at the "just clear it, as in 1."
and then was looking for someone who would implement the correct fix

Ill send you the input sample privately

Thanks alot!

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

The educated differ from the uneducated as much as the living from the
dead. -- Aristotle 

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]

[-- Attachment #2: Type: text/plain, Size: 251 bytes --]

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [FFmpeg-devel] CBS
  2024-08-06 18:04     ` James Almer
@ 2024-08-06 18:41       ` Andreas Rheinhardt
  2024-08-06 19:12         ` Michael Niedermayer
  0 siblings, 1 reply; 9+ messages in thread
From: Andreas Rheinhardt @ 2024-08-06 18:41 UTC (permalink / raw)
  To: ffmpeg-devel

James Almer:
> On 8/6/2024 2:54 PM, Andreas Rheinhardt wrote:
>> Michael Niedermayer:
>>> On Tue, Aug 06, 2024 at 07:05:38PM +0200, Michael Niedermayer wrote:
>>>> Hi
>>>>
>>>> Did CBS win the obfuscated C contest yet?
>>>>
>>>> I was just looking at a msan issue and then looked at this:
>>>>
>>>> CHECK(FUNC_SEI(message_list)(ctx, rw, &current->message_list, 1));
>>>>
>>>>
>>>> #define CHECK(call) do { \
>>>>          err = (call); \
>>>>          if (err < 0) \
>>>>              return err; \
>>>>      } while (0)
>>>>
>>>> #define FUNC_NAME2(rw, codec, name) cbs_ ## codec ## _ ## rw ## _ ##
>>>> name
>>>> #define FUNC_NAME1(rw, codec, name) FUNC_NAME2(rw, codec, name)
>>>> #define FUNC_H264(name) FUNC_NAME1(READWRITE, h264, name)
>>>> #define FUNC_H265(name) FUNC_NAME1(READWRITE, h265, name)
>>>> #define FUNC_H266(name) FUNC_NAME1(READWRITE, h266, name)
>>>> #define FUNC_SEI(name)  FUNC_NAME1(READWRITE, sei,  name)
>>>>
>>>> #define SEI_FUNC(name, args) \
>>>> static int FUNC(name) args;  \
>>>> static int FUNC(name ## _internal)(CodedBitstreamContext *ctx, \
>>>>                                     RWContext *rw, void *cur,   \
>>>>                                     SEIMessageState *state)     \
>>>> { \
>>>>      return FUNC(name)(ctx, rw, cur, state); \
>>>> } \
>>>> static int FUNC(name) args
>>>>
>>>>
>>>> anyway, can we remove all preprocessor use from cbs ?
>>
>> I don't think that this is really obfuscated.
>>
>>>
>>> the issue iam looking at is due to
>>>
>>> SEI_FUNC(sei_pic_timing, (CodedBitstreamContext *ctx, RWContext *rw,
>>> H264RawSEIPicTiming *current, SEIMessageState *sei))
>>>
>>> having different active SPS on writing than reading, so the write code
>>> has nal_hrd_parameters_present_flag set while the read had that 0
>>> so uninitialized data is written
>>>
>>> I cannot find any match for "cbs" in MAINTAINERS, also there are no
>>> copyright
>>> with names in the cbs code.
>>
>> 1. I just sent a patch that "fixes" this.
>> 2. But actually, there is a deeper bug here: We would need to defer
>> parsing certain SEI message units to a second pass when the currently
>> active SPS is known. This can happen with spec-compliant input (and even
> 
> Is this a scenario where a slice that referenced an SPS was parsed, then
> a SEI message, then another slice that references another SPS, and the
> SEI expects the latter to be active despite it being coded before the
> slice?

Your example is not spec-compliant (at least not if the input is
supposed to only contain a single access unit). It can happen if there
is an SEI, then new parameter sets and then a slice activating these new
parameter sets. Or it can happen if there are multiple parameter sets
and an SEI followed by a slice activating a different SPS. The current
code is also wrong when parsing the first packet: Because in this case
no SPS has been activated yet, film_grain and sei_pic_timing SEI parsing
code contains a hack to make this work in the common case of a single SPS.

> 
>> more so with spec-incompliant input, which is presumably what the fuzzer
>> produced).
>>

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [FFmpeg-devel] CBS
  2024-08-06 18:41       ` Andreas Rheinhardt
@ 2024-08-06 19:12         ` Michael Niedermayer
  2024-08-06 19:51           ` Andreas Rheinhardt
  0 siblings, 1 reply; 9+ messages in thread
From: Michael Niedermayer @ 2024-08-06 19:12 UTC (permalink / raw)
  To: FFmpeg development discussions and patches


[-- Attachment #1.1: Type: text/plain, Size: 4129 bytes --]

On Tue, Aug 06, 2024 at 08:41:16PM +0200, Andreas Rheinhardt wrote:
> James Almer:
> > On 8/6/2024 2:54 PM, Andreas Rheinhardt wrote:
> >> Michael Niedermayer:
> >>> On Tue, Aug 06, 2024 at 07:05:38PM +0200, Michael Niedermayer wrote:
> >>>> Hi
> >>>>
> >>>> Did CBS win the obfuscated C contest yet?
> >>>>
> >>>> I was just looking at a msan issue and then looked at this:
> >>>>
> >>>> CHECK(FUNC_SEI(message_list)(ctx, rw, &current->message_list, 1));
> >>>>
> >>>>
> >>>> #define CHECK(call) do { \
> >>>>          err = (call); \
> >>>>          if (err < 0) \
> >>>>              return err; \
> >>>>      } while (0)
> >>>>
> >>>> #define FUNC_NAME2(rw, codec, name) cbs_ ## codec ## _ ## rw ## _ ##
> >>>> name
> >>>> #define FUNC_NAME1(rw, codec, name) FUNC_NAME2(rw, codec, name)
> >>>> #define FUNC_H264(name) FUNC_NAME1(READWRITE, h264, name)
> >>>> #define FUNC_H265(name) FUNC_NAME1(READWRITE, h265, name)
> >>>> #define FUNC_H266(name) FUNC_NAME1(READWRITE, h266, name)
> >>>> #define FUNC_SEI(name)  FUNC_NAME1(READWRITE, sei,  name)
> >>>>
> >>>> #define SEI_FUNC(name, args) \
> >>>> static int FUNC(name) args;  \
> >>>> static int FUNC(name ## _internal)(CodedBitstreamContext *ctx, \
> >>>>                                     RWContext *rw, void *cur,   \
> >>>>                                     SEIMessageState *state)     \
> >>>> { \
> >>>>      return FUNC(name)(ctx, rw, cur, state); \
> >>>> } \
> >>>> static int FUNC(name) args
> >>>>
> >>>>
> >>>> anyway, can we remove all preprocessor use from cbs ?
> >>
> >> I don't think that this is really obfuscated.
> >>
> >>>
> >>> the issue iam looking at is due to
> >>>
> >>> SEI_FUNC(sei_pic_timing, (CodedBitstreamContext *ctx, RWContext *rw,
> >>> H264RawSEIPicTiming *current, SEIMessageState *sei))
> >>>
> >>> having different active SPS on writing than reading, so the write code
> >>> has nal_hrd_parameters_present_flag set while the read had that 0
> >>> so uninitialized data is written
> >>>
> >>> I cannot find any match for "cbs" in MAINTAINERS, also there are no
> >>> copyright
> >>> with names in the cbs code.
> >>
> >> 1. I just sent a patch that "fixes" this.
> >> 2. But actually, there is a deeper bug here: We would need to defer
> >> parsing certain SEI message units to a second pass when the currently
> >> active SPS is known. This can happen with spec-compliant input (and even
> > 
> > Is this a scenario where a slice that referenced an SPS was parsed, then
> > a SEI message, then another slice that references another SPS, and the
> > SEI expects the latter to be active despite it being coded before the
> > slice?
> 
> Your example is not spec-compliant  (at least not if the input is
> supposed to only contain a single access unit). It can happen if there
> is an SEI, then new parameter sets and then a slice activating these new
> parameter sets. Or it can happen if there are multiple parameter sets
> and an SEI followed by a slice activating a different SPS. The current
> code is also wrong when parsing the first packet: Because in this case
> no SPS has been activated yet, film_grain and sei_pic_timing SEI parsing
> code contains a hack to make this work in the common case of a single SPS.

Having an attacker be able to supply SPS, SPS activation and SPS use in
an atacker choosen order. While these elements are not self contained but
refer to each other is just hard to do without being exploitable.

One way to fix this is to make the sei self contained and not refer to the SPS
at all. Just refer to SPS for parsing but then when storing just store the fields
that where parsed not depending on the right SPS being (still) there.

thx

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Any man who breaks a law that conscience tells him is unjust and willingly 
accepts the penalty by staying in jail in order to arouse the conscience of 
the community on the injustice of the law is at that moment expressing the 
very highest respect for law. - Martin Luther King Jr

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]

[-- Attachment #2: Type: text/plain, Size: 251 bytes --]

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [FFmpeg-devel] CBS
  2024-08-06 19:12         ` Michael Niedermayer
@ 2024-08-06 19:51           ` Andreas Rheinhardt
  2024-08-06 22:11             ` Michael Niedermayer
  0 siblings, 1 reply; 9+ messages in thread
From: Andreas Rheinhardt @ 2024-08-06 19:51 UTC (permalink / raw)
  To: ffmpeg-devel

Michael Niedermayer:
> On Tue, Aug 06, 2024 at 08:41:16PM +0200, Andreas Rheinhardt wrote:
>> James Almer:
>>> On 8/6/2024 2:54 PM, Andreas Rheinhardt wrote:
>>>> Michael Niedermayer:
>>>>> On Tue, Aug 06, 2024 at 07:05:38PM +0200, Michael Niedermayer wrote:
>>>>>> Hi
>>>>>>
>>>>>> Did CBS win the obfuscated C contest yet?
>>>>>>
>>>>>> I was just looking at a msan issue and then looked at this:
>>>>>>
>>>>>> CHECK(FUNC_SEI(message_list)(ctx, rw, &current->message_list, 1));
>>>>>>
>>>>>>
>>>>>> #define CHECK(call) do { \
>>>>>>          err = (call); \
>>>>>>          if (err < 0) \
>>>>>>              return err; \
>>>>>>      } while (0)
>>>>>>
>>>>>> #define FUNC_NAME2(rw, codec, name) cbs_ ## codec ## _ ## rw ## _ ##
>>>>>> name
>>>>>> #define FUNC_NAME1(rw, codec, name) FUNC_NAME2(rw, codec, name)
>>>>>> #define FUNC_H264(name) FUNC_NAME1(READWRITE, h264, name)
>>>>>> #define FUNC_H265(name) FUNC_NAME1(READWRITE, h265, name)
>>>>>> #define FUNC_H266(name) FUNC_NAME1(READWRITE, h266, name)
>>>>>> #define FUNC_SEI(name)  FUNC_NAME1(READWRITE, sei,  name)
>>>>>>
>>>>>> #define SEI_FUNC(name, args) \
>>>>>> static int FUNC(name) args;  \
>>>>>> static int FUNC(name ## _internal)(CodedBitstreamContext *ctx, \
>>>>>>                                     RWContext *rw, void *cur,   \
>>>>>>                                     SEIMessageState *state)     \
>>>>>> { \
>>>>>>      return FUNC(name)(ctx, rw, cur, state); \
>>>>>> } \
>>>>>> static int FUNC(name) args
>>>>>>
>>>>>>
>>>>>> anyway, can we remove all preprocessor use from cbs ?
>>>>
>>>> I don't think that this is really obfuscated.
>>>>
>>>>>
>>>>> the issue iam looking at is due to
>>>>>
>>>>> SEI_FUNC(sei_pic_timing, (CodedBitstreamContext *ctx, RWContext *rw,
>>>>> H264RawSEIPicTiming *current, SEIMessageState *sei))
>>>>>
>>>>> having different active SPS on writing than reading, so the write code
>>>>> has nal_hrd_parameters_present_flag set while the read had that 0
>>>>> so uninitialized data is written
>>>>>
>>>>> I cannot find any match for "cbs" in MAINTAINERS, also there are no
>>>>> copyright
>>>>> with names in the cbs code.
>>>>
>>>> 1. I just sent a patch that "fixes" this.
>>>> 2. But actually, there is a deeper bug here: We would need to defer
>>>> parsing certain SEI message units to a second pass when the currently
>>>> active SPS is known. This can happen with spec-compliant input (and even
>>>
>>> Is this a scenario where a slice that referenced an SPS was parsed, then
>>> a SEI message, then another slice that references another SPS, and the
>>> SEI expects the latter to be active despite it being coded before the
>>> slice?
>>
>> Your example is not spec-compliant  (at least not if the input is
>> supposed to only contain a single access unit). It can happen if there
>> is an SEI, then new parameter sets and then a slice activating these new
>> parameter sets. Or it can happen if there are multiple parameter sets
>> and an SEI followed by a slice activating a different SPS. The current
>> code is also wrong when parsing the first packet: Because in this case
>> no SPS has been activated yet, film_grain and sei_pic_timing SEI parsing
>> code contains a hack to make this work in the common case of a single SPS.
> 
> Having an attacker be able to supply SPS, SPS activation and SPS use in
> an atacker choosen order. While these elements are not self contained but
> refer to each other is just hard to do without being exploitable.
> 
> One way to fix this is to make the sei self contained and not refer to the SPS
> at all. Just refer to SPS for parsing but then when storing just store the fields
> that where parsed not depending on the right SPS being (still) there.

This overlooks that one already needs the correct SPS for parsing.

- Andreas

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [FFmpeg-devel] CBS
  2024-08-06 19:51           ` Andreas Rheinhardt
@ 2024-08-06 22:11             ` Michael Niedermayer
  0 siblings, 0 replies; 9+ messages in thread
From: Michael Niedermayer @ 2024-08-06 22:11 UTC (permalink / raw)
  To: FFmpeg development discussions and patches


[-- Attachment #1.1: Type: text/plain, Size: 4885 bytes --]

On Tue, Aug 06, 2024 at 09:51:10PM +0200, Andreas Rheinhardt wrote:
> Michael Niedermayer:
> > On Tue, Aug 06, 2024 at 08:41:16PM +0200, Andreas Rheinhardt wrote:
> >> James Almer:
> >>> On 8/6/2024 2:54 PM, Andreas Rheinhardt wrote:
> >>>> Michael Niedermayer:
> >>>>> On Tue, Aug 06, 2024 at 07:05:38PM +0200, Michael Niedermayer wrote:
> >>>>>> Hi
> >>>>>>
> >>>>>> Did CBS win the obfuscated C contest yet?
> >>>>>>
> >>>>>> I was just looking at a msan issue and then looked at this:
> >>>>>>
> >>>>>> CHECK(FUNC_SEI(message_list)(ctx, rw, &current->message_list, 1));
> >>>>>>
> >>>>>>
> >>>>>> #define CHECK(call) do { \
> >>>>>>          err = (call); \
> >>>>>>          if (err < 0) \
> >>>>>>              return err; \
> >>>>>>      } while (0)
> >>>>>>
> >>>>>> #define FUNC_NAME2(rw, codec, name) cbs_ ## codec ## _ ## rw ## _ ##
> >>>>>> name
> >>>>>> #define FUNC_NAME1(rw, codec, name) FUNC_NAME2(rw, codec, name)
> >>>>>> #define FUNC_H264(name) FUNC_NAME1(READWRITE, h264, name)
> >>>>>> #define FUNC_H265(name) FUNC_NAME1(READWRITE, h265, name)
> >>>>>> #define FUNC_H266(name) FUNC_NAME1(READWRITE, h266, name)
> >>>>>> #define FUNC_SEI(name)  FUNC_NAME1(READWRITE, sei,  name)
> >>>>>>
> >>>>>> #define SEI_FUNC(name, args) \
> >>>>>> static int FUNC(name) args;  \
> >>>>>> static int FUNC(name ## _internal)(CodedBitstreamContext *ctx, \
> >>>>>>                                     RWContext *rw, void *cur,   \
> >>>>>>                                     SEIMessageState *state)     \
> >>>>>> { \
> >>>>>>      return FUNC(name)(ctx, rw, cur, state); \
> >>>>>> } \
> >>>>>> static int FUNC(name) args
> >>>>>>
> >>>>>>
> >>>>>> anyway, can we remove all preprocessor use from cbs ?
> >>>>
> >>>> I don't think that this is really obfuscated.
> >>>>
> >>>>>
> >>>>> the issue iam looking at is due to
> >>>>>
> >>>>> SEI_FUNC(sei_pic_timing, (CodedBitstreamContext *ctx, RWContext *rw,
> >>>>> H264RawSEIPicTiming *current, SEIMessageState *sei))
> >>>>>
> >>>>> having different active SPS on writing than reading, so the write code
> >>>>> has nal_hrd_parameters_present_flag set while the read had that 0
> >>>>> so uninitialized data is written
> >>>>>
> >>>>> I cannot find any match for "cbs" in MAINTAINERS, also there are no
> >>>>> copyright
> >>>>> with names in the cbs code.
> >>>>
> >>>> 1. I just sent a patch that "fixes" this.
> >>>> 2. But actually, there is a deeper bug here: We would need to defer
> >>>> parsing certain SEI message units to a second pass when the currently
> >>>> active SPS is known. This can happen with spec-compliant input (and even
> >>>
> >>> Is this a scenario where a slice that referenced an SPS was parsed, then
> >>> a SEI message, then another slice that references another SPS, and the
> >>> SEI expects the latter to be active despite it being coded before the
> >>> slice?
> >>
> >> Your example is not spec-compliant  (at least not if the input is
> >> supposed to only contain a single access unit). It can happen if there
> >> is an SEI, then new parameter sets and then a slice activating these new
> >> parameter sets. Or it can happen if there are multiple parameter sets
> >> and an SEI followed by a slice activating a different SPS. The current
> >> code is also wrong when parsing the first packet: Because in this case
> >> no SPS has been activated yet, film_grain and sei_pic_timing SEI parsing
> >> code contains a hack to make this work in the common case of a single SPS.
> > 
> > Having an attacker be able to supply SPS, SPS activation and SPS use in
> > an atacker choosen order. While these elements are not self contained but
> > refer to each other is just hard to do without being exploitable.
> > 
> > One way to fix this is to make the sei self contained and not refer to the SPS
> > at all. Just refer to SPS for parsing but then when storing just store the fields
> > that where parsed not depending on the right SPS being (still) there.
> 
> This overlooks that one already needs the correct SPS for parsing.

how is "Just refer to SPS for parsing" overlooking the SPS for parsing?

The problem is not the parsing, the problem is the writing doesnt match
the parsing. The simple fix i refered to is to store the parsed value and use it when
writing. Not to somehow hope that a network of invalid and attacker controlled
data structures, some of which might contain different values at different times
will look the same to teh writer than the parser.

Thats what i meant but you can fix it anyway you want.


Thx

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Homeopathy is like voting while filling the ballot out with transparent ink.
Sometimes the outcome one wanted occurs. Rarely its worse than filling out
a ballot properly.

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]

[-- Attachment #2: Type: text/plain, Size: 251 bytes --]

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2024-08-06 22:11 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-08-06 17:05 [FFmpeg-devel] CBS Michael Niedermayer
2024-08-06 17:38 ` Michael Niedermayer
2024-08-06 17:54   ` Andreas Rheinhardt
2024-08-06 18:04     ` James Almer
2024-08-06 18:41       ` Andreas Rheinhardt
2024-08-06 19:12         ` Michael Niedermayer
2024-08-06 19:51           ` Andreas Rheinhardt
2024-08-06 22:11             ` Michael Niedermayer
2024-08-06 18:12     ` Michael Niedermayer

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git