EN JP CN

BYTEORDER.NTOH.READ

BYTEORDER.NTOH.READ

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

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

BYTEORDER.NTOH.READ チェッカーは、マルチバイト値が環境から読み取られる前に、ネットワークからホストのバイトオーダーに変換されない場合をレポートします。

脆弱性とリスク

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

脆弱コード例

  1 #include <unistd.h>
  2 #include <netinet/in.h>
  3
  4
  5 void test_06_myread(int d, short *p) {
  6     read(d, p, sizeof *p);
  7 }
  8
  9 void test_06_myread_wrapper(int d, short *p) {
 10     test_06_myread(d, p);
 11 }
 12
 13
 14 int test_06_read(int d) {
 15     short u;
 16     test_06_myread_wrapper(d, &u);
 17     return u - 12; 
 18 }

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

修正コード例

  1 #include <unistd.h>
  2 #include <netinet/in.h>
  3
  4
  5 void test_06_myread(int d, short *p) {
  6     read(d, p, sizeof *p);
  7 }
  8
  9 void test_06_myread_wrapper(int d, short *p) {
 10     test_06_myread(d, p);
 11 }
 12
 13
 14 int test_06_read(int d) {
 15     short u;
 16     test_06_myread_wrapper(d, &u);
 17     return ntohs(u) - 12;
 18 }

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

拡張機能

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

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

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