← All issues

[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);

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를 사용한 패턴.

WebKit의 GPU process 아키텍처는 텍스트 렌더링을 포함한 그래픽 처리를 sandbox된 WebContent process에서 별도의 GPU process로 IPC를 통해 위임합니다. RemoteGraphicsContext는 IPC를 통해 직렬화된 드로잉 명령을 수신하고 실제 GraphicsContext에 재생합니다. Glyph buffer와 같은 파라미터는 IPC message buffer에 직렬화된 데이터로 도착하며, 역직렬화된 메시지로부터 얻은 span은 이 backing storage를 직접 가리킵니다. GlyphBufferGlyphGlyphBufferAdvance는 WebCore 텍스트 렌더링 파이프라인에서 사용하는 glyph 단위 데이터 타입입니다.

수정 전에는 RemoteGraphicsContext::drawGlyphsglyphsAdvances.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은 이미 복사되고 있었습니다.

🔒

Explores the IPC buffer lifetime model and whether the dangling span could be weaponized for controlled reads in the GPU process

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

🔒

Multiple audit patterns identified for IPC span handling across the GPU process boundary, with concrete search targets

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