EN JP CN

BYTEORDER.HTON.SEND

BYTEORDER.HTON.SEND

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

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

BYTEORDER.HTON.SEND チェッカーは、ホスト側が送信するマルチバイト値が、送信される前に、ホストからネットワークバイトオーダーに変換されない場合をレポートします。

脆弱性とリスク

異なるバイトオーダー方法を持つシステム下で実行するプログラムが互いに通信する必要がある場合、バイトオーダーの変換の失敗は予期しない動作につながる可能性があります。データ転送時のこの問題を回避するには、型に適した変換関数を使用する必要があります。

脆弱コード例

1   #include <sys/types.h>
2   #include <sys/socket.h>
3   #include <netinet/in.h>
4
5   void test_01_send_A(int s, short x) {
6         short u = x + 12;
7         send(s, &u, sizeof u, 0); // <== error
8   }

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

修正コード例

1   #include <sys/types.h>
2   #include <sys/socket.h>
3   #include <netinet/in.h>
4
5   void test_01_send_B(int s, short x) {
6         short u = x + 12;
7         short v = htons(u);
8         send(s, &v, sizeof v, 0); // ok
9   }

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

拡張機能

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

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

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