null で終了していない、受信したバイト配列の長さを検証するにはどうすればよいですか?
-
25-09-2019 - |
質問
次の形式で、ネットワーク経由で構造体を受け取る C\C++ コードがあります。
struct DataStruct
{
int DataLen;
BYTE* Data;
}
私が持っているコードが実行されます Data
のループの中で DataLen
データを計算して処理します。
...問題:
コードが侵入テストのためにセキュリティ専門家に渡された後、彼らはこの構造体を送信する偽のアプリケーションを準備しました。 DataLen
実際の長さよりも大きい Data
. 。もちろん、これによりアクセス違反例外が発生します。
したがって、問題は、受信したメッセージの実際の長さをどのように検証できるかということです。 Data
?構造を変えずにできるのでしょうか?
前もって感謝します。
解決
ニースのセキュリティ専門家!私は私の会社は、そのような部署があればいいのに。
データがネットワークから受信されるたびには、ネットワークIOはあなたがread(2)
、recv(2)
、またはboost::asio::async_read
または私が見てきた何かを使用するかどうか、実際にバッファに書き込まれたバイト数を報告します。あなたのデータ構造のヘッダー内のフィールドを「フォローするバイト数が」そこだとき、その多くのバイトを受信(またはエラーになるまで発生した)、そしてだけにして、それが構築する必要がありましたまで繰り返し読み/ RECV /などを呼び出すことです典型的なユースケースそして、あなたのDataStruct(またはレポートのエラー)を返します。
他のヒント
あなたが受けているどのくらいのバイトを知っているので、ちょうどDataLen
とそれを比較します。
これは、構造を変更することなしには不可能です。 TCP / IPソケットから受信したデータは、プレーンな流れです。論理的には、それがパケットに分割されていません。物理パケットは、1つ以上のDataStructインスタンスを含んでいてもよい、1つのDataStructインスタンスは、二つ以上の物理パケットに分割することができます。現在の情報構造は、通信エラーや不正なパケットを一切が存在しない場合にのみ使用することができます。
本質的な制限がなければ、腐敗は簡単です。
いくつかの保護メカニズムは次のとおりです。
- 試してみてください
realloc()
許容可能なサイズ内のバッファ (Data
動的です) - 例外 は 友達:使用
SIGSEGV
でsignal(2)
,signal(7)
そしてsetjmp(2)
何か役に立つことをするために トライ/キャッチ コード構造。見る setjmp()/longjmp() とシグナル処理の組み合わせ このトピックについて簡単に説明します。使用sigaction(2)
さらに深く進みます(欠陥のあるアドレスを取得することによって)。