Obviously, this may be of interest to authors of security software that
aims to mitigate exploitation of 0-day: it should be possible to:
1) actively reserve memory regions referenced by such pointers to
prevent allocation by an exploit. The additional address space
fragmentation should not be a problem for most applications, but I have
no data, so you might want to consider:
2) analyze various binaries for their use of magic values, and actively
reserve only those memory regions referenced by such pointers. If that
still causes problems in some applications:
3) white-/black-list applications for this mitigation.

If any of the authors of EMET are reading this, please let me know so I
don't have to write you an email to make sure you have seen it for
consideration as an added mitigation.

Cheers,

SkyLined


On 21-06-2016 17:01, Berend-Jan Wever wrote:
> (You can read all this information in more detail on
> http://blog.skylined.nl)
>
> Software components such as memory managers often use magic values to
> mark memory as having a certain state. These magic values can be used
> during debugging to determine the state of the memory, and have often
> (but not always) been chosen to coincide with addresses that fall
> outside of the user-land address space on 32-bit versions of the
> Operating System. This can help detect vulnerabilities by causing an
> access violation when such magic value is used as a pointer as well as
> mitigate exploitation of such vulnerabilities by making it impossible to
> have this "poisoned" pointer refer allocated memory under the attacker's
> control.
>
> For instance, Microsoft's C++ debugging runtime library initializes
> stack memory to 0xCCCCCCCC. When an uninitialized object pointer is used
> to read the value of a property or call a method of the object, this
> reliably causes an access violation on 32-bit versions of Microsoft
> Windows and prevents an easy path to exploitation.
>
> The Wikipedia article on magic values has a list containing some of the
> values and when they are used. You will notice how all of the values
> used on Windows have their high bit set (i.e. >= 0x80000000). As explain
> earlier, this is because on 32-bit versions of Windows these addresses
> cannot be used to allocate memory in user-land by default. Windows does
> have a /3GB switch that allows you to change the upper limit for
> user-land memory to 0xC0000000, but AFAIK this is not used very often
> and still excludes a large number of magic values.
>
> Magic values on 64-bit OS-es
>
> On 64-bit architectures, there is no need to reserve part of the 32-bit
> address space for kernel memory. Consequently, a 32-bit applications
> running on 64-bit versions of Windows is able to allocate memory in
> almost the entire 32-bit address range. This allows 32-bit applications
> to allocate more memory, including at all addresses that these magic
> values can reference. Ever since their introduction over 10 years ago,
> Javascript heap-sprays in web-browsers in particular offers an attacker
> the ability to finely control memory allocations and their content for
> use in exploits.
>
> Proof-of-Concept
>
> Last year I stumbled upon a two different bugs in two different web
> browsers where a magic value was used to mark memory which had not yet
> been initialized. Both vulnerabilities allowed me to get the web
> browsers to use the memory as a pointer before initializing it to a sane
> value. using Javascript, I was able to allocate memory at the magic
> value address the web browsers ended up using and store information at
> this location that allowed me to exploit both of these two
> vulnerabilities. These issues have both been address, so I can discuss
> them in more detail.
>
> CVE-2014-1592 Firefox xul.dll!nsHtml5TreeOperation use of poisoned memory
>
> Mozilla 1088635 <https://bugzilla.mozilla.org/show_bug.cgi?id=1088635>
> covers a bug in Firefox that could it to use data from a freed and
> "poisoned" object through specially crafted HTML, which resulted in
> access violations around address |0x5a5a5a5a| on x86 systems. The memory
> used to back the object was marked with this magic value after it was
> freed. Because this magic value resulted in an address can be allocated
> even on 32-bit versions of Windows, I suggested in Mozilla 1182002
> <https://bugzilla.mozilla.org/show_bug.cgi?id=1182002> that the value
> get updated with something that makes it a little harder to exploit.
> This and other reasons for changing the magic values, led to magic
> values being changed to |0xe4e4e4e4| for uninitialized memory and
> |0xe5e5e5e5| for freed memory.
>
> verifier!AVrfDebugPageHeapAllocate incorrect memory initialization a.k.a
> Google Chrome use of uninitialized FLS pointer
>
> In August last year, I found what appear to be a thread-safety
> vulnerability in Google Chrome when handling audio data, that could lead
> to use of an uninitialized pointer. This issue is only visible when
> running Chrome with page heap enabled, as the memory used to store the
> pointer appears to be set to 0x00000000 after allocation when page heap
> is not enabled. This means this NULL pointer will not be used by the
> code to reference memory. However, when running Chrome with page heap
> enabled, the pointer will be initialized to 0xD0D0D0D0 and gets used in
> code that allows at least freeing of arbitrary memory pointers.
>
> After doing a more thorough analysis, Ricky Zhou explained to me in the
> Chromium bug
> <https://bugs.chromium.org/p/chromium/issues/detail?id=525288> that the
> issue is not in Chromium, but in |verifier.dll|. This DLL is used to
> implement page heap on Windows. The problem is that in
> |verifier!AVrfDebugPageHeapAllocate|, the |HEAP_ZERO_MEMORY| flag is
> sometimes ignored, which in this case caused the memory to get
> initialized with the wrong value. I reported this issue to Microsoft at
> the end of October last year and after getting the MSRC case number
> 31596, I never heard back from them again.
>
> Mitigating this type of attack
>
> While working on these issues, I realized that this type of attack is
> easy to mitigate by making sure the magic values point to memory that
> has been reserved and marked inaccessible. That way there is no risk of
> an attacker allocating the memory with data under his/her control for
> use in an exploit: whenever the application would attempt to access
> memory using a magic value as a pointer, this would reliably cause an
> access violation.
>
> Having a memory allocation at the various addresses represented by
> common magic values fragments the address space, reducing the largest
> possible continuous allocation and the total amount of memory available
> to the application. But most 32-bit applications do not depend on being
> able to allocate such large chunks of memory for normal operations, as
> this is impossible on 32-bit versions of Windows. Regardless, should one
> want to prevent this fragmentation, and at the same time organize the
> magic values to be more coherent and intuitive to developers, it might
> be useful to create an API that can be used to generate the magic
> values, and have the generated values be more similar, closer together
> and/or located at either edge of the free memory above address
> |0x80000000|.
>
> I have suggested adding mitigations such as a special API that allows an
> application to request magic values that are guaranteed to point to
> reserved memory to MSRC and they responded in November 2015 that they
> forwarded it to the Windows team for their consideration.
>
> Cheers,
>
> SkyLined
>
> http://twitter.com/berendjanwever
> http://blog.skylined.nl


_______________________________________________
Sent through the Full Disclosure mailing list
https://nmap.org/mailman/listinfo/fulldisclosure
Web Archives & RSS: http://seclists.org/fulldisclosure/

Reply via email to