[3] WebGL GPU-process draft-extension setting unenforced across IPC
이 취약점이 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 전반에 동일하게 적용할 수 있습니다.
이 취약점은 단독으로는 memory corruption primitive로 직접 exploit할 수 없습니다. 관련 시나리오는 chain 형태를 띱니다. 공격자는 먼저 arbitrary script execution이나 제한적인 renderer 측 침해를 달성합니다. 그런 다음 필터링되지 않은 IPC를 이용해 GPU process에서 ANGLE_base_vertex_base_instance를 노출시킵니다. 이후 해당 draft extension이 활성화된 경우에만 도달 가능한 버그를 공략하게 됩니다. 패치 이전에는 IPC가 어떤 호출자든 수락했지만, 패치 이후 MESSAGE_CHECK는 신뢰된 preference가 비활성화된 상태에서 draft extension 지원을 요청하는 연결을 거부합니다. 공격자가 이를 우회하려면 preference를 변경하거나(다른 경계를 공략해야 함) 해당 코드 경로로의 별도 진입 경로를 찾아야 합니다. Lockdown Mode는 기존의 MESSAGE_CHECK(!isLockdownModeEnabled())로 이미 독립적으로 강제되고 있으며, 이번 변경의 영향을 받지 않습니다.
이 취약점은 침해된 WebContent process를 대상으로 GPU process의 trust boundary를 약화시킵니다. WebKit의 보안 모델은 draft 상태의 미성숙한 ANGLE extension이 명시적인 설정 뒤에 격리되어야 한다고 가정합니다. 이는 해당 extension들의 command pipeline이 non-draft extension에 비해 hardening과 fuzzing이 충분하지 않기 때문입니다. 패치 이전에는 IPC 레이어에 그 gate가 존재하지 않았습니다. 어떤 WebContent든 ANGLE_base_vertex_base_instance를 요청하고 GPU process 내에서 draw command를 실행할 수 있었습니다. WebContent에서 script execution을 달성한 공격자는 ANGLE 및 플랫폼 GL 드라이버의 draft extension 코드 경로에 도달할 가능성이 있습니다. 이는 GPU process 침해나 sandbox escape chain에 활용 가능한 surface를 넓히게 됩니다.
Audit directions
-
WebContent 측에서만 확인하는 실험적 기능 노출 gate 설정.
GPUConnectionToWebProcess와RemoteGraphicsContextGL/RemoteGPU의 모든 IPC 진입점을 점검합니다. WebCore preference를 그대로 반영하지만m_sharedPreferencesForWebProcess를 통해 재검증되지 않는 parameter가 대상입니다. 먼저Source/WebKit/GPUProcess/에서MESSAGE_CHECK를 검색한 뒤,UnifiedWebPreferences.yaml에서sharedPreferenceForWebProcess: true가 없는 설정 이름과 교차 확인합니다. -
실험적 기능 gate 없이 기기/드라이버가 보고한 문자열로 계산된 WebGL/WebGPU extension 및 기능 목록.
GraphicsContextGLANGLE::initialize와 WebGPU adapter feature 열거 과정을 점검합니다. requestable-extensions 배열에서 upstream 기준으로 "draft" 상태이지만 현재 필터링되지 않는 항목이 있는지 확인합니다.ANGLE_base_vertex_base_instance를 위해 도입된 filter loop에, 각 draftGCGLExtensionenum 값에 대응하는 gate가 있는지 검증합니다. -
GPU/Networking process에 동기화된 shared preference가 WebContent의 값과 달라질 수 있는 상황.
GPUConnectionToWebProcess에서m_sharedPreferencesForWebProcess의 업데이트 순서와createGraphicsContextGL의 처리 순서를 검토합니다. Preference 변경이 처리 중인 context 생성 IPC보다 먼저 적용되는지 확인해야 합니다. Staletrue상태에서 gate가false로 관찰되기 직전에 context 생성이 허용될 가능성이 있습니다. -
ANGLE_base_vertex_base_instance내부의 parameter validation. 음수 또는 비정상적으로 큰 값이 플랫폼 GL 드라이버에 전달되기 전에 clamp 처리되는지 확인합니다. 이 extension이 gate 대상으로 특별히 지목된 것은, 해당 validation surface가 신뢰할 수 없는 것으로 능동적으로 검토되고 있음을 시사합니다.
Note:
WebGLDraftExtensionsEnabled와 무관하게 모든 WebContent에서ANGLE_base_vertex_base_instance에 접근 가능했다는 사실, draft extension이 non-draft에 비해 hardening이 부족하다는 주장,m_sharedPreferencesForWebProcess업데이트 race에 대한 추론은 모두 diff의 형태에서 도출된 것입니다. 직접 입증된 사항은 아닙니다. 구조적 변경 자체, 즉 preference가 IPC를 통해 연결되고 신뢰된 복사본에MESSAGE_CHECK가 추가되며 extension filter가 도입된 것은 패치에서 명확히 확인됩니다.