[cocoa] AVStreamDataParser accepts media segments not preceded by an init segment
4ed0007
LayoutTests/media/media-source/media-source-append-media-before-init.html
+function makeFreeBox(size) {
+ var buffer = new ArrayBuffer(size);
+ var view = new DataView(buffer);
+ view.setUint32(0, size);
+ view.setUint32(4, 0x66726565); // 'free'
+ return buffer;
+}
WebKit의 Cocoa 기반 MSE 구현은 ISO-BMFF 파싱을 AVFoundation의 private API인 AVStreamDataParser에 위임합니다. MSE 명세는 엄격한 순서를 요구하는데, initialization segment(ftyp+moov)는 반드시 media segment(moof+mdat)보다 먼저 제공되어야 합니다. 그러나 AVStreamDataParser 자체는 이 순서를 강제하지 않습니다. 순서가 지켜지지 않으면 null CMFormatDescription을 가진 CMSampleBuffer가 생성되고, 이후 처리 단계에서 실패하게 됩니다. 한편 abort()/changeType() 없이 스트림 도중 새로운 ftyp가 도착하면, MoofManifold에서 CoreMedia 내부 오류 -16046이 발생하지만 외부로 전파되지 않고 무시됩니다.
이 commit은 AVStreamDataParser 앞단에 새로운 ISOBMFFPreParser를 추가했습니다. 이 컴포넌트는 box 내용을 파싱하지 않고 appendData() 경계를 넘어 ISO-BMFF box header를 순회합니다. init segment 없이 media segment가 먼저 도착하면 이를 거부하고, 스트림 중간에 새로운 ftyp가 나타나면 AVStreamDataParserStreamDataDiscontinuity 신호를 주입합니다. 기존 ISOBox::peekBox 대신 BitReader를 선택한 데는 이유가 있습니다. ISOBox::peekBox는 JSC::DataView를 필요로 하고 Gigacage를 통해 동작하는 구조로, SharedBuffer 내용은 Gigacage에 할당되지 않아 해당 경로에서 EXC_BAD_ACCESS가 발생하기 때문입니다. 이전까지 abort()/changeType() 외부에서는 한 번도 도달하지 않았던 AppendFlags::Discontinuity code path도 이번 commit으로 처음 활성화된 셈입니다.
Significance
Apple 플랫폼에서 AVStreamDataParser 앞단에 새로운 stateful binary parser가 추가되었습니다. 이 parser는 공격자가 제어할 수 있는 non-Gigacage 메모리 위에서 appendData() 경계를 넘어 ISO-BMFF box header를 순회합니다.
Audit directions
a Aaaaa Aaaa Aaaaa Aaaaaaaaaaa Aaaaaaaaaaa Aaaaaaaaa a Aa Aaaa Aaaa Aa Aaaaaa Aa Aaaaaaa Aaaaaa Aaaaaaaaaaaaa Aaaaa Aa Aa Aa Aaaa Aa a Aaaa Aaaaaaaa Aa Aa Aaaa Aaaaaa Aa Aaaaaa Aaaa Aaaa Aaaaaa Aaaa Aa Aaaa Aa Aaaa Aaaaaaa Aaa a Aaaaaaa Aaaaaaaaa Aaaa Aa Aaaa Aa Aaaaaa Aaaaaaaaa Aa Aaa Aaaaaaaaa Aaaaaaaaa Aaa Aaa Aaa Aaaaa
a Aaaaaaaaaaaaaaaa Aaaaaaa Aaaaaa Aaaaa Aaaaaaaaaaaaaaaaaaaaaaaaaaa a Aaaaaaaaaaaaaa Aaa Aa Aaa Aaaaaaa Aaa Aa Aaa Aa Aaaaaaa Aaa Aaa Aa Aaaa Aaa a Aaaa Aaaaaaaaaa Aaa Aaaaa Aaaaaaa Aaa Aaa Aa Aaaa Aaaa Aaaaa Aaaaa Aaaaaaaa Aaaa Aaaaaaaaa Aa a Aaa Aa Aaaa Aaa Aaaaa Aaaaaa
a Aaaaaaaa Aaaaa Aaaaaaaa Aaaaaa Aa Aaa Aaaaaaa Aaaa Aaaaaaaaaaa Aaaa Aaaaaaa Aaa a Aaaaaaaaaaaaaaa a Aaaa Aaaaaa Aaaaaa Aaa Aaaaaaaaaaa Aaaaa Aaaaaa Aaaaaaaaa Aaaaaaaaa Aaaa Aa Aaa Aaaa Aaa Aa Aa Aaaa Aaaaaaaaaaaaaaaaaaaaa Aaa Aaaa Aaaaa
a Aaaaaaaaaaaaa Aaaaaaaaaaaaaaaaaaaaaaaaaaaa Aaaaaaa a Aaaaa Aaaaaaaaaaaaaaaaaaaa Aaaaa a Aa Aaa Aa Aaaaaa Aaaa Aa a Aaaaaaaaaaaaaaaaaaaaa Aa Aaa Aaa Aaaa Aa Aa Aaa Aaa Aa Aaaa a Aaaa Aaa Aa Aaaa Aaaaaa Aa Aaa Aa Aaaaa
a Aaaaaaaaaaaaa Aa Aaaaaaaaaaaaa Aaaaaaaaa a Aaaaaaa Aaaaaaaaaaaaaaaaaa Aaaaaaaaaaaaaa Aaaaa Aaaaaa Aaaa Aaaaa Aaaaaa Aa Aaaaaaaaaaaa Aaaaaa Aaaaaaaaaaaa Aaaaaa Aaaaa Aaa Aa Aaaaaaaaaaa Aa Aa Aaa Aa Aaaa Aaaaa Aaaaaaaaa Aaaaaa Aaaa Aaaaaa Aaaa Aaa a Aaaaa a Aa Aa Aaa Aaaaaaaaa Aaa Aa Aaaa Aaaa Aaa Aaa Aaaa Aaaa
🔒The new binary pre-parser has several edge cases in its size-field decoding, cross-boundary reassembly, and append-split logic worth security investigation.
더 확인하려면 구독해 주세요