Inspeção de fluxo

Inspeção de fluxo embutido

Os modificadores de fluxo embutidos podem editar dados de fluxo permitindo ou bloqueando uma parte dos dados indicados definindo o valor do membro countBytesEnforced da estrutura FWPS_STREAM_CALLOUT_IO_PACKET0 à medida que retornam FWP_ACTION_PERMIT ou FWP_ACTION_BLOCK da função de texto explicativo classifyFn . Eles também podem chamar a função FwpsStreamInjectAsync0 para adicionar um novo conteúdo ao fluxo. Esse conteúdo pode ser novo ou pode substituir dados bloqueados.

Para substituir um padrão encontrado no meio de um segmento indicado (por exemplo, n bytes seguidos por um padrão de p bytes seguido por m bytes), o texto explicativo seguiria estas etapas:

  1. A função classifyFn do texto explicativo é chamada usando n + p + m bytes.

  2. O texto explicativo retorna FWP_ACTION_PERMIT com o membro countBytesEnforced definido como n.

  3. A função classifyFn do texto explicativo é chamada novamente com bytes p + m . O WFP chamará classifyFn novamente se countBytesEnforced for menor que o valor indicado.

  4. Na função classifyFn , o texto explicativo chama a função FwpsStreamInjectAsync0 para injetar o padrão de substituição p'. Em seguida, o texto explicativo retorna FWP_ACTION_BLOCK com countBytesEnforced definido como p.

  5. A função classifyFn do texto explicativo é chamada novamente com m bytes.

  6. O texto explicativo retorna FWP_ACTION_PERMIT com countBytesEnforced definido comom.

Se os dados indicados forem insuficientes para que o texto explicativo tome uma decisão de inspeção, ele poderá definir o membro streamAction da estrutura FWPS_STREAM_CALLOUT_IO_PACKET0 como FWPS_STREAM_ACTION_NEED_MORE_DATA e definir o membro countBytesRequired como o valor mínimo que o WFP deve acumular antes que os dados sejam indicados novamente. Quando streamAction é definido, o texto explicativo deve retornar FWP_ACTION_NONE da função classifyFn .

O WFP pode acumular até 8 MB de dados de fluxo quando FWPS_STREAM_ACTION_NEED_MORE_DATA está definido. O WFP definirá o sinalizador FWPS_CLASSIFY_OUT_FLAG_BUFFER_LIMIT_REACHED quando chamar a função classifyFn do texto explicativo e o espaço de buffer estiver esgotado. Quando o último sinalizador é definido, o texto explicativo deve aceitar os dados indicados na íntegra. Um texto explicativo não deve retornar FWPS_STREAM_ACTION_NEED_MORE_DATA quando o sinalizador FWPS_CLASSIFY_OUT_FLAG_NO_MORE_DATA está definido.

Para facilitar a verificação de um padrão de fluxo de um buffer simples, o WFP fornece a função do utilitário FwpsCopyStreamDataToBuffer0 , que pode copiar dados de fluxo indicados em um buffer contíguo.

Inspeção de fluxo fora de banda

Para inspeção ou modificação fora de banda, um texto explicativo de fluxo seguiria o padrão semelhante ao texto explicativo de inspeção de pacotes: primeiro clonaria todos os segmentos de fluxo indicados para processamento adiado e, em seguida, bloquearia esses segmentos. Os dados inspecionados ou modificados são injetados posteriormente no fluxo de dados. Ao injetar dados fora de banda, o texto explicativo deve retornar FWP_ACTION_BLOCK em todos os segmentos indicados para garantir a integridade do fluxo resultante. Um módulo de inspeção fora de banda não deve injetar arbitrariamente um FIN (que indica que não há mais dados do remetente) em um fluxo de dados de saída. Se o módulo precisar remover a conexão, sua função de texto explicativo classifyFn deverá definir o membro streamAction da estrutura FWPS_STREAM_CALLOUT_IO_PACKET0 como FWPS_STREAM_ACTION_DROP_CONNECTION.

