ndis ドライバーでバッファー オーバーフローを処理するにはどうすればよいですか。バッファ オーバーフローのシナリオや、バッファ オーバーフロー状態の使用例を誰か教えてください。
1 に答える
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 よりも大きいパケットを発信してはなりません (送信パスまたは受信パスのいずれかで)。