Partager via


Problèmes de sécurité pour les codes de contrôle d’E/S

Le traitement sécurisé des IRP qui contiennent des codes de contrôle d’E/S dépend de la définition correcte des codes IOCTL et de l’examen attentif des paramètres que le pilote reçoit avec l’IRP.

Lorsque vous définissez de nouveaux codes IOCTL, utilisez les règles suivantes :

  • Spécifiez toujours une valeur FunctionCode égale ou supérieure à 0x800.

  • Spécifiez toujours une valeur RequiredAccess . Le gestionnaire d’E/S n’envoie pas de listes IOCTL si l’appelant a des droits d’accès insuffisants.

  • Ne définissez pas de codes IOCTL qui permettent aux appelants de lire ou d’écrire des zones non spécifiques de la mémoire du noyau.

Lorsque vous traitez des codes IOCTL dans un pilote, utilisez les règles suivantes :

  • Chaque fois qu’un test des routines de répartition d’un pilote a reçu des codes IOCTL, il doit toujours tester la valeur 32 bits entière.

  • Les pilotes peuvent utiliser IoValidateDeviceIoControlAccess pour effectuer dynamiquement une vérification d’accès plus stricte que celle spécifiée par la valeur RequiredAccess dans la définition du code de contrôle d’E/S.

  • Ne lisez ni n’écrivez jamais plus de données que la mémoire tampon vers laquelle Irp-AssociatedIrp.SystemBuffer> peut contenir. Par conséquent, case activée toujours Parameters.DeviceIoControl.InputBufferLength ou Parameters.DeviceIoControl.OutputBufferLength dans la structure IO_STACK_LOCATION pour déterminer les limites de mémoire tampon.

  • Toujours zéro mémoire tampon allouée au pilote qui contiendra les données destinées à une application à l’origine d’une requête IOCTL. De cette façon, vous ne copierez pas accidentellement des données sensibles dans l’application.

  • Pour les transferts METHOD_IN_DIRECT et METHOD_OUT_DIRECT, suivez les règles ci-dessus. En outre, case activée pour une valeur de retour NULL de MmGetSystemAddressForMdlSafe, ce qui indique que le mappage a échoué ou qu’une mémoire tampon de longueur zéro a été fournie.

  • Pour les transferts de METHOD_NEITHER, suivez les règles fournies dans Utilisation des E/S directes ou mises en mémoire tampon.