Inspection de flux

Inspection de flux inline

Les modificateurs de flux inline peuvent modifier les données de flux en autorisant ou en bloquant une partie des données indiquées en définissant la valeur du membre countBytesEnforced de la structure FWPS_STREAM_CALLOUT_IO_PACKET0 , car ils retournent FWP_ACTION_PERMIT ou FWP_ACTION_BLOCK à partir de la fonction de légende classififn . Ils peuvent également appeler la fonction FwpsStreamInjectAsync0 pour ajouter du nouveau contenu au flux. Ce contenu peut être nouveau ou remplacer des données bloquées.

Pour remplacer un modèle trouvé au milieu d’un segment indiqué (par exemple, n octets suivis d’un modèle d’octets p suivis d’octets m ), la légende suit les étapes suivantes :

  1. La fonction classifyFn de la légende est appelée à l’aide de n + p + m octets.

  2. La légende retourne FWP_ACTION_PERMIT avec le membre countBytesEnforced défini sur n.

  3. La fonction classifiableFn de la légende est appelée à nouveau avec des octets p + m . LE PAM appellera de nouveau classifieFn si countBytesEnforced est inférieur au montant indiqué.

  4. À partir de la fonction classifyFn , la légende appelle la fonction FwpsStreamInjectAsync0 pour injecter le modèle de remplacement p'. La légende retourne ensuite FWP_ACTION_BLOCK avec countBytesEnforced défini sur p.

  5. La fonction classifiableFn de la légende est appelée à nouveau avec m octets.

  6. La légende retourne FWP_ACTION_PERMIT avec countBytesEnforced défini sur m.

Si les données indiquées sont insuffisantes pour que la légende puisse prendre une décision d’inspection, elle peut définir le membre streamAction de la structure FWPS_STREAM_CALLOUT_IO_PACKET0pour FWPS_STREAM_ACTION_NEED_MORE_DATA et définir le membre countBytesRequired sur le montant minimal que le PAM doit accumuler avant que les données soient à nouveau indiquées. Lorsque streamAction est défini, la légende doit retourner FWP_ACTION_NONE de la fonction classifiFn .

Le PAM peut accumuler jusqu’à 8 Mo de données de flux lorsque FWPS_STREAM_ACTION_NEED_MORE_DATA est défini. LE PAM définit l’indicateur FWPS_CLASSIFY_OUT_FLAG_BUFFER_LIMIT_REACHED lorsqu’il appelle la fonction classifiableFn de la légende et que l’espace tampon est épuisé. Lorsque ce dernier indicateur est défini, la légende doit accepter les données indiquées dans son intégralité. Une légende ne doit pas retourner FWPS_STREAM_ACTION_NEED_MORE_DATA lorsque l’indicateur FWPS_CLASSIFY_OUT_FLAG_NO_MORE_DATA est défini.

Pour faciliter l’analyse d’un modèle de flux à partir d’une mémoire tampon plate, PAM fournit la fonction utilitaire FwpsCopyStreamDataToBuffer0 , qui peut copier les données de flux indiquées dans une mémoire tampon contiguë.

Inspection de flux hors bande

Pour l’inspection ou la modification hors bande, une légende de flux suit le modèle similaire à celui de la légende d’inspection des paquets : elle clone d’abord tous les segments de flux indiqués pour un traitement différé, puis bloque ces segments. Les données inspectées ou modifiées sont réinjectées ultérieurement dans le flux de données. Lors de l’injection de données hors bande, la légende doit retourner FWP_ACTION_BLOCK sur tous les segments indiqués pour garantir l’intégrité du flux résultant. Un module d’inspection hors bande ne doit pas injecter arbitrairement un FIN (qui indique qu’il n’y a plus de données de l’expéditeur) dans un flux de données sortant. Si le module doit supprimer la connexion, sa fonction de légende classFn doit définir le membre streamAction de la structure FWPS_STREAM_CALLOUT_IO_PACKET0 sur FWPS_STREAM_ACTION_DROP_CONNECTION.

