SHOEISHA iD

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

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

Javaセキュアコーディング入門

整数オーバーフロー検出の3つのアプローチ
――mezzofantiのバグ修正

Javaセキュアコーディング入門(3)

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

mezzofantiにおける整数オーバーフローの問題

 mezzofantiはOCRエンジンtesseract-ocr使って実装されたAndroid向けアプリです。Android端末のカメラで撮影した写真をOCRエンジンを使って文字データに変換し、さらにGoogle Translateを使って各言語に翻訳してくれる優れモノですが、このアプリには整数オーバーフローに起因するバグが存在することが報告されています。

 問題はGetFreeSpaceB()メソッドにおけるSDカードの容量計算にありました。それでは早速問題のコードを見てみましょう。

mezzofanti/AssetsManager.java:

/**
  * @return the free space on sdcard in bytes
  */
public static long GetFreeSpaceB()
{
  try
  {
    String storageDirectory =
      Environment.getExternalStorageDirectory().toString();
    StatFs stat = new StatFs(storageDirectory);
    return stat.getAvailableBlocks() * stat.getBlockSize();
  }
  catch (Exception ex)
  {
    return -1;
  }
}

 このメソッドでは、StatFsクラスのgetAvailableBlocks()とgetBlockSize()メソッドを使ってSDカードの空容量(バイト数)を計算しようとしています。これらのメソッドの返り値はint型であるため、乗算はint型の幅で行われます。int型の最大値は2,147,483,647(およそ2GiB)です。従って、これより大きな値は負の値(あるいはラップアラウンドして意図しない正の値)になってしまい、アプリの利用を妨げる結果となりました。

 このコードを修正するには、前述のアプローチ2で紹介したアップキャストの手法を用い、long型の幅で演算するようにキャストすると良いでしょう。

return (long)stat.getAvailableBlocks() * stat.getBlockSize();

型変換にもご注意を

 ここまで、整数の算術演算に関する整数オーバーフローの問題について見てきました。もう一つ、整数に起因する大きな問題として、型変換があります。整数をより小さな型へ変換する場合や、浮動小数点数を整数に変換する場合など、変換前の値が変換後の型で表現できる範囲に収まっているかどうかをチェックする必要があります。今回は紹介しませんでしたが、「NUM12-J. 数値型の縮小変換時にデータの欠損や誤解釈を引き起こさない」に詳しく解説しています。そちらも併せてご覧ください。

参考文献

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
Javaセキュアコーディング入門連載記事一覧

もっと読む

この記事の著者

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

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

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング