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

STR08-C. 新たに開発する文字列処理するコードには managed string を使用する

Specifications for Managed Strings [Burch 2006] で説明されている CERT managed string library は、コードの品質とセキュリティの向上を実現できる文字列ライブラリに対するニーズを受けて開発された。このライブラリは広く様々な処理系に採用でき、将来標準化されるときにも妨げとならないよう注意深く設計されている。

このライブラリは広く様々な処理系に採用でき、将来標準化されるときにも妨げとならないよう注意深く設計されている。managed string library は、メモリの割り当てと再割り当てを必要に応じて行う、動的メモリ管理手法に基づいている。

このライブラリは、結果の文字列(終端の null 文字も含め)に常に十分な領域があることを保証することで、無制限文字列コピー、null 終端エラー、切り捨ての可能性を排除する。メモリを割り当てることができない場合、実行時制約違反を発生させることで、成功または失敗を示す。

managed string library は、データの無害化処理の仕組みも提供しているが、これは(必要に応じて)文字列のすべての文字があらかじめ定義された安全な文字集合に属する文字であることをチェックすることで実現している。

次のコードは、managed string library を使用して managed string を作成する方法と、managed string から null 終端バイト文字列を取得する方法を示している。

errno_t retValue;
char *cstr;  /* null 終端バイト文字列へのポインタ */
string_mx *str1 = NULL;

retValue = strcreate_m(&str1, "hello, world", 0, NULL);
if (retValue != 0) {
  fprintf(stderr, "Error %d from strcreate_m.\n", retValue);
}
else { /* null 終端バイト文字列を取得して表示する */
  retValue = getstr_m(&cstr, str1);
  if (retValue != 0) {
    fprintf(stderr, "error %d from getstr_m.\n", retValue);
  }
  printf("(%s)\n", cstr);
  free(cstr); /* null 終端バイト文字列を解放 */
  cstr = NULL;
}

fprintf() および printf() の呼び出しは、C [ISO/IEC 9899:2011] の標準関数であり、managed string 関数ではないことに注意。

技術文書 ISO/IEC TR 24731-2 [ISO/IEC TR 24731-2:2010] も、文字列関数の結果を必要に応じて動的に割り当てる API を規定している。

リスク評価

C 標準 [ISO/IEC 9899:2011] セクション 7.24 やその他で定義されている文字列処理関数を使うと、深刻かつ悪用可能な脆弱性につながる、ありがちなプログラミングエラーを引き起こしやすい。managed string を適切に使用することにより、特に新たな開発において、これらのエラーの多くを排除できる。

レコメンデーション

深刻度

可能性

修正コスト

優先度

レベル

STR08-C

P6

L2

参考資料
[Burch 2006]  
[CERT 2006c]  
[Seacord 2013] Chapter 2, "Strings"
翻訳元

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

STR08-C. Use managed strings for development of new string manipulation code (revision 29)

Top へ

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