스트림 검사

인라인 스트림 검사

인라인 스트림 한정자는 classifyFn 설명선 함수에서FWP_ACTION_PERMIT 또는 FWP_ACTION_BLOCK 반환할 때 FWPS_STREAM_CALLOUT_IO_PACKET0 구조체의 countBytesEnforced 멤버 값을 설정하여 표시된 데이터의 일부를 허용하거나 차단하여 스트림 데이터를 편집할 수 있습니다. FwpsStreamInjectAsync0 함수를 호출하여 스트림에 새 콘텐츠를 추가할 수도 있습니다. 이 콘텐츠는 새 콘텐츠이거나 차단된 데이터를 대체할 수 있습니다.

표시된 세그먼트의 중간에 있는 패턴을 바꾸려면(예: n 바이트 뒤에 p 바이트 패턴, m 바이트) 설명선은 다음 단계를 수행합니다.

  1. 호출 아웃의 classifyFn 함수는 n + p + m 바이트를 사용하여 호출됩니다.

  2. 호출은 countBytesEnforced 멤버가 n으로 설정된 FWP_ACTION_PERMIT 반환합니다.

  3. 콜아웃의 classifyFn 함수는 p + m 바이트로 다시 호출됩니다. countBytesEnforced가 표시된 양보다 작은 경우 WFP는 classifyFn을 다시 호출합니다.

  4. classifyFn 함수에서 설명선은 FwpsStreamInjectAsync0 함수를 호출하여 대체 패턴 p'를 삽입합니다. 그런 다음, callout은 countBytesEnforcedp로 설정된 FWP_ACTION_BLOCK 반환합니다.

  5. 콜아웃의 classifyFn 함수는 m 바이트로 다시 호출됩니다.

  6. 콜아웃은 countBytesEnforcedm으로 설정된 FWP_ACTION_PERMIT 반환합니다.

표시된 데이터가 설명선에서 검사를 결정하기에 충분하지 않은 경우 FWPS_STREAM_CALLOUT_IO_PACKET0 구조의 streamAction 멤버를 FWPS_STREAM_ACTION_NEED_MORE_DATA 설정하고 countBytesRequired 멤버를 데이터가 다시 표시되기 전에 WFP가 누적해야 하는 최소 크기로 설정할 수 있습니다. streamAction이 설정되면 callout은 classifyFn 함수에서 FWP_ACTION_NONE 반환해야 합니다.

WFP는 FWPS_STREAM_ACTION_NEED_MORE_DATA 설정되면 최대 8MB의 스트림 데이터를 누적할 수 있습니다. WFP는 콜아웃의 classifyFn 함수를 호출하고 버퍼 공간이 소진될 때 FWPS_CLASSIFY_OUT_FLAG_BUFFER_LIMIT_REACHED 플래그를 설정합니다. 후자 플래그가 설정되면 설명선은 표시된 데이터를 완전히 수락해야 합니다. FWPS_CLASSIFY_OUT_FLAG_NO_MORE_DATA 플래그가 설정되면 콜아웃이 FWPS_STREAM_ACTION_NEED_MORE_DATA반환해서는 안됩니다.

플랫 버퍼에서 스트림 패턴을 검사할 수 있는 편의를 위해 WFP는 표시된 스트림 데이터를 연속 버퍼에 복사할 수 있는 FwpsCopyStreamDataToBuffer0 유틸리티 함수를 제공합니다.

대역 외 스트림 검사

대역 외 검사 또는 수정의 경우 스트림 설명선은 패킷 검사 설명선과 유사한 패턴을 따릅니다. 먼저 지연 처리를 위해 표시된 모든 스트림 세그먼트를 복제한 다음 해당 세그먼트를 차단합니다. 검사되거나 수정된 데이터는 나중에 데이터 스트림에 다시 삽입됩니다. 대역 외 데이터를 삽입할 때 설명선은 표시된 모든 세그먼트에서 FWP_ACTION_BLOCK 반환하여 결과 스트림의 무결성을 보장해야 합니다. 대역 외 검사 모듈은 보내는 데이터 스트림에 FIN(보낸 사람의 데이터를 더 이상 나타내지 않음)을 임의로 삽입해서는 안 됩니다. 모듈이 연결을 삭제해야 하는 경우 classifyFn 설명선 함수는 FWPS_STREAM_CALLOUT_IO_PACKET0 구조체의 streamAction 멤버를 FWPS_STREAM_ACTION_DROP_CONNECTION 설정해야 합니다.

