OSDN Git Service

Fix vulnerability in MemoryIntArray
authorSvetoslav Ganov <svetoslavganov@google.com>
Thu, 8 Dec 2016 23:58:02 +0000 (23:58 +0000)
committerSvetoslav Ganov <svetoslavganov@google.com>
Fri, 9 Dec 2016 00:08:33 +0000 (00:08 +0000)
commit1181f448c1a0705328a5593810100946e0c3e0dd
tree802f153b2c65cf2cc59adc9f851001ff8a5ff369
parent43966dafb3d3b2d04ac7e63198cd42047df00969
Fix vulnerability in MemoryIntArray

MemoryIntArray was using the size of the undelying
ashmem region to mmap the data but the ashmem size
can be changed until the former is memory mapped.
Since we use the ashmem region size for boundary
checking and memory unmapping if it does not match
the size used while mapping an attacker can force
the system to unmap memory or to access undefined
memory and crash.

Also we were passing the memory address where the
ashmem region is mapped in the owner process to
support cases where the client can pass back the
MemoryIntArray instance. This allows an attacker
to put invalid address and cause arbitrary memory
to be freed.

Now we no longer support passing back the instance
to the owner process (the passed back instance is
read only), so no need to pass the memory adress
of the owner's mapping, thus not allowing freeing
arbitrary memory.

Further, we now check the memory mapped size against
the size of the underlying ashmem region after we do
the memory mapping (to fix the ahsmem size) and if
an attacker changed the size under us we throw.

Tests: Updated the tests and they pass.

bug:33039926
bug:33042690

Change-Id: Ibf56827209a9b791aa83ae679219baf829ffc2ac
core/java/android/util/MemoryIntArray.java
core/jni/android_util_MemoryIntArray.cpp
core/tests/utiltests/Android.mk
core/tests/utiltests/jni/Android.mk [new file with mode: 0644]
core/tests/utiltests/jni/android_util_MemoryIntArrayTest.cpp [new file with mode: 0644]
core/tests/utiltests/jni/registration.cpp [new file with mode: 0644]
core/tests/utiltests/src/android/util/IRemoteMemoryIntArray.aidl
core/tests/utiltests/src/android/util/MemoryIntArrayTest.java
core/tests/utiltests/src/android/util/RemoteIntArray.java
core/tests/utiltests/src/android/util/RemoteMemoryIntArrayService.java
packages/SettingsProvider/src/com/android/providers/settings/GenerationRegistry.java