【かたこんごう】

型混同(Type Confusion) とは?

公開:
💡 鍵のつもりで渡したのが、実はナイフだった
📌 このページのポイント
型混同(Type Confusion)のしくみ 型A 整数 (int) フィールド 1 ポインタ (ptr) フィールド 2 型B ポインタ (ptr) フィールド 1 整数 (int) フィールド 2 同じメモリを... 整数値がポインタとして解釈される!
型によってメモリのフィールド配置が異なるため、取り違えると意図しない値を参照してしまう
ひよこ ひよこ
型混同って何の話なの?
ペンギン先生 ペンギン先生
オブジェクトを間違った型として扱ってしまうバグだよ。型が違うとメモリ上のフィールド配置も違うから、別の型として解釈すると意図しないアドレスを読み書きしてしまうんだ。
ひよこ ひよこ
もう少し具体的に教えてほしいな。
ペンギン先生 ペンギン先生
たとえば型Aのオブジェクトが「整数、ポインタ」の順でフィールドを持つとするね。それを「ポインタ、整数」の順の型Bとして解釈すると、整数値がポインタとして読み取られてしまうんだよ。攻撃者はその整数値を細工することで、任意のメモリアドレスを指させられるんだ。
ひよこ ひよこ
ブラウザでよく見つかるって聞いたけど、なんでなの?
ペンギン先生 ペンギン先生
JavaScriptJITコンパイラ型推論で最適化するために、型チェックを一部省略することがあるんだよ。その省略箇所で型が変化すると型混同が起きてしまう。ChromeのV8やFirefoxのSpiderMonkeyでも多数報告されてきたね。
ひよこ ひよこ
実際にどんな被害が出るの?
ペンギン先生 ペンギン先生
攻撃者が整数として送り込んだ値がポインタとして解釈されるから、任意のメモリを読み書きできるようになるんだ。そこからサンドボックス脱出や任意コード実行(RCE)に繋がることも多くて、深刻度がとても高い脆弱性なんだよ。
ひよこ ひよこ
防ぐ方法はあるの?
ペンギン先生 ペンギン先生
ランタイムの型チェック強化、型安全な言語の採用、それとJIT hardeningといって型推論を保守的にして省略を減らす手法が主な対策だよ。根本的にはキャストのたびに型を検証する設計が大切だね。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「型混同」って出てきたら「違う型として解釈させてメモリを誤操作する脆弱性」と思えればだいたいOK!
📖 おまけ:英語の意味
「Type Confusion」 = 型の混同
💬 type(データの型)+confusion(混同・混乱)で、プログラムが型を取り違えて動作してしまう状態を表しているんだよ。
← 用語集にもどる