1

ndis ドライバーでバッファー オーバーフローを処理するにはどうすればよいですか。バッファ オーバーフローのシナリオや、バッファ オーバーフロー状態の使用例を誰か教えてください。

4

1 に答える 1

2

NDIS ミニポート ドライバーの場合

MTU より大きいパケットを受信した場合は、破棄します。NDIS までのパケットを示さない (つまり、パケットを に渡さないNdisMIndicateReceiveNetBufferLists)。可能であれば、ifInErrors統計カウンターを増やします。

上記のルールはNDIS_PACKET_TYPE_PROMISCUOUSフラグの影響を受けません。無差別モードの場合でも、過度に大きなパケットを示しません。ただし、ハードウェアで許可されている場合は、プロミスキャス モードの場合、過度に小さい (「ラント」とも呼ばれる) パケットを示す必要があります。

MTU より大きいパケットを送信するよう求められた場合は、送信しないでください。を使用して NBL を割り当てNET_BUFFER_LIST::Status = NDIS_STATUS_INVALID_LENGTH、NDIS に戻しNdisMSendNetBufferListsCompleteます。(このようなパケットが表示されることはないと思います。NDIS がそのようなパケットを送信しようとするのはバグです。)

NDIS プロトコル ドライバーの場合

MTU より大きいパケットを受信した場合は、自由に破棄できます。

MTU より大きいパケットを送信しようとしないでください。

NDIS フィルター ドライバーの場合

フィルタが MTU ( ) より大きいパケットを受信した場合、フィルタFilterReceiveNetBufferListsはすぐにパケットを破棄することがあります (NdisFReturnNetBufferLists受信指示が で行われないNDIS_RECEIVE_FLAGS_RESOURCES場合、またはリソース フラグが設定されている場合はただちに戻る場合)。

フィルタが MTU より大きいパケットを送信するように要求された場合 ( FilterSendNetBufferLists)、フィルタはパケットを割り当てNET_BUFFER_LIST::Status = NDIS_STATUS_INVALID_LENGTHてすぐに返すことができます ( NdisFSendNetBufferListsComplete)。

フィルターは、フィルターを通過するすべてのパケットのサイズを検証する義務はありません。ただし、不正な形式のパケットが原因でフィルタがバッファ オーバーフローを引き起こす可能性がある場合は、フィルタでパケットのサイズを検証する必要があります。たとえば、フィルターがすべての ARP 応答を事前に割り当てられたバッファーにコピーする場合、最初に ARP 応答が大きすぎてバッファーに収まらないことを確認します。(ミニポートが過度に大きなパケットを「与えるべきではない」ため、これは厳密には必要ではありません。ただし、ネットワーク データパス上にいるため、潜在的にバグのあるミニポートによって処理されている信頼できないデータを処理していることになります。少し余分な多層防御は良い考えです。)

フィルターは、MTU よりも大きいパケットを発信してはなりません (送信パスまたは受信パスのいずれかで)。

于 2013-09-14T05:21:25.860 に答える