FROMLIST: binder: fix use-after-free in binder_transaction()
authorTodd Kjos <tkjos@google.com>
Mon, 25 Sep 2017 15:55:09 +0000 (08:55 -0700)
committerDanny Wood <danwood76@gmail.com>
Tue, 8 Oct 2019 13:51:11 +0000 (14:51 +0100)
commit024b02ab8f8214dc705ca415d08c2aa51600d2e2
treeddf5bf31671cb5eca388bc8ef7ed481ae675d447
parent26e7a1b3e0371d3a78cfa7a0b70dd21211402ca6
FROMLIST: binder: fix use-after-free in binder_transaction()

(from https://patchwork.kernel.org/patch/9978801/)

User-space normally keeps the node alive when creating a transaction
since it has a reference to the target. The local strong ref keeps it
alive if the sending process dies before the target process processes
the transaction. If the source process is malicious or has a reference
counting bug, this can fail.

In this case, when we attempt to decrement the node in the failure
path, the node has already been freed.

This is fixed by taking a tmpref on the node while constructing
the transaction. To avoid re-acquiring the node lock and inner
proc lock to increment the proc's tmpref, a helper is used that
does the ref increments on both the node and proc.

Bug: 66899329
Change-Id: Iad40e1e0bccee88234900494fb52a510a37fe8d7
Signed-off-by: Todd Kjos <tkjos@google.com>
drivers/android/binder.c