Java2セキュリティ, クラスローダー,ベリファイア

Slides:



Advertisements
Similar presentations
オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
Advertisements

1 Reference, 配列,アクセスフラ グ, jdb での観察, アセンブラ上での編集 2002 年 6 月 6 日 海谷 治彦.
Java セキュリティ(その1) 萩谷 昌己 (東京大学) with the help of 戸沢 晶彦 (東京大学)
Web アプリをユーザー毎に カスタマイズ可能にする AOP フレームワーク
モバイルエージェントシステムの実装 エージェント移動(状態とコードの一括移送) エージェント移動の特徴 システム構成 エージェントプログラム
社会人学習講座 「Javaプログラミング概論」
受動的攻撃について Eiji James Yoshida penetration technique research site
Java I 第2回 (4/18)
クラスファイルの構造解析(1) 2002年6月16日 2003年6月8日 改訂 海谷 治彦.
~手続き指向からオブジェクト指向へ(Ⅰ)~
プログラミング基礎I(再) 山元進.
アプレット (Applet)について.
実行時のメモリ構造(1) Jasminの基礎とフレーム内動作
Javaのインタフェース についての補足 2006年5月17日 海谷 治彦.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
例外,並行・同期処理,ゴミ集め 2002年7月7日 海谷 治彦.
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
RMI ソフトウェア特論 第6回 /
Flyingware : バイトコード変換による 安全なエージェントの実行
進捗 Javaバイトコード変換による 細粒度CPU資源管理
コンパイラの解析 (2) GCJのデータ構造 - 1.
型付きアセンブリ言語を用いた安全なカーネル拡張
~手続き指向からオブジェクト指向へ[Ⅱ]~
実行時のメモリ構造(2) Javaスタック内動作他
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
プログラミング言語入門 手続き型言語としてのJava
リファレンスの復習と例外処理 2005年6月14日 海谷 治彦.
暗黙的に型付けされる構造体の Java言語への導入
プログラミング言語入門.
Integer Java Virtual Machine
Java Bytecode Modification and Applet Security
ユーザ毎にカスタマイズ可能な Webアプリケーションの 効率の良い実装方法
プログラミング演習I 2003年6月25日(第10回) 木村巌.
クラスファイルの構造解析(2) 2003年6月23日 海谷 治彦.
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
モバイルコード技術と セキュリティポリシィ (1)
Javaバイトコード変換による 細粒度CPU資源管理 ~Progress Report for SWoPP2001~
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
Javaバイトコードの 動的依存解析情報を用いた スライシングシステムの実現
パッケージ,アクセス修飾子 2008年4月27日 海谷 治彦.
バイトコードを単位とするJavaスライスシステムの試作
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
new Calc(7,3).divInt()実行前
Java における 先進的リフレクション技術
計算機プログラミングI 第5回 配列 文字列(Stringクラス) mainの引数 配列の利用例
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
Javaバーチャルマシンを利用した 動的依存関係解析手法の提案
JAVAバイトコードにおける データ依存解析手法の提案と実装
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
Josh : バイトコードレベルでのJava用 Aspect Weaver
プログラムが実行されるまで 2002年4月14日 海谷 治彦.
アルゴリズムとデータ構造1 2009年6月15日
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
さまざまなプログラミング言語, オンライン開発環境
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
モジュール分割.
アルゴリズムとデータ構造 2010年6月17日
ソフトウェア工学 知能情報学部 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
プログラミング演習I 2003年6月11日(第9回) 木村巌.
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Josh : バイトコードレベルでのJava用 Aspect Weaver
Presentation transcript:

Java2セキュリティ, クラスローダー,ベリファイア 2002年7月14日 2003年7月7日改定 海谷 治彦

目次 モバイルコード技術について Java2セキュリティの概要 クラスローダーの役割 オンデマンドなロード再び バイトコード検証系 (バイトコードベリファイア)

モバイル・コード技術 ホームページ(データ)と同様に, プログラムがダウンロードされる. そのプログラムが自分のパソコンで 実行される. 命令 プログラム 計算機 ネットワーク サーバー 実行

モバイルコードの例: Applet

モバイルコードの利点 ネットワーク上のデータの交通量の削減 レスポンスの向上 一々,ソフトをインストールしないでも,他人の作ったソフトを利用できる. 命令 計算機 ネットワーク プログラム サーバー 実行

モバイルコードの欠点 他人のプログラムに悪意があった場合, 自分のデータが破壊されるかも? 自分のデータが盗まれるかも? 自分のパソコンが勝手に悪戯するかも? 計算機 ネットワーク

コードを送り込むvsデータを送り込む コード(プログラム)を送り込む場合, データを送り込む場合, 通信量が少なくて済む 送り込まれたマシンは事実上,コードに支配される. 処理は送り込まれたマシンで行われる. データを送り込む場合, 通信量は多い場合が多い 支配は送り込まれたマシンにある. 処理は送り込む側.

