32
POPL ミミミミミミ 5/11 ミミミミミミミミミミミ ミミミミミミミミミミ ミミミ M2 ミミ ミミ <[email protected] >

POPL ミーティング 5/11 型付きアセンブリ言語の 一般化実装に関する展望

Embed Size (px)

DESCRIPTION

POPL ミーティング 5/11 型付きアセンブリ言語の 一般化実装に関する展望. 米澤研 M2 吉野 寿宏 < [email protected] >. 本日の Agenda. 型付きアセンブリ言語 背景 概要・関連技術 TALx86 概要 TAL の一般化実装の可能性について 着想・要件 関連技術. 型付きアセンブリ言語. 背景. ネットワーク越しのコード配布の隆盛 アプリケーションから、 OS のパッチやドライバまで 同時に不正なコードの脅威も蔓延 どうしたら、コードを信用できる / 信用してもらえるか? - PowerPoint PPT Presentation

Citation preview

Page 1: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

POPL ミーティング 5/11

型付きアセンブリ言語の一般化実装に関する展望

米澤研 M2 吉野 寿宏<[email protected]>

Page 2: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

本日の Agenda

型付きアセンブリ言語 背景 概要・関連技術

TALx86 概要

TAL の一般化実装の可能性について 着想・要件 関連技術

Page 3: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

型付きアセンブリ言語型付きアセンブリ言語

Page 4: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

背景 ネットワーク越しのコード配布の隆盛

アプリケーションから、 OS のパッチやドライバまで 同時に不正なコードの脅威も蔓延

どうしたら、コードを信用できる / 信用してもらえるか? ユーザとしては、実行しなければよいのだが、不便 ソフトウェア作成者としては、信用してもらうことで

ユーザの獲得につながる 全てのソフトウェアを自作することは現実的でない

Page 5: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

関連技術 :

電子署名 コードの出自を保証 悪意のあるコードを

含まないことは保証できない コードの正統性・

同一性を保証するが 中身を保証する技術で

はない

ハッシュ値 h 公開鍵暗号化

コード

{h}Kpri

ハッシュ値 h

H(M)

D(Kpub, {h}){h}Kpri

ハッシュ値 h’

h = h’ ?

Page 6: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

関連技術 :

Proof-Carrying Code[1]

コードが安全である数学的証明を添付 受け取った側は、ツール

で安全性を検証 検証に通ったコードは数

学的に信用できる 数学的理論に基づいた、

中身の検証が可能

[1] G. Necula. Proof-Carrying Code. In POPL97

コード

安全証明

安全証明

このコードは安全です

安全ポリシー

安全ポリシー

Page 7: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

関連技術 :

Java VM バイトコード検証機構

バイトコードの型検査 そもそも型安全になるような設計 メソッドの型情報などをオブジェクトファイルに格納

コンパイル時の静的型が正しくない場合に有効 ライブラリのバージョンを途中で変えたり、一部のフ

ァイルを再コンパイルしたり

しかし、 Java であるがゆえに デバイスドライバ等、基幹部分への応用は難しい Java 以外の言語からのコンパイルは想定されない

Page 8: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

型付きアセンブリ言語 (TAL)[2]

実マシンのアセンブリ言語に型を導入 Java VM のバイトコード検証にヒント レジスタの型・メモリの中身の型などを静的

に検証

型システムの完全性・健全性を証明することで、検証の妥当性をも含めて保証

[2] G. Morrisett, et al. From System F to Typed Assembly Language. In 1998 ACM SIGPLAN-SIGACT Symposium on Principles of Programming Language.

[3] G. Morrisett, et al. TALx86: A Realistic Typed Assembly Language. 1999 ACM SIGPLAN Workshop on Compiler Support for System Software.

Page 9: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

TAL の定式化 TAL の文法定義

基本は、 RISC マシンによくある命令セット 3 operands 命令

ヒープの操作 malloc 解放は GC

pack/unpack 操作

操作的意味論の定義 ほぼ直感的

