[3] WebGL GPU-process draft-extension setting unenforced across IPC
Severity: Medium | Component: WebKit GPU process — GraphicsContextGLANGLE / GPUConnectionToWebProcess | 0d94848
이 취약점이 Medium으로 평가된 것은, diff가 IPC trust boundary의 허점을 제거하기 때문입니다. 기존에는 WebGLDraftExtensionsEnabled 설정과 무관하게, 어떤 WebContent process든 GPU process 내에서 draft 품질 ANGLE extension을 활성화할 수 있었습니다. 직접적인 memory primitive는 없지만, 더 높은 권한을 가진 process에서 도달 가능한 코드 범위가 넓어지며, 후속 exploit chain에서 활용될 가능성이 있습니다.
이 패치는 GraphicsContextGLAttributes에 supportWebGLDraftExtensions boolean 필드를 추가합니다. 이 필드는 헤더에 선언되고 WebGL.serialization.in을 통해 직렬화됩니다. WebGLRenderingContextBase::resolveGraphicsContextGLAttributes는 이 값을 scriptExecutionContext.settingsValues().webGLDraftExtensionsEnabled에서 채웁니다. GPU process 측에서는 GPUConnectionToWebProcess::createGraphicsContextGL가 WebContent에서 전달된 attribute가 true인 경우를 처리합니다. 이때 신뢰된 shared preference가 false이면 MESSAGE_CHECK로 IPC 요청을 거부합니다. 이 검사가 실질적으로 동작하도록 UnifiedWebPreferences.yaml에 WebGLDraftExtensionsEnabled의 sharedPreferenceForWebProcess: true가 추가되었습니다. GraphicsContextGLANGLE::initialize 내부의 requestable-extension 필터는 attributes.supportWebGLDraftExtensions가 true가 아닌 경우 GCGLExtension::ANGLE_base_vertex_base_instance를 건너뜁니다.
Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp
Source/WebCore/platform/graphics/angle/GraphicsContextGLANGLE.cpp
Source/WebCore/html/canvas/WebGLRenderingContextBase.cpp
Source/WTF/Scripts/Preferences/UnifiedWebPreferences.yaml
Patch Details
이 변경은 네 파일에 걸쳐 있습니다. IPC로 직렬화되는 struct에 새로운 attribute를 추가하고, WebContent 측 context 생성 시 settings를 읽어오며, GPU process IPC 진입점에 MESSAGE_CHECK를 추가하고, ANGLE 초기화 경로에 extension 필터 분기를 삽입합니다. YAML 변경으로 신뢰된 preference 값이 m_sharedPreferencesForWebProcess에 전달되어 IPC validator가 비교 대상을 갖게 됩니다. 기존 코드 경로는 재구성되지 않았으며, 이 패치는 boolean 하나를 process 간에 연결하는 additive 변경입니다.
draft-extension gate 역할을 하는 보안 설정이 GPU process의 context 생성 IPC에 연결되지 않아, 신뢰된 preference가 process 경계를 넘어 적용되지 않은 상태.
Background
GPU process는 WebContent를 대신해 WebGL/WebGPU를 처리하는 별도의 sandboxed process입니다. WebContent 측의 RemoteGraphicsContextGL은 WebGL 호출을 IPC로 GPU process의 GraphicsContextGLANGLE에 전달합니다. ANGLE은 플랫폼 GL 위에서 OpenGL ES를 구현하는 변환 레이어로, WebKit의 WebGL 구현 기반이 됩니다. 이 레이어는 GL_ANGLE_* 및 GL_EXT_* 계열의 extension을 제공하는데, 일부는 draft 상태입니다. Draft extension은 spec이 변경될 수 있고 hardening이 충분하지 않은 경우가 많습니다.
ANGLE은 런타임에 활성화 가능한 extension 목록을 반환합니다(GL_REQUESTABLE_EXTENSIONS_ANGLE). WebKit은 이를 m_allRequestableExtensions에 복사한 뒤 m_requestableExtensions로 필터링합니다. getExtension으로 활성화할 수 있는 것은 이 필터링된 집합의 항목뿐입니다. MESSAGE_CHECK는 WebKit의 IPC validator 매크로로, assertion이 실패하면 연결을 종료합니다. 신뢰도가 낮은 process에서 넘어온 잘못된 값이나 공격자가 조작한 값을 trust boundary에서 거부하는 데 사용됩니다. UnifiedWebPreferences.yaml에서 sharedPreferenceForWebProcess: true를 설정하면 해당 preference 값이 UI process에서 GPU process의 m_sharedPreferencesForWebProcess로 복제됩니다. 이로써 GPU process는 WebContent와 독립적인 신뢰된 복사본을 갖게 됩니다.
Attack surface
이 변경은 attack surface를 줄이는 방향의 패치입니다. 패치 이전에는 WebGLDraftExtensionsEnabled 설정과 무관하게, 어떤 WebContent process든 enableExtension/getExtension 경로를 통해 ANGLE_base_vertex_base_instance에 접근할 수 있었습니다. 새로 추가된 MESSAGE_CHECK는 신뢰된 shared preference가 허용하는 경우에만 draft extension에 접근 가능하도록 강제합니다. 이로써 WebContent가 단독으로 opt in 할 수 있었던 IPC 경로가 차단되었습니다.
Analysis
패치 이전에는 GraphicsContextGLANGLE::initialize가 WebGLDraftExtensionsEnabled 설정을 고려하지 않은 채 ANGLE의 전체 requestable-extensions 목록으로부터 m_requestableExtensions를 채웠습니다. 설정 자체는 존재했지만, 그 값을 GraphicsContextGLAttributes에 전달하는 경로가 없었습니다. 결과적으로 GPU process 측의 context 생성 과정에서는 gate 역할을 할 수 있는 상태가 없었습니다. 침해된 process를 포함하여 어떤 WebContent process든 정책과 무관하게 draft 품질 ANGLE extension에 접근할 수 있었습니다.
WebKit에서 반복되는 "WebContent 측에서만 적용되는 preference" 패턴에 해당합니다. 많은 WebKit 기능이 설정으로 노출을 제한하지만, 그 설정을 실제로 확인하는 것은 WebContent 측뿐입니다. GPU process나 Networking process는 경계를 넘어 전달된 attribute struct를 그대로 신뢰합니다. 이번 패치의 완화 패턴은 하나의 좋은 템플릿을 제시합니다. sharedPreferenceForWebProcess: true와 IPC 진입점에서 신뢰된 복사본을 대상으로 하는 MESSAGE_CHECK를 조합하는 방식으로, "draft / experimental / privileged" 계열의 WebGL/WebGPU/Media feature gate 전반에 동일하게 적용할 수 있습니다.