
FSRendezvousServer::PublishRx 및 ConsumeTx에서 발생하는 use-after-free 경쟁 조건 분석으로, Close()가 뮤텍스 해제와 잠금 획득 사이에 FSStreamReg 객체를 해제할 수 있는 문제를 다룹니다.
FSRendezvousServer::PublishRx와 FSRendezvousServer::ConsumeTx는 동일하고 결함 있는 패턴으로 FSStreamReg 객체를 역참조합니다. 서버 뮤텍스를 획득하고, 객체가 여전히 리스트에 존재하는지 확인한 뒤, 뮤텍스를 해제하고, 그다음 객체 자체의 락을 획득합니다. 그 사이에 객체를 살아 있게 유지하는 것은 아무것도 없습니다.
참조가 획득되지 않기 때문에, 서버 뮤텍스가 해제된 시점과 객체 자체의 락이 획득되는 시점 사이에 FSRendezvousServer::Close()가 객체를 해제할 수 있는 좁은 윈도가 존재하며, 이로 인해 use-after-free가 발생합니다.
Credit: @zoverin