libstagefright

読み:リブ・ステージフライト
外語:libstagefright 英語
品詞:固有名詞

Androidのmediaplayerが用いている、メディア用ライブラリーの一つ。

目次

Andorid 2.2(Froyo)頃から導入された、Android用のメディアサービスである。

音楽と動画で用いられ、再生でも、録音・録画でも使われる。

複雑なシステムの一部を構成するほか、数多くのCODECに対応している影響からか不具合も多く、度々致命的なバグを出している。

由来

libstagefrightのコード自体はEclair時代からあったとされるが、正式に導入されたのはFroyoからともGingerbreadからとも言われている。

当初はFFmpegの採用も視野にあったが、GPLなうえ、ライセンス違反ソフトの晒し上げなどという悪趣味な行為を働く代物だったため不採用となり、OpenCoreが採用された。そしてFroyoからはStagefrightになった。

ANDROID-20139950,20923261

バグ

2015(平成27)年夏、libstagefrightのバグが世界を震撼させた。

ANDROID bug 2件に計6件のCVEを含むバグは、JVNがJVNVU#92141772「Android Stagefright に複数の脆弱性」として報告している。

  • ANDROID-20139950
    • CVE-2015-1538 Integer overflows during MP4 atom processing
    • CVE-2015-1539 An integer underflow in ESDS processing
  • ANDROID-20923261
    • CVE-2015-3824 Integer overflow in libstagefright when parsing the MPEG4 tx3g atom
    • CVE-2015-3826 Unbounded buffer read in libstagefright while parsing 3GPP metadata allows reading arbitrary memory
    • CVE-2015-3827 Integer underflow in libstagefright when processing MPEG4 covr atoms
    • CVE-2015-3828 Integer underflow in libstagefright if size is below 6 while processing 3GPP metadata
    • CVE-2015-3829 Integer overflow in libstagefright processing MPEG4 covr atoms when chunk_data_size is SIZE_MAX

一つを除き、いずれも単純な範囲チェック漏れである。しかし、一つだけは想定を超えるものであった。

問題点の問題

ANDROID-20139950のうち、CVE-2015-1538に対応する不具合である。

3ヶ所の修正があるが、次は、そのうちの1番目である。

     mTimeToSampleCount = U32_AT(&header[4]);
-    uint64_t allocSize = mTimeToSampleCount * 2 * sizeof(uint32_t);
+    uint64_t allocSize = mTimeToSampleCount * 2 * (uint64_t)sizeof(uint32_t);
     if (allocSize > SIZE_MAX) {
         return ERROR_OUT_OF_RANGE;
     }

32ビットARM環境では、mTimeToSampleCountも、sizeofの返却値であるsize_t型も共に32ビットである。32ビット同士の積は32ビットを超えることもあるため、この式は「32ビット同士の積を64ビット変数に代入」が仮定され、uint64_t型で結果を得るようになっていた。

ところが、実際には、この式では意図した結果が得られなかった。C/C++においては、「32ビット同士」の積の解は「32ビット」で得られ、オーバーフロー分は切り捨てられる。その後に64ビットに拡張されるため得られる結果は誤ったものとなり、実際より小さな値が格納されることからその次のif文も成立せず、結果としてオーバーフローチェックをすり抜けてしまっていた。

結果を期待通り64ビット長で得るためには式中に一つ以上64ビット長が必要となるため、修正においては、sizeofの返却値をuint64_tでキャストして64ビット長としている。

用語の所属
Android

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club