← All issues

[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::peekBoxJSC::DataView를 필요로 하고 Gigacage를 통해 동작하는 구조로, SharedBuffer 내용은 Gigacage에 할당되지 않아 해당 경로에서 EXC_BAD_ACCESS가 발생하기 때문입니다. 이전까지 abort()/changeType() 외부에서는 한 번도 도달하지 않았던 AppendFlags::Discontinuity code path도 이번 commit으로 처음 활성화된 셈입니다.

Apple 플랫폼에서 AVStreamDataParser 앞단에 새로운 stateful binary parser가 추가되었습니다. 이 parser는 공격자가 제어할 수 있는 non-Gigacage 메모리 위에서 appendData() 경계를 넘어 ISO-BMFF box header를 순회합니다.

🔒

The new binary pre-parser has several edge cases in its size-field decoding, cross-boundary reassembly, and append-split logic worth security investigation.

더 확인하려면 구독해 주세요