MCCP-Pufferschutz

Ab Windows Vista führt die RPC-Marshalling-Engine weitere Schritte aus, um clientseitige Pufferüberläufe aufgrund von zurückgegebenen Daten zu verhindern. Diese Funktion wird als Mini Compute Conformance Protection (MCCP) bezeichnet.

Wenn der Client einen Zeiger auf einen vorhandenen Puffer an einen [out]- oder [in,out]-Parameter übergibt, werden die für diesen Parameter zurückgegebenen Daten in den vorhandenen Puffer kopiert. Wenn die zurückgegebenen Daten größer als der übergebene Puffer sind, kann ein Pufferüberlauf auftreten, wenn RPC die zurückgegebenen Daten in den zu kleinen Puffer kopiert. Weitere Informationen finden Sie unter Zeiger der obersten Ebene und eingebettete Zeiger.

Mit MCCP versucht RPC, diese Bedingung zu erkennen und den Aufruf abzulehnen, wenn er erkannt wird. Bei Puffern mit einem Korrelationswert, z. B. [size_is], wird der Aufruf abgelehnt, und RPC_X_BAD_STUB_DATA Ausnahme wird ausgelöst, wenn die zurückgegebenen Daten nicht in die angegebene Puffergröße passen. Bei nicht dimensionierten Zeichenfolgen wird der Aufruf abgelehnt, wenn die vorhandene Zeichenfolgengröße (Länge bis zum NULL-Abschlusszeichen ) nicht ausreicht, um die zurückgegebene Zeichenfolge zu enthalten, wird der Aufruf abgelehnt. RPC kann keine Pufferüberläufe unter allen Bedingungen erkennen, daher wird dem Entwickler empfohlen, weiterhin normale Vorsichtsmaßnahmen gegen Pufferüberläufe zu treffen.

Wenn der Client keinen vorhandenen Puffer für einen [out]-Parameter übergibt, sondern stattdessen einen dereferenzierten Zeiger auf NULL übergibt, befolgt RPC normale Regeln, um einen neuen Puffer im Namen des Clients zuzuweisen. Diesem Puffer wird ausreichend Speicherplatz für die zurückgegebenen Daten zugewiesen.

Ein zweiter Schutz besteht darin, dass RPC für korrelierte Parameter erzwingt, dass ein Puffer ungleich NULL übergeben wird, wenn die Korrelationsanzahlvariable ungleich NULL ist.

HRESULT PassString( [in] DWORD Length, [in, unique, string, size_is( Length )]LPWSTR MyString );

Wenn MyStringNULL ist, lehnt RPC den Aufruf ab, es sei denn , Length ist auf 0 festgelegt. Beachten Sie, dass die Länge von RPC 0 beträgt, während MyString nicht NULL ist, und RPC MyString als Pufferzuordnung mit 0 Längen behandelt.