Java セキュリティ(その1) 萩谷 昌己 (東京大学) with the help of 戸沢 晶彦 (東京大学)

Slides:



Advertisements
Similar presentations
アルゴリズムとプログラミン グ (Algorithms and Programming) 第6回:クラスとインスタンス クラスの宣言 アクセス修飾子 インスタンスの生成 (new キーワード) this キーワード フィールドとメソッドの実際の定義と使い 方 クラスの宣言 アクセス修飾子 インスタンスの生成.
Advertisements

オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
独習JAVA Chapter 6 6.6 クラスの修飾子 6.7 変数の修飾子 結城 隆. 6.6 クラスの修飾 abstract インスタンス化できないクラス。1つまたは複数のサブクラスで 実装してはじめてインスタンス化できる。 final 継承されたくないことを明示する。これ以上機能拡張 / 変更でき.
モバイルエージェントシステムの実装 エージェント移動(状態とコードの一括移送) エージェント移動の特徴 システム構成 エージェントプログラム
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
社会人学習講座 「Javaプログラミング概論」
Remote Method Invocation
Applet 岡部 祐典 鈴木 敬幸.
アルゴリズムとデータ構造 2010年7月5日
Javaのための暗黙的に型定義される構造体
コンポーネントの再利用に必要な情報 えムナウ (児玉宏之)
コンポーネントの再利用に必要な情報 えムナウ (児玉宏之)
Iアプリプログラミング その1  鳥居秀徳.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
アルゴリズムとプログラミング (Algorithms and Programming)
Java2セキュリティ, クラスローダー,ベリファイア
社会人学習講座 「Javaプログラミング概論」
インタフェース プログラミング 第14回 インタフェース プログラミング第14回.
Javaプログラムの実行まで バイト Javaの コード 実行 ソースコード Java ファイル名 ファイル名 abc.java
RMI ソフトウェア特論 第6回 /
第6回独習Javaゼミ 第6章 セクション4~6 発表者 直江 宗紀.
~手続き指向からオブジェクト指向へ[Ⅱ]~
実行時のメモリ構造(2) Javaスタック内動作他
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
プログラミング言語入門 手続き型言語としてのJava
アルゴリズムとプログラミング (Algorithms and Programming)
第9章 例外処理,パッケージ 9.1 例外処理 9.2 ガーベッジコレクション.
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
第7回独習Javaゼミ セクション 1~4 発表者 直江 宗紀.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
暗黙的に型付けされる構造体の Java言語への導入
オブジェクト指向 プログラミング 第二回 知能情報学部 新田直也.
第6回 2007年6月1日 応用Java (Java/XML).
アルゴリズムとデータ構造1 2006年7月4日
第11週:super/subクラス、継承性、メソッド再定義
Java Bytecode Modification and Applet Security
11 ソフトウェア工学 Software Engineering デザインパターン DESIGN PATTERNS.
Javaプログラムの変更を支援する 影響波及解析システム
10-1 SAXの概要 10-2 Saxプログラミングの基礎 10-3 saxのプログラム例
クラスファイルの構造解析(2) 2003年6月23日 海谷 治彦.
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
Javaバイトコード変換による 細粒度CPU資源管理 ~Progress Report for SWoPP2001~
7.4 intanceof 演算子 7.5~7.9パッケージ 2003/11/28 紺野憲一
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
パッケージ,アクセス修飾子 2008年4月27日 海谷 治彦.
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
pointcut に関して高い記述力を持つ アスペクト指向言語 Josh
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
Javaバーチャルマシンを利用した 動的依存関係解析手法の提案
JAVAバイトコードにおける データ依存解析手法の提案と実装
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第十二回 知能情報学部 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
同期処理のモジュール化を 可能にする アスペクト指向言語
C#プログラミング実習 第3回.
アルゴリズムとデータ構造1 2009年7月2日
計算機プログラミングI 第4回 2002年10月31日(木) 問題解決とアルゴリズム クラスメソッドと手続きの抽象化 最大公約数
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
Presentation transcript:

Java セキュリティ(その1) 萩谷 昌己 (東京大学) with the help of 戸沢 晶彦 (東京大学)

Java セキュリティの階層 バイトコード検証系 (bytecode verifier) → JDK1.2 ローダ制約 (loader constraint) の導入 クラスローダ (class loader) → JDK1.2 安全なクラスローダ (secure class loader) セキュリティ・マネージャ (security manager) → JDK1.2 アクセス・コントローラ (access controller) RMI セキュリティ拡張 (RMI security extension) JINI セキュリティ

Java アタックの歴史

Java セキュリティ・アーキテ クチャ JDK1.0 砂場モデル (sandbox model) リモート・コード ( 信頼できないコード ) は、 システム・リソースにアクセスできない ( 砂場の中でしか遊べない ) 。 JDK1.1 署名付きアプレット (signed applet) 信頼できる署名の付いたコードは、 ローカル・コードと同様に扱われる。 JDK1.2 保護ドメイン (protection domain) 保護ドメインを単位とした精密なアクセス制 御

保護ドメイン (protection domain) コードベース + 署名者名 – コードベース (codebase) … URL – 署名者名 (signer name) … 複数指定可 (and が取られる )

