EN JP CN

BYTEORDER.NTOH.RECV

BYTEORDER.NTOH.RECV

ネットワークからホストへの受信後にバイト オーダーが変換されていません

マルチバイト値の格納方法には、主に、ビッグエンディアンとリトルエンディアンの 2 つのアプローチがあります。異なる方法を使用するシステム間でデータを転送する場合、マルチバイト値は、ホストバイトオーダーからネットワークバイトオーダーまたはその逆に変換する必要があります。BYTEORDER チェッカーは、このような状況で正しく変換されていないマルチバイト値を検出します。

BYTEORDER.NTOH.RECV チェッカーは、マルチバイト値が受信された後に、ネットワークからホストのバイトオーダーに変換されない場合をレポートします。

脆弱性とリスク

異なるバイトオーダー方法を持つシステム下で実行するプログラムが互いに通信する必要がある場合、バイトオーダーの変換の失敗は予期しない動作につながる可能性があります。ネットワークからホストへの変換とホストからネットワークへの変換は、データの移植性を確保するために、ネットワーク操作だけでなく、ファイルの読み取り/書き込み操作によっても実行される必要があります。適切な変換関数を使用することにより、データが使用される前のこの問題を回避できます。

脆弱コード例

1   #include <sys/types.h>
2   #include <sys/socket.h>
3   #include <netinet/in.h>
4
5   int test_01_recv_A(int s) {
6         short u;
7         recv(s, &u, sizeof u, 0);
8         return u - 12; 
9   }

Klocwork は 8 行目について、'u' が変換されずに受信されて使用されることを示す BYTEORDER.NTOH.RECV をレポートします。ネットワークからホストへの方向では、'u' は受信された後でホスト値に変換される必要があります。これが修正されない場合、予期しないプログラム動作になる可能性があります。

修正コード例

1   #include <sys/types.h>
2   #include <sys/socket.h>
3   #include <netinet/in.h>
4
5   int test_01_recv_B(int s) {
6         short u;
7         short v;
8         recv(s, &u, sizeof u, 0);
9         v = ntohs(u);
10        return v - 12; 
11  }

修正したコード例では、'short int' 型の受信値が、関数 'ntohs' の呼び出しで変換されます。ホストが正しい型の値を受信することにより、プログラムは意図したとおりに動作します。

拡張機能

このチェッカーは機能を拡張できます。プラットフォームとアプリケーションに固有の情報は、Klocwork knowledge base (ナレッジベース) を利用して追加できます。構成を使用して、バッファ操作を実行するシステム関数のプロパティを記述します。プラットフォーム固有の構成には、標準配布の一部として提供されているものもあります。

関連する C/C++ knowledge base (ナレッジベース) レコードには以下の種類があります。

詳細については、C/C++ 解析のチューニングを参照してください。