Re: [PATCH] mailbox: fix a UAF bug in msg_submit()

From: Xianting TIan
Date: Tue Aug 17 2021 - 04:01:13 EST



在 2021/8/17 下午1:58, Xianting TIan 写道:

在 2021/8/17 下午12:29, Jassi Brar 写道:
On Fri, Aug 6, 2021 at 7:15 AM Xianting Tian
<xianting.tian@xxxxxxxxxxxxxxxxx> wrote:
We met a UAF issue during our mailbox testing.

In synchronous mailbox, we use mbox_send_message() to send a message
and wait for completion. mbox_send_message() calls msg_submit() to
send the message for the first time, if timeout, it will send the
message in tx_tick() for the second time.

Seems like your controller's  .send_data() returns error. Can you
please explain why it does so? Because
send_data() only _accepts_ data for further transmission... which
should seldom be a problem.

Thanks for the comments,

We developed virtio-mailbox for heterogeneous virtualization system.

virtio-mailbox is based on the mialbox framework.

In virtio framework, its send func 'virtqueue_add_outbuf()' may return error, which caused .send_data() return error.  And also contains other csenarios.

But I think mailbox framework shouldn't depend on .send_data() always return OK,  as .send_data() is implemented by mailbox hardware manufacturer, which is not controlled by mailbox framework itself.

You said 'seldom',  but it still possible we can meet such issue. sucn as flexrm_send_data() of drivers/mailbox/bcm-flexrm-mailbox.c.

I think mailbox framework should be work normaly no matter .send_data() returns ok or not ok.  Do you think so? thanks

Another solution is to ignore the return value of .send_data() in msg_submit(),

change

        err = chan->mbox->ops->send_data(chan, data);
        if (!err) {
                chan->active_req = data;
                chan->msg_count--;
        }

to

        chan->mbox->ops->send_data(chan, data);
        chan->active_req = data;
        chan->msg_count--;

But the side effect of the solution is obvious, as if send failed in the first time, it will have no chance to sent it in tx_tick() for the second time. That is to say, no retry.

So I think the solution in this patch is better.

Looking forward to your further comments, thanks



thanks.