kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

MS08-078の問題点

MS08-078 and the SDL - The Security Development Lifecycle - Site Home - MSDN Blogs
SDL Team blogでMS08-078の問題を引き起こした原因が説明されています。データバインドを使うと、バインディングオブジェクトの配列ができます。これがArrayOfObjectsFromIE(実際のコードでは違う変数名)。ここではMaxIdxの値が2になるとします。

    int MaxIdx = ArrayOfObjectsFromIE.Size()-1;

    for (int i=0; i <= MaxIdx; i++) {
         if (!ArrayOfObjectsFromIE[i])
               continue;
          ArrayOfObjectsFromIE[i]->TransferFromSource();
          ...
    }

これは一見まったく問題のなさそうなコード。だけど、最初の転送処理(訳注:TransferFromSource()のこと?)で配列のサイズを更新してしまうため、解放された後もまたここを通るとMaxIdxの値が2のままになってしまう。よって、不正なメモリ参照が可能になってしまう…ということなんでしょうか。
blogの中ではtime-of-check-time-of-use (TOCTOU)バグであると書かれています。バグの解説はCWE-367で。クリティカルな資源だったら、最初にチェックしてその値を使いまわすんじゃないということですね。コード実行中にその変数が間接的に指し示す資源が書き換えられても、気付かないから。
いい加減な訳かもしれないので、原文を読んでください。イメージはわかると思います。