型の導入

Page 10: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

デバイスドライバ デバイスドライバの安全性

WindowsXP: 署名がない場合に警告を表示 オオカミ少年的状況になっているのでは?

署名されていないドライバが数多い 私が知る限り、ちゃんと署名されていたドライバっ

てあまり見た記憶がない… 署名されていないからといって、ハードウェア

用ドライバのインストールを中断するか?

安全性を数学的に検証することによって、動機付けを強くする

Page 11: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

BREW 携帯分野への応用

個人情報を取り扱う端末 = 頑健でなくてはならない BREW アプリの登場

低レベルなコード (C++ などで記述 ) を実行させる技術 現在では認証を通った公式コンテンツプロバイダのみが

使用可能

TAL 検証系を利用すれば、サードパーティーのコード安全性を検証可 認証を受けなくても BREW 使用可能に 開発者側の幅が広がるのでは

Page 12: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

TALx86TALx86

Page 13: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

TALx86 Morrisett らは、 Intel x86 向けの処理系を

公開 OCaml で記述されており、ツール群全体で

約 7 万行 (!) ( コンパイル全然通らないんですけど… )

実装に関する論文[3]

実装したツール群に関する紹介的な意味合い? 詳しいところはあまりない (

[4]

が少し詳しい )

[3] G. Morrisett, et al. TALx86: A Realistic Typed Assembly Language. 1999 ACM SIGPLAN Workshop on Compiler Support for System Software.

[4] http://www.cs.washington.edu/homes/djg/slides/talx86_wcsss_talk.pdf

Page 14: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

TALx86 アセンブリ言語ツール

talc 型検査ツール アセンブラ 機械語への変換 Link-verifier リンケージの安全性を検査

PopcornC 言語のサブセットから TAL へのコンパイラ

SchemePopcorn で書かれた scheme インタプリタ

Page 15: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

TAL による検証の流れ アセンブリコードに

annotation を挿入 基本ブロックの入り口に

記述 レジスタの型・スタックの

型 各 annotation について

型を検証 各命令の操作的意味論 ブロックに流入するところ

で入り口条件を満足するか

mov eax,ecx ; i = n inc eax ; ++i mov ebx,0 ; s = 0 jmp testbody: {eax: B4, ebx: B4} add ebx,eax ; s += itest: {eax: B4, ebx: B4} dec eax ; --i; cmp eax,0 ; i > 0 jg body

EAX は 4-byte integer を持つ

EBX は 4-byte integer を持つ

Page 16: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

TAL による検証の流れ外部ライブラ

TALソースコー

movaddjmp…

movaddjmp…

TAL インターフェイス

val f: int -> int …

val f: int -> int …

010001011101010 0010

010001011101010 0010実行可能

コード

外部ライブラリ

インターフェイス

検証エンジン

アセンブラ・リンカ

検証結果

talc

Page 17: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

TAL TAL の一般化実装のの一般化実装の可能性について可能性について

Page 18: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

CPU は一種類ではない プロセッサはいろいろな種類

x86, PowerPC, SPARC, ARM, SuperH, … PC 用としては x86 ( 互換 ) が多いが 携帯デバイスだと ARM や SH が多い

各 CPU ごとに処理系を作成する必要 CPU が違えば命令セットも異なる

Page 19: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

別のアーキテクチャに対応させる 最初から作るのは面倒であるし 現在ある TAL の実装を他のプロセッサ向け

に書き換えると しかし、 TALx86 は ( コードをざっと見た感じ ) 実装のかなり中枢において x86 に依存している マシン状態、浮動小数点レジスタのスタック ( とい

うかリング ) 構造 命令セットを variant で列挙してるし (!) など

どこまで作り直す必要があるか?

Page 20: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

コンパイルの流れ

高級言語 中間言語

movadd

jmp…

アセンブリ

01001011011101010101100101…機械語

Page 21: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

コンパイルの流れ(複数アーキテクチャ )