セキュリティ・ポリシー (security policy) どの保護ドメインに どのような許可 (permission) を与えるか。 ポリシー・ファイル (policy file) による簡潔な 記述 grant [SignedBy "signer_names"] [, CodeBase "URL"] { permission permission_class_name [ "target_name" ] [, "action"] [, SignedBy "signer_names"]; permission … };

アクセス制御 AccessController クラスの checkPermission メソッド その呼び出し方 : FilePermission perm = new FilePermission("path/file", "read"); AccessController.checkPermission(perm); 現在の実行コンテキストのもとで、 アクセスの許可を調べる。

アクセス制御 アルゴリズム : i = m; while (i > 0) { if ( caller i 's domain does not have the permission ) throw AccessControlException; else if ( caller i is marked as privileged ) return; i = i - 1; }; inheritedContext.checkPermission(permission); inheritedContext … 親スレッドのコンテキスト

特権 (previlege) 実行コンテキストに特権を与える。 class A implements PrivilegedAction { Object run() {... } } A a = new A(); Object o = AccessController.doPrivileged(a); 実行コンテキストに privileged のマークが付い て、 run メソッドが実行される。 run メソッドの実行中は、 doPrivileged の呼び手のところで、 アクセスのチェックが終了する。

アクセス制御コンテキスト コンテキストの取得 : AccessControlContext acc = AccessController.getContext(); コンテキストを指定した制御 : acc.checkPermission(permission); コンテキストを指定した特権の付与 : Object o = AccessController.doPrivileged(a, acc);

アルゴリズム (コンテキストの指定がある場 合) : i = m; while (i > 0) { if ( caller i 's domain does not have the permission ) throw AccessControlException; else if ( caller i is marked as privileged ) if ( a context was specified in the call to doPrivileged) context.checkPermission(permission); return; i = i - 1; }; inheritedContext.checkPermission(permission); アクセス制御

Permission クラス 抽象クラス abstract boolean implies(Permission permission) – a.implies(b) は、許可 a が許可 b を 包含することを意味する。 サブクラス : –AllPermission, BasicPermission, –FilePermission, SocketPermission, –UnresolvedPermission

FilePermission クラス new FilePermission("myfile", "read,write"); new FilePermission("/home/gong/", "read"); new FilePermission("/tmp/mytmp", "read,delete"); new FilePermission("/bin/*", "execute"); new FilePermission("*", “read”); new FilePermission("/-", "read,execute"); new FilePermission("-", "read,execute"); new FilePermission(" >", "read");

クラスローダ クラス・ファイルをロードするオブ ジェクト ClassLoader クラスのサブクラスの インスタンス クラスの名前空間を作る働きも担って いる。

クラス解消アルゴリズム (class resolution algorithm) --- SecureClassLoader の場合 クラスが既にロードされていないかチェック。 現在のクラスローダに委譲関係の親があれば、 親にクラスのロードを委譲。 –SecureClassLoader は親を指定して作成でき る。 – 親が指定されていない場合は、 primordial class loader に委譲する。 親が解消できなければ findClass を呼び出 す。

public class RT { public static void main(String arg[]) { RR rr = new RR(); R r = rr.getR(); r.speakUp(); } public class RR { public R getR() { return new R(); } } public class R { public void Icantspeak() {... } } public class R { public void speakUp() {... } } Saraswat のバグ RT のローダは R をロード。 RT のローダは RR のロードを システム・ローダに委譲。 システム・ローダは R をロード。

class B extends A {... } class C extends A {... } public class D { static boolean t = true; public D() { A a; if (t) a = new B(); else a = new C(); a.speakUp(); } Tozawa のバグ(その1) バイトコード検証系は、 B と C のスーパークラス(の名前)を A と計算するが、 A をロードしない。 名前だけで A と A を等しいとみなす。

Package java.lang; public class A { pulic java.lang.C foo(java.lang.B x) { return x; } public class D { public D() { java.lang.B b = new java.lang.B(); java.lang.C c = (new java.lang.A()).foo(b); } Tozawa のバグ(その2) Java2 のバイトコード検証系は、 システム・クラスを検証しない。

バイトコード検証 バイトコードに対する型推論 データフロー解析の一種 JVM のバイトコードには、 バイトコード検証が可能なように、 型の情報が含まれている。 –aload –iload –dload

バイトコード検証の問題点 サブルーチン – 帰り番地が変数に格納される。 – 必ずしも直接の呼び手に帰らない。 – サブルーチンによって変数の使い方が異なる。(多 相性) オブジェクトの初期化 – 初期化されていないオブジェクトの参照を 禁止しなければならない。 – ソース・コードでは保証されているが、 バイトコードでは、バイトコード検証系が 保証しなければならない。

loading constraint scheme との関連 – 必ずしも loading constraint scheme との 連携がうまくいっていない。 システム・クラスや署名付きクラスの 検証 – システム・クラスや署名付きクラスは、 その正しさが保証されているので、 バイトコード検証を省略したい。しかし、 安易に省略すると、問題が生じる。 バイトコード検証の問題点

バイトコード検証の定式化 型システムによる定式化 – バイトコードに対する型体系 – 各命令に対する型規則 – バイトコード検証を型推論として定式化す る。 – 型安全性 型推論が成功すれば実行時の型エラーは 起こらない。