Note Il s’agit d’une violation du contrat pour les légendes de passer de la bande hors bande à inline, et peut entraîner des comportements inattendus. Vérifiez que les légendes hors bande répondent à chacun des critères spécifiés.

Étant donné que les données de flux peuvent être indiquées en tant que chaîne NET_BUFFER_LIST , FWP fournit les fonctions utilitaires FwpsCloneStreamData0 et FwpsDiscardClonedStreamData0 qui fonctionnent sur des chaînes de liste de mémoires tampons nettes.

Le PAM prend également en charge la limitation des données de flux pour la direction entrante. Si une légende ne peut pas suivre le rythme du débit de données entrant, elle peut retourner FWPS_STREAM_ACTION_DEFER pour « suspendre » le flux. Le flux peut ensuite être « repris » en appelant la fonction FwpsStreamContinue0 . Le report d’un flux avec cette fonction entraîne l’arrêt de la pile TCP/IP du traitement ACK des données entrantes. Cela entraîne une diminution de la fenêtre glissante TCP vers 0.

Pour les légendes d’inspection de flux hors bande, FwpsStreamContinue0 ne doit pas être appelé lorsque la fonction FwpsStreamInjectAsync0 est appelée.

Les données de flux injectées ne seront pas réinjectées dans la légende, mais elles seront rendues disponibles pour diffuser en continu des légendes provenant de sous-couches de poids inférieur.

L’exemple de modification du flux de la plateforme de filtrage Windows dans le référentiel d’exemples de pilotes Windows sur GitHub montre comment effectuer des modifications inline et hors bande au niveau de la couche de flux.

Note Windows Server 2008 et versions ultérieures ne prennent pas en charge la suppression d’un filtre de flux pendant les processus suivants :

  • La légende effectue l’injection de paquets hors bande.

  • La légende demande plus de données en définissant le membre streamAction de la structure FWPS_STREAM_CALLOUT_IO_PACKET0 sur FWPS_STREAM_ACTION_NEED_MORE_DATA.

  • La légende reporte un flux en définissant le membre streamAction de la structure FWPS_STREAM_CALLOUT_IO_PACKET0 sur FWPS_STREAM_ACTION_DEFER.

Inspection dynamique de flux

Windows 7 et versions ultérieures prennent en charge les inspections de flux dynamiques. Une inspection de flux dynamique fonctionne sur un flux de données de flux existant, plutôt que sur la création et la destruction d’un nouveau flux. Un pilote de légende capable d’effectuer des inspections dynamiques de flux doit définir l’indicateur FWP_CALLOUT_FLAG_ALLOW_MID_STREAM_INSPECTION dans le membre Indicateurs de la structure FWPS_CALLOUT1 ou FWPS_CALLOUT2.

Éviter les inspections inutiles

Pour effectuer des inspections de flux uniquement sur les connexions qui intéressent le pilote, une légende peut définir l’indicateur FWP_CALLOUT_FLAG_CONDITIONAL_ON_FLOW dans le membre Indicateurs de la structure FWPS_CALLOUT0 . Cette légende sera ignorée sur toutes les autres connexions. Les performances seront améliorées et le pilote n’aura pas à gérer les données d’état inutiles.

Modèle de cascade de couche de flux

La couche de flux dans le PAM suit un modèle de cascade strict; autrement dit, une légende de cette couche n’est autorisée à inspecter un segment de flux que si la légende précédente (le cas échéant) l’autorise explicitement. Si une légende bloque un segment indiqué, ce segment est définitivement retiré du flux et aucune légende ne sera autorisée à l’inspecter.

Plus:

  1. Chaque légende non inspect au niveau de la couche de flux doit attribuer explicitement une valeur au membre actionType du paramètre classout , quelle que soit la valeur qui a été définie précédemment dans ce paramètre.
  2. L’indicateur FWPS_RIGHT_ACTION_WRITE dans le membre de droits du paramètre classout n’a aucune importance dans la couche de flux PAM. Les légendes de cette couche ne doivent pas case activée pour la présence de cet indicateur. Les légendes peuvent traiter le paramètre layerData indiqué, quelle que soit la valeur de classOut-rights>.