EN JP CN

BYTEORDER.HTON.WRITE

BYTEORDER.HTON.WRITE

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

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

BYTEORDER.HTON.WRITE チェッカーは、ホスト側が送信するマルチバイト値が、環境 (ファイルなど) に書き込まれる前に、ホストからネットワークバイトオーダーに変換されない場合をレポートします。

脆弱性とリスク

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

脆弱コード例

  1 #include <unistd.h>;
  2 #include <netinet/in.h>;
  3
  4
  5 void test_06_mywrite(int s, short *p) {
  6     write(s, p, sizeof *p);
  7 }
  8
  9 void test_06_mywrite_wrapper(int s, short *p) {
 10     test_06_mywrite(s, p);
 11 }
 12
 13
 14 void test_06_write(int s, short x) {
 15     short u = x + 12;
 16     test_06_mywrite_wrapper(s, &u); 
 17 }

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

修正コード例

  1 #include <unistd.h>
  2 #include <netinet/in.h>
  3
  4
  5 void test_06_mywrite(int s, short *p) {
  6     write(s, p, sizeof *p);
  7 }
  8
  9 void test_06_mywrite_wrapper(int s, short *p) {
 10     test_06_mywrite(s, p);
 11 }
 12
 13
 14 void test_06_write(int s, short x) {
 15     short u = x + 12;
 16     u = htons(u);
 17     test_06_mywrite_wrapper(s, &u);
 18 }

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

拡張機能

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

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

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