patch "binder: fix possible UAF when freeing buffer" added to char-misc-linus
Subsystems (2)
This is a note to let you know that I've just added the patch titled
binder: fix possible UAF when freeing buffer
to my char-misc git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git
in the char-misc-linus branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
From a370003cc301d4361bae20c9ef615f89bf8d1e8a Mon Sep 17 00:00:00 2001
From: Todd Kjos <[email protected]>
Date: Wed, 12 Jun 2019 13:29:27 -0700
Subject: binder: fix possible UAF when freeing buffer
There is a race between the binder driver cleaning up a completed transaction via binder_free_transaction() and a user calling binder_ioctl(BC_FREE_BUFFER) to release a buffer. It doesn't matter which is first but they need to be protected against running concurrently which can result in a UAF.
--- drivers/android/binder.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)
drivers/android/binder.c +14 -2
@@ -1941,8 +1941,18 @@ static void binder_free_txn_fixups(struct binder_transaction *t)static void binder_free_transaction (struct binder_transaction *t) { -if (t->buffer) - t->buffer->transaction =NULL ; +struct binder_proc *target_proc = t->to_proc; + +if (target_proc) { +binder_inner_proc_lock (target_proc); +if (t->buffer) + t->buffer->transaction =NULL ; +binder_inner_proc_unlock (target_proc); + } +/* +* If the transaction has no target_proc, then +* t->buffer->transaction has already been cleared. +*/ binder_free_txn_fixups (t);kfree (t);binder_stats_deleted (BINDER_STAT_TRANSACTION );
@@ -3551,10 +3561,12 @@ static void binder_transaction(struct binder_proc *proc,static void binder_free_buf (struct binder_proc *proc,struct binder_buffer *buffer) { +binder_inner_proc_lock (proc);if (buffer->transaction) { buffer->transaction->buffer =NULL ; buffer->transaction =NULL ; } +binder_inner_proc_unlock (proc);if (buffer->async_transaction && buffer->target_node) {struct binder_node *buf_node;struct binder_work *w;
Signature · 1 line
2.22.0