Nota É uma violação do contrato para que os textos explicativos mudem de fora de banda para embutido e possam causar comportamentos inesperados. Verifique se os textos explicativos fora de banda estão atendendo a cada um dos critérios especificados.

Como os dados de fluxo podem ser indicados como uma cadeia de NET_BUFFER_LIST , o FWP fornece as funções do utilitário FwpsCloneStreamData0 e FwpsDiscardClonedStreamData0 que operam em cadeias de lista de buffers líquidos.

O WFP também dá suporte à limitação de dados de fluxo para a direção de entrada. Se um texto explicativo não puder acompanhar a taxa de dados de entrada, ele poderá retornar FWPS_STREAM_ACTION_DEFER para "pausar" o fluxo. Em seguida, o fluxo pode ser "retomado" chamando a função FwpsStreamContinue0 . Adiar um fluxo com essa função faz com que a pilha TCP/IP interrompa o processamento de dados de entrada do ACK. Isso faz com que a janela deslizante TCP diminua para 0.

Para textos explicativos de inspeção de fluxo fora de banda, FwpsStreamContinue0 não deve ser chamado enquanto a função FwpsStreamInjectAsync0 for chamada.

Os dados de fluxo injetados não serão indicados novamente para o texto explicativo, mas serão disponibilizados para transmitir textos explicativos de subcamadas de menor peso.

O Exemplo de Edição de Fluxo da Plataforma de Filtragem do Windows no repositório de exemplos de driver do Windows no GitHub mostra como executar a edição embutida e fora de banda na camada de fluxo.

Nota O Windows Server 2008 e posteriores não dão suporte à remoção de um filtro de fluxo durante os seguintes processos:

  • O texto explicativo está executando injeção de pacote fora de banda.

  • O texto explicativo está solicitando mais dados definindo o membro streamAction da estrutura FWPS_STREAM_CALLOUT_IO_PACKET0 como FWPS_STREAM_ACTION_NEED_MORE_DATA.

  • O texto explicativo está adiando um fluxo definindo o membro streamAction da estrutura FWPS_STREAM_CALLOUT_IO_PACKET0 como FWPS_STREAM_ACTION_DEFER.

Inspeção dinâmica de fluxo

O Windows 7 e versões posteriores dão suporte a inspeções dinâmicas de fluxo. Uma inspeção dinâmica de fluxo opera em um fluxo de dados de fluxo existente, em vez de criar e derrubar um novo. Um driver de texto explicativo que pode executar inspeções dinâmicas de fluxo deve definir o sinalizador FWP_CALLOUT_FLAG_ALLOW_MID_STREAM_INSPECTION no membro Flags da estrutura FWPS_CALLOUT1 ou FWPS_CALLOUT2 .

Evitando inspeções desnecessárias

Para executar inspeções de fluxo somente em conexões em que o driver está interessado, um texto explicativo pode definir o sinalizador FWP_CALLOUT_FLAG_CONDITIONAL_ON_FLOW no membro Flags da estrutura FWPS_CALLOUT0 . Esse texto explicativo será ignorado em todas as outras conexões. O desempenho será melhorado e o driver não precisará manter dados de estado desnecessários.

Modelo de cascata da camada de fluxo

A camada de fluxo no WFP segue um modelo de cascata estrito; ou seja, um texto explicativo nessa camada só poderá inspecionar um segmento de fluxo se o texto explicativo anterior (se houver) o permitisse explicitamente. Se um texto explicativo bloquear um segmento indicado, esse segmento será retirado permanentemente do fluxo e nenhum texto explicativo poderá inspecioná-lo.

Além disso:

  1. Cada texto explicativo não inspecionado na camada de fluxo deve atribuir explicitamente um valor ao membro actionType do parâmetro classifyOut , independentemente de qual valor possa ter sido definido anteriormente nesse parâmetro.
  2. O sinalizador FWPS_RIGHT_ACTION_WRITE no membro de direitos do parâmetro classifyOut não tem significado na camada de fluxo do WFP. Os textos explicativos nessa camada não devem marcar para a presença desse sinalizador. Os textos explicativos podem processar o parâmetro layerData indicado, independentemente do valor de classifyOut-rights>.