SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

実例で学ぶ脆弱性対策コーディング

TIFFライブラリに潜む脆弱性をつぶすパッチ

実例で学ぶ脆弱性対策コーディング 第2回

  • X ポスト
  • このエントリーをはてなブックマークに追加

 本連載では、脆弱性を含むサンプルコードを題材に、修正方法の例を解説していきます。今回のサンプルコードは、TIFFファイルの読み書きを行うためのライブラリ「libTIFF v3.6.1」です。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 この連載では、最初に問題のあるコードを示します。前回に引き続き今回も、まずはコードだけを見て、どこに問題があるのか考えてみてください。

 コードの後には、コードに含まれる脆弱性を見つけるためのヒントや、コードが行おうとしていることを理解するために役立つ背景知識などを説明します。コードを見ただけではどこに問題があるのか分からない、といった場合は、これらの説明を手がかりに考えてみてください。

 どこに問題があるのか分かったら、次にどのように修正すべきかを考えましょう。修正方法は一通りとは限りません。むしろ、複数の修正方法が考えられることが多いと思います。

 最後に、実際にどのような修正が行われたか説明します。自分が考えた修正案と比較してみてください。

サンプルコード

 さて、皆さんにコードレビューしていただくのは、TIFFファイルの読み書きを行うためのライブラリであるlibTIFF v3.6.1です。libTIFFはUNIXやLinux系OS、Windows、OpenVMSなどさまざまなプラットフォームで利用できる、可搬性の高いオープンソースのライブラリです。さまざまなアプリケーションに利用されています。

 以下がその脆弱なコードです。どのような問題がこのコードにあるのか考えてみましょう。

tiff-v3.6.1 libtiff/tif_dirread.c より抜粋
/* Fetch a tag that is not handled by special case code. */
static int TIFFFetchNormalTag(TIFF* tif, TIFFDirEntry* dp) {
...
if (dp->tdir_count > 1) {	/* array of values */
   char *p = NULL;

   switch (dp->tdir_type) {
...	  
       case TIFF_ASCII:
       case TIFF_UNDEFINED:	/* bit of a cheat ... */
           /*
	    * Some vendors write strings w/o the trailing
	    * NULL byte, so always append one just in case.
	    */
            cp = CheckMalloc(tif, dp->tdir_count+1, 1, mesg);
	    if ( (ok = (cp && TIFFFetchString(tif, dp, cp))) != 0 )   
	       cp[dp->tdir_count] = '\0';  /* XXX */
	    break;
   }
...

static char * CheckMalloc(TIFF* tif, tsize_t n, const char* what) {
   char *cp = (char*)_TIFFmalloc(n);
   if (cp == NULL)
      TIFFError(tif->tif_name, "No space %s", what);
   return (cp);
}

TIFFとlibTIFF

 脆弱性は、libtiff version 3.6.1のIFDのIFD Entryを処理する関数TIFFFetchNormalTagに存在しました。問題の解説を始める前にまず、TIFFのファイルフォーマットについて簡単に説明します。

 TIFF(Tagged Image File Format)は1986年にMicrosoftとAldus(後にAdobeが買収)が策定した画像ファイルフォーマットの1つです。TIFFには、解像度や符号化方式が異なる複数の画像データを1つのファイルにまとめて格納できるという特徴があり、特定のアプリケーションに依存しないため、さまざまなプログラムや組込み機器がTIFFをサポートしています。

 TIFFファイルの先頭8バイトはイメージファイルヘッダ(Image File Header)と呼ばれ、これはIFD(Image File Directory)を参照します。TIFFファイルには複数の画像を格納できるので、その場合は画像ごとにIFDエントリが存在することになります。各IFDエントリには、画像に関するデータと実画像データへのポインタが含まれます(図1)。

図1 TIFFのヘッダ
図1 TIFFのヘッダ

次のページ
脆弱性の解説

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
実例で学ぶ脆弱性対策コーディング連載記事一覧

もっと読む

この記事の著者

久保 正樹(JPCERT コーディネーションセンター)(クボ マサキ(JPCERT コーディネーションセンター))

脆弱性アナリストJPCERTコーディネーションセンター慶応義塾大学環境情報学部卒。ソニーでデスクトップPCのソフトウェア開発に携わったのち、米国ダートマス大学にてオーディオ信号処理、電子音響音楽の研究を行い、電子音響音楽修士を取得。2005年4月よりJPCERTコーディネーションセンターにて、脆弱性...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5151 2010/05/27 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング