(The fix and CVE number for this issue are unknown)
A specially crafted web-page can trigger an unknown memory corruption vulnerability in Google Chrome Accessibility code. An attacker can cause code to attempt to execute a method of an object using a vftable, when the pointer to that object is not valid, or the object is not of the expected type. Successful exploitation can lead to arbitrary code execution.
Chrome 48.
An attacker would need to get a target user to open a specially crafted webpage. Renderer accessibility must be enabled through the "--force-renderer-accessibility" command-line option. Disabling JavaScript will not prevent an attacker from triggering the vulnerable code path.
Repeatedly loading two different pages in an iframe can cause the accessibility
code to crash. This crash can happen in two different code paths, which are
similar and both end up crashing because of a corrupt blink::
instance.
The first code path calls blink::
with the corrupt
blink::
instance as an argument from AXNodeObject::
:
This causes an access violation when blink::
attempts to
call the isDisabledFormControl
method on the corrupt blink::
instance.
The second code path calls blink::
with the corrupt
blink::
instance as an argument from blink::
:
This can cause an access violation at various locations along the code path,
but almost certainly does so if the code reaches the part where it attempts to
match the attribute name, as the blink::
was
taken from a corrupt blink::
instance and that data is therefore almost
certainly completely invalid.
Is is unclear to me why the blink::
instance was corrupted. During
analysis, I was having trouble running Google Chrome with Page Heap enabled,
which severely limited my ability to reliably crash the application and find
out what information on the heap belongs to what object. Then, before I could
get my debugging environment fixed, the issue appears to have been fixed, as
I was no longer able to reproduce it. Any information on exploitability is
therefore based on speculation.
An attacker who is able to trigger the issue reliably, and has some control
over the corrupted blink::
instance that is returned, or heap memory
in this area, may be able to control execution flow through the
blink::
call, as this uses information from the
corrupted blink::
instance as a pointer to a vftable.
The disassembled code looks like this:
``C++
blink::
blink::
(This issue was never reported, as I was struggling with my debugging environment, as described above. At some point after I discovered it, this issue appears to have been fixed, as evidenced by the repro no longer working. However, I have no exact date, nor a fix number to provide here).