MCCP-Pufferschutz
Ab Windows Vista führt das RPC Marshalling Engine weitere Schritte aus, um zu verhindern, dass clientseitige Pufferüberläufe aufgrund zurückgegebener Daten überschritten werden. Diese Einrichtung wird als Mini Compute Conformance Protection (MCCP) bezeichnet.
Wenn der Client einen Zeiger an einen vorhandenen Puffer an ein [out] oder [in,ausgabe] Parameter, werden zurückgegebene Daten für diesen Parameter 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. Siehe Top-Level und eingebettete Zeiger.
Bei MCCP versucht RPC, diese Bedingung zu erkennen und den Aufruf abzulehnen, wenn er erkannt wird. Bei Puffern mit einem Korrelationswert, z. B. [size_is], wenn die zurückgegebenen Daten nicht in die angegebene Puffergröße passen, wird der Aufruf abgelehnt und RPC_X_BAD_STUB_DATA Ausnahme ausgelöst. Bei nicht lokalisierten Zeichenfolgen wird der Aufruf abgelehnt, wenn die vorhandene Zeichenfolgengröße (länge bis zum NULL- Terminator) nicht ausreicht, um die zurückgegebene Zeichenfolge aufzunehmen, wird der Aufruf abgelehnt. RPC kann Pufferüberläufe in allen Bedingungen nicht erkennen, daher wird empfohlen, weiterhin normale Vorsichtsmaßnahmen gegen Pufferüberläufe zu ergreifen.
Wenn der Client keinen vorhandenen Puffer für einen [out]-Parameter übergibt, sondern stattdessen einen abgeleiteten Zeiger an NULL-übergibt, befolgt RPC normale Regeln, um einen neuen Puffer im Auftrag des Clients zuzuweisen. Dieser Puffer wird mit ausreichend Speicherplatz zugewiesen, um die zurückgegebenen Daten zu enthalten.
Ein zweiter Schutz besteht darin, dass rpc bei korrelierten Parametern erzwingt, dass ein nichtNull- Puffer übergeben wird, wenn die Korrelationsanzahlvariable nichtNULL-ist.
HRESULT PassString( [in] DWORD Length, [in, unique, string, size_is( Length )]LPWSTR MyString );
Wenn MyString-NULL-ist, lehnt RPC den Aufruf ab, es sei denn, Length ist auf 0 festgelegt. Beachten Sie, dass RPC zulässt, dass Length- 0 sein kann, während MyString- nichtNULL-ist, und RPC behandelt MyString- als 0-Länge-Pufferzuweisung.