Summary

In FreeRDP < 2.4.0 (Windows), a malicious RDP server could remotely leak memory from a client’s system through the clipboard extension (enabled by default).

Details

The bug resided in client/Windows/wf_cliprdr.c, in the wf_cliprdr_server_file_contents_request function.

When the client received a File Contents Request PDU through the CLIPRDR virtual channel, the attacker controlled the listIndex field (DWORD). Then, the client would either send the size of a copied file back to the server, or its contents.

When dwFlags == FILECONTENTS_SIZE:

*((UINT32*)&pData[0]) =
  clipboard->fileDescriptor[fileContentsRequest->listIndex]->nFileSizeLow;
*((UINT32*)&pData[4]) =
  clipboard->fileDescriptor[fileContentsRequest->listIndex]->nFileSizeHigh;

An attacker could set listIndex to a value greater than the actual length of the fileDescriptor array. If they managed to find an offset to a valid pointer in the heap after fileDescriptor, they could leak a QWORD that is sent back to the server. This allowed, for instance, to remotely leak client ASLR.