DLR AST (0)

荒井さんの blog を読んでいると,行かないつもりだった TechEd 2007 Yokohama に行きたくなってくる今日この頃.

Orcas を入れなくても .NET AST で遊べるのはおもしろいですね.テスト用の AST の作成ですが,私は F# を利用したものをちょこちょこ作っています.公開はもうちょっと先になりそうですが.
以下はそのプロトタイプとして作った C# 版のテストコードです.Microsoft.Scripting.dll を参照に加えてください.

using System;
using Microsoft.Scripting;
using Microsoft.Scripting.Ast;
using System.Reflection.Emit;

namespace ASTTest
{
    delegate T Func<T>();
    static class Program
    {
        static void Main(string[] args)
        {
            CodeBlock cb = Ast.CodeBlock("MyFunc", typeof(int));

            cb.Body =
                Ast.Return(
                    Ast.Condition(
                        Ast.True(),
                        Ast.Constant(1),
                        Ast.Constant(2)
                    )
                );

            Func<int> func = TreeCompiler.CompileBlock<Func<int>>(cb);

            Console.WriteLine("act() => {0}", func());
        }
    }
}

評価しているのは以下のような AST です.

  • If
    • True
    • 1
    • 2

この AST が Lightweight Code Gen (LCG) を経由して動的メソッドに展開されています.通常,LCG では IL 出力を自分で書かなくてはなりませんが,その部分は DLR の AST.Emit メソッドが代わりにやってくれています.

更新履歴

D3DX とセキュリティアップデート

Microsoft DirectXに、任意のコマンド実行が可能になる脆弱性が報告され、7月19日、セキュリティ各社がアドバイザリーを公開した。最新バージョンでは問題は修正済みだという。

Secuniaのアドバイザリーによると、脆弱性は、RLE(Run Length Encoding)で圧縮されたTarga(TGA)形式の画像ファイルを処理する際の入力認証エラーに起因する。悪用されると、細工を施したTarga画像を使ってヒープベースのバッファオーバーフローを誘発し、システムを制御される恐れがある。

同社の深刻度評価は5段階で上から2番目の「Highly critical」となっている。

影響を受けるのはMicrosoft DirectX 7.x/8.x/9.xとMicrosoft DirectX SDK

なお、iDefenseによると、Microsoftは2006年10月のSDKとEnd-User Runtimeリリースでこの問題に対処済み。2007年6月のリリースにはこの脆弱性が存在しないことが確認したという。

おそらく D3DX に問題があるのだと思うのですが,問題のある d3dx9_XX.dll の範囲と更新状況については 1 分ほど調べた範囲内ではよく分かりませんでした.時間がとれたらちゃんと調べてみます.
問題は,悪意のあるファイルをどうやって D3DX の関数に読み込ませるかですが,例えば DirectX SDK に同梱されるサムネイル表示シェル拡張も影響を受けるので,さしあたってはそれが一番影響が大きそうでしょうか.まあ最近の SDK を入れている人は大丈夫と.後は人気ゲームの mod なんかもピンポイントに狙われると危ないかもしれません.Joost の用に DirectX をゲーム以外に利用しているケースも注意が必要ですかね.
あと何より,静的リンク時代の D3DX も今回の影響を受けそうな気がしますが,さてどうやって対策したものかという感じですなぁ.