zeromq / libzmq

ZeroMQ core engine in C++, implements ZMTP/3.1
https://www.zeromq.org
Mozilla Public License 2.0
9.67k stars 2.35k forks source link

UAF handling PGM dataloss event #4695

Open i-garrison opened 3 months ago

i-garrison commented 3 months ago

If pgm_recvmsgv returns PGM_IO_STATUS_RESET, the following code stores a pointer into block which is released via pgm_free_skb() call before returning to caller:

       //  Data loss.
        if (status == PGM_IO_STATUS_RESET) {
            struct pgm_sk_buff_t *skb = pgm_msgv[0].msgv_skb[0];

            //  Save lost data TSI.
>>>         *tsi_ = &skb->tsi;
            nbytes_rec = 0;

            //  In case of dala loss -1 is returned.
            errno = EINVAL;
>>>         pgm_free_skb (skb);
            return -1;
        }

https://github.com/zeromq/libzmq/blob/master/src/pgm_socket.cpp#L576-L581

This leads to some funny behavior under load at call site where zmq::pgm_receiver_t::in_event() does peer lookup here https://github.com/zeromq/libzmq/blob/master/src/pgm_receiver.cpp#L160-L174