참고 콜아웃이 대역 외에서 인라인으로 전환하는 계약 위반 이며 예기치 않은 동작이 발생할 수 있습니다. 대역 외 설명선이 지정된 각 조건을 충족하는지 확인합니다.

스트림 데이터는 NET_BUFFER_LIST 체인으로 표시될 수 있으므로 FWP는 순 버퍼 목록 체인에서 작동하는 FwpsCloneStreamData0FwpsDiscardClonedStreamData0 유틸리티 함수를 제공합니다.

WFP는 들어오는 방향에 대한 스트림 데이터 제한도 지원합니다. 콜아웃이 들어오는 데이터 속도와 보조를 맞추지 못하는 경우 스트림을 "일시 중지"하는 FWPS_STREAM_ACTION_DEFER 반환할 수 있습니다. 그런 다음 FwpsStreamContinue0 함수를 호출하여 스트림을 "다시 시작"할 수 있습니다. 이 함수를 사용하여 스트림을 지연하면 TCP/IP 스택이 들어오는 데이터 ACK 처리를 중지합니다. 이로 인해 TCP 슬라이딩 윈도우가 0으로 줄어듭니다.

대역 외 스트림 검사 설명선의 경우 FwpsStreamInjectAsync0 함수가 호출되는 동안 FwpsStreamContinue0을 호출해서는 안 됩니다.

삽입된 스트림 데이터는 설명선에 다시 표시되지 않지만 중량이 낮은 하위 계층에서 설명선 스트리밍에 사용할 수 있습니다.

GitHub의 Windows 드라이버 샘플 리포지토리에 있는 Windows 필터링 플랫폼 스트림 편집 샘플은 스트림 계층에서 인라인 및 대역 외 편집을 수행하는 방법을 보여줍니다.

참고 Windows Server 2008 이상에서는 다음 프로세스 중에 스트림 필터 제거를 지원하지 않습니다.

  • 설명선이 대역 외 패킷 주입을 수행합니다.

  • 설명선은 FWPS_STREAM_CALLOUT_IO_PACKET0 구조체의 streamAction 멤버를 FWPS_STREAM_ACTION_NEED_MORE_DATA 설정하여 더 많은 데이터를 요청합니다.

  • 설명선은 FWPS_STREAM_CALLOUT_IO_PACKET0 구조체의 streamAction 멤버를 FWPS_STREAM_ACTION_DEFER 설정하여 스트림을 지연합니다.

동적 스트림 검사

Windows 7 이상에서는 동적 스트림 검사를 지원합니다. 동적 스트림 검사는 새 스트림을 만들고 분해하는 대신 기존 스트림 데이터 흐름에서 작동합니다. 동적 스트림 검사를 수행할 수 있는 설명선 드라이버는 FWPS_CALLOUT1 또는 FWPS_CALLOUT2 구조체의 Flags 멤버에서 FWP_CALLOUT_FLAG_ALLOW_MID_STREAM_INSPECTION 플래그를 설정해야 합니다.

불필요한 검사 방지

드라이버가 관심 있는 연결에 대해서만 스트림 검사를 수행하기 위해 설명선은 FWPS_CALLOUT0 구조의 Flags 멤버에서 FWP_CALLOUT_FLAG_CONDITIONAL_ON_FLOW 플래그를 설정할 수 있습니다. 이 설명선은 다른 모든 연결에서 무시됩니다. 성능이 향상되고 드라이버가 불필요한 상태 데이터를 유지 관리할 필요가 없습니다.

스트림 계층 폭포 모델

WFP의 스트림 계층은 엄격한 폭포 모델을 따릅니다. 즉, 이 계층의 설명선은 이전 설명선(있는 경우)이 명시적으로 허용한 경우에만 스트림 세그먼트를 검사할 수 있습니다. 설명선이 표시된 세그먼트를 차단하는 경우 해당 세그먼트는 스트림에서 영구적으로 제거되며 이를 검사할 수 있는 설명선이 없습니다.

또한:

  1. 스트림 계층에서 검사하지 않는 모든 설명선은 이전에 해당 매개 변수에 설정된 값에 관계없이 classifyOut 매개 변수의 actionType 멤버에 값을 명시적으로 할당해야 합니다.
  2. classifyOut 매개 변수의 rights 멤버에 있는 FWPS_RIGHT_ACTION_WRITE 플래그는 WFP 스트림 계층에서 아무런 의미가 없습니다. 이 계층의 설명선은 이 플래그가 있는지 검사 않아야 합니다. 설명선은 classifyOut-rights> 값에 관계없이 표시된 layerData 매개 변수를 처리할 수 있습니다.