データを送り込む: 悪戯FAX

悪戯FAXでの通信 データ 処理

効果的?な悪戯FAXもどき /Times-Roman findfont 100 scalefont setfont {100 100 moveto (afo) show showpage} loop 100バイト以下 ページ記述言語ポストスクリプトによるプリンタ攻撃. 要は「afo」の文字をプリンタに出しつづける. もし,PSプリンタが外部ネットワークに直結されていた場合,このコードに攻撃される可能性あり. 試したわけじゃぁないから,上手くいかないかも(笑)

PS悪戯での通信と処理 処理 プログラム プログラム ネットワーク(インターネット)

モバイルコード利用の留意点 他所からダウンロードしたコードに,ある程度の制限をつけないと危ない. ダウンロードしたコードの実行は,コード製作者に自分のPCを勝手にいじらせるのと本質的には同じ. マイコンといえど,ネットワークに接続され,外部からコードをロードする例が少なくなくなった.

Javaとネットワーク指向 モバイルコード: ネットワーク越しにクラスを飛ばせる. シリアライズ: ネットワーク越しに飛ばせるインスタンスもある. インスタンス コード ネットワーク コード インスタンス

Javaセキュリティの方針 JVMにロードされたコードの, 例 ロード元 著名(サイン)の有無 によって,コードの実行に制限を加える. 「www.cs.shinshu-u.ac.jp から落としたコードは信用して,なんでも実行させる.」 「www.computer.org から落としたコードはファイル参照のみ許可する.」

Java2 砂箱モデル

Class Domain Permissions Permission: ファイルを読んで良い,JVMを停止して良いなどの許可. Domain: クラスの集まり policy: domainとpermissionの対応を書いたもの デフォルトポリシィは $JRE/jre/lib/security/java.policy にあり

Policy記述の例 ココから拾ってきて,かつ,コイツがサインしたクラスは, grant codeBase "http://java.sun.com/*", signedBy "Li" { permission java.io.FilePermission "/tmp/*", "read"; permission java.io.SocketPermission "*", "connect"; }; /tmp/の下は読んでよし. ネットワークソケットは自由に接続可. それ以外はダメ.

Code-centric VS Use-centric ここまでの話は,「どのコードを実行したか?」という観点から,アクセス制限の議論をした. Code-centric と呼ばれている見方. 加えて,「誰がコードを実行したか?」という観点から,アクセス制限を議論する場合もある. これを,User-centric という. Javaセキュリティは後者のUser-centricもサポートしている. Java Authentication and Authorization Service (JAAS)

User-Centricの必要性 コードではなく,ユーザーが移動する場合の考慮. JVMをマルチユーザーOSのように使うことができる. 公共端末(ネットカフェ?)でプログラムを実行する等. JVMをマルチユーザーOSのように使うことができる. 従来は,「誰が動かしているの?」という情報を利用しずらかった. 詳細は,ページからリンクされた情報参照.

オンデマンドロード&動的リンク クラスは実際に使われる直前までJVMに読み込まれない. よって,プログラムの一部(クラス)を付けたしながら実行できる – 増殖! 極端な話,プログラム自身が自分の一部を生成しながら実行を進められる – 自己増殖!

