JPCERT コーディネーションセンター

FIO38-C. 入出力操作に FIlE オブジェクトのコピーを使用しない

ストリームの制御に使用する FILE オブジェクトのアドレスが重要な意味を持つ場合があり、FILE オブジェクトのコピーは、必ずしも元のオブジェクトの代りに使用できるとは限らない。したがって、いかなる入出力操作にも FIlE オブジェクトのコピーを使用してはならない。

違反コード

以下のコード例は fputs() の呼び出しに stdout のコピーを使用しているため失敗する可能性がある。

int main(void) {
  FILE my_stdout = *(stdout);
  if (fputs("Hello, World!\n", &my_stdout) == EOF) {
    /* エラー処理 */
  }
  return 0;
}

たとえば、上記のコードは、Microsoft Visual Studio 2005 でコンパイルされ Windows で実行されると「アクセス違反」が発生し、プログラムは終了する。

適合コード

以下の解決法では、FILE オブジェクトへのポインタのコピーを使って fputs() を呼び出している。

int main(void) {
  FILE *my_stdout = stdout;
  if (fputs("Hello, World!\n", my_stdout) == EOF) {
    /* エラー処理 */
  }
  return 0;
}
リスク評価

FILE オブジェクトのコピーを元のオブジェクトの代わりに使用するとクラッシュが発生し、サービス運用妨害 (DoS) 攻撃に利用される可能性がある。

ルール 深刻度 可能性 修正コスト 優先度 レベル
FIO38-C P4 L3
自動検出

Compass/ROSE はこのルールの単純な違反を検出することができる。

参考情報
翻訳元

これは以下のページを翻訳したものです。

FIO38-C. Do not use a copy of a FILE object for input and output

Top へ

Topへ
最新情報(RSSメーリングリストTwitter