Cross-process ImageBitmap/ImageBuffer transfer under Site Isolation
Component: WebKit GPU Process | e594530
Site Isolation 환경에서 GPU-backed ImageBuffer는 GPU process에 존재합니다. 각 Web process는 자신의 GPU connection 범위로 한정된 RemoteRenderingBackend proxy를 통해 이를 참조합니다. 이전에는 moveToImageBuffer가 하나의 GPU process connection 안에서만 buffer를 옮길 수 있었습니다. 그 결과 SerializedScriptValue는 다른 renderer로 향하는 message에 ImageBitmap을 담는 것을 거부했습니다. 이번 commit은 이 transfer 메커니즘을 process 경계 너머로 확장했습니다.
Significance
GPU, UI, Network process와 두 Web process에 걸친 새로운 중개 protocol이 도입되어, GPU가 소유한 pixel memory를 renderer 간에 옮길 수 있게 되었습니다. cross-site iframe으로의 ImageBitmap transfer가 조용히 실패하던 문제도 함께 수정되었습니다. 이 과정에서는 process 정보가 포함된 ImageBufferTransferIdentifier가 사용됩니다. 먼저 SerializedImageBuffer::sinkIntoTransferHandle을 통해 buffer가 GPU process 전역 "transfer heap"에 임시로 보관됩니다. 이때 UI process는 trust broker 역할을 맡아 목적지를 승인합니다. 수신 측은 승인 이후에 buffer를 자신의 RemoteRenderingBackend로 가져옵니다. 한편 MessagePort 전달의 경우에는 먼저 Network process를 거치게 됩니다.
Audit directions
좁은 범위: 목적지 process가 transfer heap entry를 가져가기 전에 UI process의 승인이 확실히 완료되는지 확인해야 합니다. broker와 race하는 claim이 곧 실패 지점입니다. 넓은 범위: process 정보가 포함된 identifier를 key로 쓰는 GPU process 전역 handoff heap은 모두 같은 위험을 공유합니다. 즉 double-claim이나 잘못된 목적지로 전달되는 문제가 발생할 수 있습니다. 다른 sinkInto*Handle/transfer identifier 경로도 점검할 필요가 있습니다. 징후: broker의 authorization callback이 실행되기 전에 이미 읽을 수 있는 transfer heap entry.