[7] GPU process dangling span in RemoteGraphicsContext::drawGlyphs
Severity: High | Component: GPU Process graphics layer — RemoteGraphicsContext | 6aacf62
GPU process에서 dangling span read가 관측되기 때문에 High로 평가되었습니다. GPU process는 WebContent sandbox 외부에서 동작하며, IPC message backing storage의 glyph data가 ownership 이전 없이 rendering 호출에 전달되고 있습니다. 한쪽 span은 복사되고 다른 쪽은 복사되지 않은 비대칭성은 의도적인 설계가 아닌 실수였음을 시사합니다.
IPC message backing storage로 인한 dangling span을 방지하기 위해 RemoteGraphicsContext::drawGlyphs에서 glyph buffer를 복사하도록 수정되었습니다.
Source/WebKit/GPUProcess/graphics/RemoteGraphicsContext.cpp
- context().drawGlyphs(*font, glyphsAdvances.span<0>(), Vector<GlyphBufferAdvance>(glyphsAdvances.span<1>()), localAnchor, fontSmoothingMode);
+ Vector<GlyphBufferGlyph, 128> glyphs { glyphsAdvances.span<0>() };
+ Vector<GlyphBufferAdvance, 128> advances { glyphsAdvances.span<1>() };
+ context().drawGlyphs(*font, glyphs.span(), advances.span(), localAnchor, fontSmoothingMode);
Patch Details
IPC 역직렬화된 glyphsAdvances 파라미터에서 glyph span과 advance span 모두를 로컬 Vector 객체로 복사한 뒤 context().drawGlyphs()에 전달하도록 변경되었습니다. inline capacity를 128로 설정해 작은 glyph buffer는 stack에 유지됩니다. 수정 전에는 span<0>()(glyph)이 span reference로 직접 전달된 반면, span<1>()(advance)은 이미 임시 Vector로 복사되는 비대칭 구조였습니다. 이 비대칭성이 실수가 있었음을 드러냅니다.
backing buffer의 lifetime이 보장되지 않는 call 경계를 넘어 IPC message data에 대한 non-owning span reference를 사용한 패턴.
Background
WebKit의 GPU process 아키텍처는 텍스트 렌더링을 포함한 그래픽 처리를 sandbox된 WebContent process에서 별도의 GPU process로 IPC를 통해 위임합니다. RemoteGraphicsContext는 IPC를 통해 직렬화된 드로잉 명령을 수신하고 실제 GraphicsContext에 재생합니다. Glyph buffer와 같은 파라미터는 IPC message buffer에 직렬화된 데이터로 도착하며, 역직렬화된 메시지로부터 얻은 span은 이 backing storage를 직접 가리킵니다. GlyphBufferGlyph와 GlyphBufferAdvance는 WebCore 텍스트 렌더링 파이프라인에서 사용하는 glyph 단위 데이터 타입입니다.
Analysis
수정 전에는 RemoteGraphicsContext::drawGlyphs가 glyphsAdvances.span<0>()을 span reference로 직접 context().drawGlyphs()에 전달했습니다. 이 span은 IPC message의 backing storage를 가리킵니다. fix 패턴이 강하게 시사하듯, IPC 역직렬화 모델이 non-owning view를 생성하는 경우가 이에 해당합니다. 문제는 IPC buffer의 lifetime이 context().drawGlyphs() 전체 실행 구간을 커버하지 못하는 경우에 발생합니다. 예를 들어 glyph 렌더링 도중 message buffer가 해제되거나 재사용된다면, span이 dangling 상태가 되어 GPU process가 해제된 메모리나 stale 메모리를 읽게 됩니다. 취약한 대상은 glyph span뿐이었고, advance span은 이미 복사되고 있었습니다.
Aaa Aaaaaaaaaa Aaaaaaaa Aaa Aaaaaa Aaa Aaaa Aaa Aaaaaaaa Aaaaa Aaaaa Aa Aaa Aaaa Aaaa Aa Aaaaa Aaaaaa Aaaa Aaa Aaa Aaaaaaa a Aaaaa Aa Aa Aaaaa Aaaa Aaa a Aaaaa Aaa Aaa Aaaaaaa Aaa Aa Aaaa Aaaaaaa Aaa Aaaaa Aaaaaa Aaaa Aaaaaaaaa Aaaaaaa Aaaa Aaaa Aaaaa Aaaaa Aa Aa Aaa Aaa Aaaa Aaaaaaaaaaaaa Aaa Aaa Aaaa Aaaaa Aaa Aaaaaaaa Aaaaaaaaaa Aaaaaaa Aaaa Aaaa Aaaa a Aaaaa Aaaaaa Aaaaaaaaaaa Aaaaaaa Aaaaaaa Aaa Aaaa Aaaaa
a Aaaaaaaaaaaaaa Aaa Aaaaaaa Aaa Aaaaaa Aaaaaaa Aaaaaaa Aaaaa Aaaaa Aaaaaaaa Aaaaa Aa Aaa Aaaa Aaaa Aaaa Aaa Aaaaaaaaa Aaaaa Aaa Aa Aaaa Aaa Aa Aaaa Aaa a Aaa Aaaaaaaaaaaaa Aaaaaaaaaa Aaa Aaaa Aaaaa
Aa Aaa Aaaaa Aaaa Aa Aaaa Aaaaaaaa Aaaaaa Aaaaaa Aaa Aaaa Aaa Aa Aaa Aaaaa Aaaaa Aa Aaaa Aaaa a Aaa Aaaaaa Aaaaaa Aaaaaa Aaaa Aaaaaaaa Aaaaaaa Aaa Aaa Aa Aa Aa Aaaa Aaa Aaa Aaa Aaaaa
Aaaaaaaaa Aaaaaaaaaaaaaaaaa Aaaaa Aaa Aaaaaaa Aaaaaaa Aaaaaaaa Aa Aaaaaa Aaa Aaaaaa Aaaaaaaaa Aaaaaaaaaaaaaaaaaaaaaaaa Aa Aaa Aaa a Aaa Aaa Aaa Aaaaaa Aaa Aaaaaa Aa Aaa a Aaaa Aaa Aa Aaaaaaaaaa Aaaaa Aa Aa Aaaaaa
🔒Explores the IPC buffer lifetime model and whether the dangling span could be weaponized for controlled reads in the GPU process
더 확인하려면 구독해 주세요
Audit directions
a Aaaaa Aaaaaaa a Aaaaaaaa Aaaa Aaa Aa Aaaa Aaa Aaaaaaa Aaaaaaa Aaaaaaaa Aa Aaaaaaaaaa Aaaa Aa Aaaaaaaaaaaa Aaa Aaa Aaa Aaaaaaa Aaaaa Aaaaa Aaa Aaaa Aaaaa Aaaaaaaa Aaa Aaaa Aaaaa Aaaaa Aa Aa Aaaaaaaaaaaaa Aaa Aa Aaaa Aaaaaaaaaaaaaaaaaaaaaaa Aaaa Aaaaaaaaaaaaaaaaaaaaaaaa Aaaa Aaaa Aaaa Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aaaaaaaaa Aaaa Aa Aaaaaa
a Aaaa Aa Aaa Aaaaaa Aaa Aa Aa Aaaaa Aa Aaaaa a Aaaaa Aaaa Aa Aaaaa Aaaa Aaaaaa Aa Aaaaaaaaaaa Aaaaa Aaaaaaaaaa Aaa Aa Aa Aaaaaaaa Aaaa Aaa Aaa Aaa Aaaa Aaaa Aa Aa Aaaaaaa Aaaaaa Aaa Aaa Aaa Aaaaaaaaaa Aaaaa Aaaa Aaaa
a Aaaaaaaaa Aaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aaa Aaaaaa Aaaaaaaa Aaaaa a Aaaa Aaa Aa Aaaaaaa Aaaa Aaa Aaaaaaa Aaaaaaa Aaaaaaaa Aaa Aaa Aa Aa Aaaaaa Aa Aaaaa Aaa Aaaaaaa Aaaaaaaa Aaaa Aaa Aa Aaa Aaaaaaa Aaa a Aa Aa Aaa Aa Aa Aa Aaaaa Aaaaa Aaaa Aaa Aaa Aaaaa Aaa Aaaa Aaaaa
🔒Multiple audit patterns identified for IPC span handling across the GPU process boundary, with concrete search targets
더 확인하려면 구독해 주세요