普通の増殖 (ロード) class C{ .... new D().... } class A{ static ... main(...){ .... new B().... } class B{ .... new C().... } class D{ .... new E().... } JVM JVM JVM JVM JVM A A A A A D D B B B B メソッドエリア C C C E ヒープ D E C B C D C E B B D B D C C C

自己増殖の例 クラス名 bar として 文字列 bar をキーに class foo{ .... void wclass(String bar){ // クラスデータをファイル // に書き込む } void lclass(String bar){ // データをクラスとして // 読み込む ...... クラス名 bar として クラス ファイル データ 文字列 bar をキーに

自己増殖に使える技術 インタフェースの実装 リフレクション(自己反映計算) Runnable などよく知られたインタフェースが実装されていれば,正体不明のクラスのインスタンスにも,メソッドを適用できる. リフレクション(自己反映計算) 後述

Javaとインタフェース 計算機 ネットワーク 内容 正体不明の インスタンス インタフェース 正体不明のインスタンスも実装しているインタフェースが 公開されていれば,アクセス可能となる.

Reflection もともと存在しないクラスは,言語要素として呼び出すことはできない. 例: aclass.amethod() など. しかし,Javaでは,文字列を使って,クラスやメソッドを操作できる. 例: c=loadclass(“aclass”); c.getMethod(“amethod”).invoke(); これによって未知のクラス,メソッドの操作が可能となる.

6つの例題 配列データをプログラムに組み込む 標準入力から読んだデータをプログラムに組み込む. ネットワークからダウンロードしたデータをプログラムに組み込む. それぞれ,インタフェースとリフレクションを使った例を提示.

配列を使った場合 メソッドエリア クラスローダー 最初の ロード クラス 配列に埋まって いたクラス ロード インスタンス インスタンス ヒープ インスタンス (実はクラスローダでもある)

標準入力を使った場合 メソッドエリア クラスローダー 最初の ロード クラス stdinから 読んだクラス ロード インスタンス 標準入力装置 (stdin) ヒープ インスタンス (実はクラスローダでもある) データ

ネットワークを使った場合 メソッドエリア クラスローダー 最初の ロード クラス ネットから 読んだクラス ロード インスタンス インターネット ヒープ インスタンス (実はクラスローダでもある) データ

検証・ベリファイ・Verify Verifyとは「正しいことを確かめる」こと. ソフトウェアの世界では,検証と訳される. プログラム(クラスファイル等)が正しいとは,なんなのか?それをどうやって確かめるのかを以下で議論する.

クラスファイルベリファイア クラスファイルが Java Class File Format に準拠しているかどうかをチェック クラスファイル内の一貫性のチェック たとえば,存在しないCP参照が無いことを確認. 他のクラスファイルとの一貫性 バイトコード検証 教科書 p.122~124

正しいバイトコードとは? 実行時に,オペランドスタックのオーバー/アンダーフローを起こしたりしない. スタックの値の出し入れの際に型の不一致が起こっていない. 例: 以下の命令列は明らかに型が不一致. iconst_0 astore_1

バイトコード検証系 インストラクションコード列のすべての分岐を調べ,どのような条件分岐のパスでプログラムが実行されたとしても,決して致命的なエラーを引き起こさないことを検証するシステム. (教科書 p.118より) Javaは,この検証を実行前(ロード時)に行っている.

前述のことができるのか?! 分岐の組み合わせなど,無数にあり,それを実行前に事前にチェックするなど,到底無理っぽい. JVMでは,以下の2つのポイントでこれを乗り切っている. 値ではなく,型の一致をチェックしている. 型の組み合わせが無数にあるようなプログラムの実行を許していない.(文法的に正しくても)

型の一致とは?1/2 例題のプログラム .limit stack 2 .limit locals 3 iconst_0 istore_1 goto Label2 Label1: iload_1 iload_2 iadd iinc 2 1 Label2: iconst_3 if_icmplt Label1 return int s=0; for(int i=0; i<4; i++) s+=i;

型の一致とは? 2/2 local=[, 0, 0] stack=[ , ] Label1: iload_1 iload_2 iadd istore_1 iinc 2 1 local=[, 0, 1] stack=[ , ] Label2: iconst_3 local=[, 0, 1] stack=[1, 3] if_icmplt Label1 local=[, 0, 1] stack=[ , ] Label1: iload_1 iload_2 iadd istore_1 iinc 2 1 local=[, 1, 2] stack=[ , ] Label2: iconst_3 local=[, 1, 2] stack=[2, 3] if_icmplt Label1 local=[, 1, 2] stack=[ , ] Label1: iload_1 iload_2 iadd istore_1 iinc 2 1 local=[, 3, 3] stack=[ , ] Label2: iconst_3 local=[, 3, 3] stack=[3, 3] if_icmplt Label1 return iconst_0 istore_1 istore_2 goto Label2 local=[, 0, 0] stack=[ , ] Label2: iload_2 iconst_3 local=[, 0, 0] stack=[0, 3] if_icmplt Label1 Label1, Label2 それそれの直前のスタック,ローカルの値は違えども,つんである値の型は一致している.(この場合,Iのみだけど) こういった場合のことを型の一致と呼ぶ.

型の組み合わせが通る毎に異なる例 iconst_3 istore_1 Label1: aconst_null iinc 1 -1 local=[this, ] stack=[3, , , ] istore_1 local=[this, 3] stack=[, , , ] aconst_null local=[this, 3] stack=[null, , , ] iinc 1 -1 local=[this, 2] stack=[null, , , ] iload_1 local=[this, 2] stack=[null, 2, , ] 参照, int ifne Label1 local=[this, 2] stack=[null, null, , ] local=[this, 1] stack=[null, null, , ] local=[this, 1] stack=[null, null, 1, ] 参照, 参照, int local=[this, 1] stack=[null, null, null, ] local=[this, 0] stack=[null, null, null, ] local=[this, 0] stack=[null, null, null, 0] 参照, 参照, 参照, int iconst_3 istore_1 Label1: aconst_null iinc 1 -1 iload_1 ifne Label1 教科書 p.119より 短にnullを3つ積むプログラム 左記のように,ラベル前で,毎回スタック列の型が異なる. このプログラムは Javaでは動きません!

おしまい