高級言語

中間言語

movadd

jmp…

アセンブリ

01001011011101010101100101…機械語

中間言語

movadd

jmp…

アセンブリ

01001011011101010101100101…機械語

中間言語

movadd

jmp…

アセンブリ

01001011011101010101100101…機械語

x86

Alpha

PPC

機種ごとの機種ごとのTAL TAL 処理系処理系

Page 22: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

着想 アーキテクチャが変わっても、 CPU の構成

自体はあまり変わらない レジスタがいくつかあり、メモリ ( スタック・ヒープ

・グローバル変数 ) があって

その間で計算を行ったり、関数を呼び出したりする

→ これらの共通項を、理論として定式化できないだろうか?

Page 23: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

着想 実装をいくつかの部分に分離して行う

CPU の命令セットの操作的意味論 ここは CPU ごとに独立する必要

基本操作の定義 記述を簡単にするためのライブラリ的なもの

型検証エンジン レジスタの型・メモリの構造などを保持、検証を

行う中核部分

マイクロカーネルからの類推

Page 24: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

共通項の抽出

抽象ハードウェア

(μOP 的なレイヤ )

x86固有情報

SPARC固有情報

Alpha固有情報

←この層に型を  導入できるか?

←この記述を簡潔  にできるように  するには?

Page 25: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

関連研究 :

Foundational TAL TAL の検証系自体が正しいことはどう証明?

TALx86 の妥当性はインフォーマルにしか与えられていない

実装が正しいことをユーザは信用する必要 TCB (Trusted Computing Base) を小さく

することが重要 実装を 2 つの段階に分けることを提案

まず一般的な型付きアセンブリ言語を開発し 実際のアーキテクチャからその言語へマッピング

Page 26: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

関連研究 :

Foundational TAL TALT (TAL Two)

抽象機械 レジスタ N 個 (任意 ) 即値、レジスタ、メモリへの参照をオペランド

とする RISC 系命令セット レジスタ間接やメモリ間接などのアドレッシングモードを記述できる

算術演算と mov, cmp, 分岐命令 , malloc を持つ Twelf (logical framework) で構築された LF の上に構築 Foundational PCC と同様

Page 27: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

コンパイルの流れ ( 再掲 )

高級言語 中間言語

movadd

jmp…

アセンブリ

01001011011101010101100101…機械語

このへんをターゲットにした型検証

Page 28: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

CPU 非依存な型システム Modular な型の処理・検証

CPU の実体とできるだけ癒着しないように CPU 依存の部分を分離して記述するように あるいは、コードジェネレータを作成する (yacc みた

いに ) もちろん拡張性も必要

既存のアセンブラに組み込めるとよい わざわざアセンブラから自作する必要はありや、なしや たとえば GNU as などに組み込めたら、利用しやすい? 擬似命令はマクロなどで処理

Page 29: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

型安全な中間言語を定義する 実機の機械語とほぼ一対一対応する言語

簡単なトランスレータで各アーキテクチャに対応

型の処理系は一つで済む 高級言語からのコンパイラが、その分必要に

なるが…

近いものとして、 RTL (gcc の内部表現 ) 現在詳細調査中

Page 30: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

命令の分類

ARM

x86

SPARC

算術命令、論理演算など

   固有命令(特権命令など )

Page 31: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

命令の分類

ARM

x86

SPARC

型検証カーネル

高級言語

x86 用定義・ライブラリによる拡張

余白はできてしまうだろう

Page 32: POPL ミーティング  5/11 型付きアセンブリ言語の 一般化実装に関する展望

静的型付けだけでうまくいかない部分 加減算は、数値にもアドレスにも用いるこ

とができる どちらとして用いている?

アドレス + 数値、数値 + 数値 アドレス同士でオフセット計算もできそう

逆に、アドレス演算器で計算させるなんて芸当も lea eax, [eax+eax*4] ; eax = eax * 5

レジスタオフセット レジスタの値が静的に定まらない場合が難しい