MIDP アプリケーションのためのセキュリティ

MIDP 1.0 仕様は、それぞれの MIDlet スイートが、MIDlet で使用可能な API の全てにおいて、センシティブな API またはデバイスの機能へのアクセスを防ぐサンドボックスで動作するように抑制していました。 そのサンドボックスの概念は、この仕様でも使用します。そして全ての信頼されていない MIDlet スイートが制限を受けることがあります。 この仕様のあらゆる実装が、信頼されていない MIDlet スイートを実行することをサポートしなければなりません

MIDP 2.0 は、センシティブであるとみなされて制限される API を使用することが許可される信頼されたアプリケーションの概念を導入します。デバイスが MIDlet スイートを信頼すると決定するなら、ドメイン・ポリシーで示されるようにアクセスが許可されます。下記の「信頼された MIDlet スイートのセキュリティ」セクションは、この概念について説明します。 信頼できないとして、デバイスによって信頼されていない全ての MIDlet スイートも実行できなければなりません。MIDlet スイートが信頼されるか否かを確かめる途中においてエラーが発生するなら、MIDlet スイートを拒絶しなければなりません。

信頼されていない MIDlet スイート

信頼されていない MIDlet スイートとは、デバイスが JAR ファイルの由来と完全性を信頼することができない MIDlet スイートです。 信頼されていない MIDlet スイートは、保護された API または機能へのアクセスが許可されないか、または明白なユーザーの許可によって許可された環境を使用して、信頼されていないドメインで実行しなければなりません。 全ての MIDP 1.0 対応の MIDlet スイートは信頼されていないとして、この仕様の実装で実行できなければなりません。 セキュリティ上重要ではない、この仕様の全て API や機能は、それらのために定義されたパーミッションを何も持っていない、信頼されたおよび信頼されていない MIDlet スイートのいずれからも暗黙的にアクセスすることができます。信頼されていない MIDlet スイートは JAR マニフェストまたはアプリケーション・ディスクリプタにおいて、明確なパーミッションを要求しません。

信頼されていない MIDlet スイートのための信頼されていないドメインは、ユーザーによる明確な確認なしで以下のアクセスを許容しなければなりません:

API 説明
javax.microedition.rms レコード・ストア API
javax.microedition.midletMIDlet ライフサイクル API
javax.microedition.lcdui ユーザーインタフェース API
javax.microedition.lcdui.game ゲーム API
javax.microedition.media
javax.microedition.media.control
サウンド再生のためのマルチメディア API

信頼されていない MIDlet スイートのための信頼されていないドメインは、保護された API または機能へのアクセスに、ユーザーによる明確な確認による許可が必要です:

API プロトコル
javax.microedition.io.HttpConnectionhttp
javax.microedition.io.HttpsConnectionhttps

信頼された MIDlet スイートのセキュリティ

信頼された MIDlet スイートへのセキュリティは保護ドメインに基づきます。 各保護ドメインは、そのドメインの MIDlet スイートに与えることができるパーミッション(許可)を定義します。 デバイスが、MIDlet スイートを信頼することができるか否かをどのように特定し、確かめるかを、保護ドメイン所有者が指定します。そして保護された API または機能へのアクセスを許可するパーミッションを保持する保護ドメインに割り当てます。 デバイスが MIDlet スイートを特定し、信頼するために使用するメカニズムは、それらが適切にデバイス、ネットワークおよびビジネス・ケースにおいて選択して許可するために個別に定義します。

X.509 PKI を用いた信頼された MIDlet スイートは、署名と検証によって信頼された MIDlet を特定するためのメカニズムについて説明します。この仕様の実装が PKI を使用して署名された MIDlet スイートが「信頼された MIDlet スイート」であると認めるなら X.509 PKI を用いた信頼された MIDlet スイートによって指定された書式と手順に従って、それらの署名について検証しなければなりません。

用語の定義

用語定義
保護領域 MIDlet スイートに与えられる1セットの許容ユーザー・パーミッション。
パーミッション API または機能に対して定義された、それが許可なく使用されることを防ぐ命名された権限。
信頼された MIDlet スイート認証と JAR ファイルの完全性がデバイスによって確認され、保護ドメインへ昇格することができる MIDlet スイート。

認証モデル

MIDlet スイートの基本認証は以下の要素間の関係によって確立されます:

仮定

パーミッション

パーミッションは API または機能へのアクセスを保護する手段であり、呼び出す前に明白な認証を必要とします。このセクションで説明するパーミッションは、機密保持を必要とする、それらの API または機能についてのみ言及し、信頼されたものと同様に信頼されていない MIDlet スイートからアクセスでき、明示的なパーミッションを必要としない他の API には言及しません。 パーミッションは保護された機能の呼び出しの前に、実装によってチェックします。

パーミッションの名前には、Java パッケージ名と同様の階層的な構成があります。 パーミッションの名前は大文字と小文字を区別します。 API のためのパーミッションは、全て API のパッケージ名と同じ接頭語を使用しなければなりません。 パーミッションがパッケージ中の特定のクラスの機能のためのものであれば、パーミッションはパッケージとクラス名を含まなければなりません。 許可のための有効な文字セットはパッケージとクラスの名前のためのそれと同じです。 パッケージ名におけるキャピタリゼイション(補記:本来は先頭を大文字化させる規則のこと、なのですが、ここでは大文字小文字の使い方のことを指します)を使用するための規約は許可名において使用すべきです。 例えば、javax.microedition.io。 パッケージまたはクラスに関わらず、パーミッション名にしたがって"."(Unicode U+002E)のセパレータと共に追加の修飾名を追加することができます。

MIDP 2.0 仕様の外側で定義された API のために、それが MIDP 2.0 上に実装される時に必要となるパーミッションと API の挙動を定義する1つの文書があるに違いありません。

保護された機能のためのパーミッション

保護されるように特定されている各機能(または各 API)は、API のためにクラスか「パッケージの文書(パッケージごとの解説ページ: package-summary.html のこと)」で定義されたパーミッション名を持たなければなりません。

この仕様に基づいて定義された全ての Generic Connection スキームでのパーミッションは javax.microedition.io パッケージの文書を参照してください。 全ての信頼されているおよび信頼されていない MIDlet スイートが、この仕様の中で明らかにパーミッションを定義しない、全ての API と機能を使用可能にしなければなりません。

MIDlet スイートによるパーミッションの要求

保護された API または機能へのアクセスを必要とする MIDlet スイートは、対応するパーミッションを要求しなければなりません。属性 MIDlet-Permissions によってパーミッションを示すことによって、必要とするパーミッションを要求することができます。それらのパーミッションは MIDlet スイートの機能において重要であり、そしてそれは、それらなしでは正しく動作しません。

MIDlet スイートが特定のパーミッションのあるなしに関わらず正しく動作するなら、それは MIDlet-Permissions-Opt 属性を使用することでそれらを要求すべきです。MIDlet スイートの機能性を制限(例えば、ネットのゲームの代わりに1人用のゲームとなる)すると共に、重要ではないパーミッションなしでインストールおよび実行できなければなりません。

MIDlet-Permissions および MIDlet-Permissions-Opt 属性は1つ以上の保護モードのリストを含みます。 コンマ(Unicode U+002C)によって複数の許可を分割します。 前後の空白(Unicode U+0020)とタブ(Unicode U+0009)は無視します。

デバイス上のパーミッション

この仕様を実装する各デバイスと他の Java API は、保護された API と機能について言及する1セットのパーミッションを必要とします。 それは、デバイスにおける全ての保護された機能および API について定義する、全てのパーミッションの集合です。

保護ドメイン

保護ドメインは1セットのパーミッションと関連する相互作用モードを定義します。 保護ドメインは以下からなります。

保護ドメイン中の各パーミッションは Allowed または User であり、両方はありえません。

Allowed パーミッションは、保護ドメインに関連した MIDlet スイートに基づく、特定の保護された API または機能へのアクセスを明白に許容するいずれかのパーミッションです。 Allowed パーミッションはどのようなユーザー対話も必要としません。

User パーミッションは、保護ドメインに関連した MIDlet スイートに基づくプロンプトをユーザーに提供し、明白なユーザーの許可によって、保護された API または機能へのアクセスを許容する、いづれかのパーミッションです。

User パーミッションのための対話モード

User パーミッションは特定の API を許容するために、以下に定義する対話モードの1つによって、ユーザーがパーミッションを却下するかパーミッションを付与します:

User パーミッションのための対話モードの選択はセキュリティ・ポリシーとデバイス実装によって実現します。 それぞれの User パーミッションには、デフォルトの対話モードおよび他の利用可能な対話モードのセットがあります。 対話モードの選択をユーザーが行えるようにすべきです。 それが提供されるなら、デフォルトの対話モードを提供することができます。 ユーザーは終始許可を却下しなければならない場合があります。

入力を促すのなら、持っている知識に沿う選択をすることができる程度の要求されたパーミッションに関するユーザー・フレンドリーな解説文をユーザーに提供すべきです。

blanket から oneshot までの範囲の動作パーミッション・モードは、利便性とユーザー通知の間のトレードオフを勘案し、デバイスとヒューマン・インタフェースにおいて一貫して動作すべきです。

信頼された MIDlet スイートへのパーミッション付与

承認された MIDlet スイートは、保護ドメイン情報、デバイスにおけるパーミッション、MIDlet スイートが要求したパーミッションを使用します。 そのドメインのパーミッションは、Allowed または User です。 アプリケーションが要求するパーミッションは、重要(必須)であるか、または、重要ではない(オプション)です。

それが呼び出されることになったときに、信頼された MIDlet スイートに与えられた許可を証明するために、以下の全ての条件を満たさなければなりません:

認証の結果が成功ならば、パーミッションを要求した MIDlet スイートに保護された API または機能へのアクセスが承認されます。

外部ドメイン・ポリシーの書式例

保護ドメインの外部提示は、開発者とメーカーおよびオペレータ(さかき注:携帯電話会社のこと。日本で言うところのキャリアに相当)との明確な通信を許容します。 この書式は単なる例として提供します。 この仕様の実装が、このフォーマットを使用するという必須条件は何もありません。 ポリシー・ファイルの文字セットはどのような言語もサポートする Unicode の UTF-8 エンコーディングです。 ポリシー・ファイルの書式は JAR のマニフェストの書式に基づきます。

ポリシーはドメインと別名の定義から成ります。 各ドメインは付与するパーミッションとユーザー・パーミッションの定義から成ります。 1つ以上のドメインで再利用すべき命名された許可の許可グループに別名をつけることにより、ポリシーをコンパクトに維持することを助けます。 別名は、ただ1つのポリシー・ファイルの中で定義され、使用されるだけでしょう。 別名からの参照は、ポリシー・ファイルの別名の定義に続かなければなりません。

ドメインはドメイン識別子と一連のパーミッションで定義します。 ドメイン識別子は実装特有です。 それぞれのパーミッション行は"allow"またはユーザー許可の"blanket""session"、または"oneshot"で開始し、以下のパーミッション・リストのための対話レベルを示します。 また、ユーザー・パーミッションはデフォルト・モードを含むかもしれません。 複数のパーミッション行が許容されます。 パーミッションは順番に処理します。そして、パーミッションがドメインの中に複数回現れるなら、最後のパーミッションの定義だけを使用します。 パーミッションが複数存在することは勧められません。

BNF 構文:

ポリシー・ファイル = 1*( 指示 )

指示 = ( ドメイン定義 | 別名定義 ) [ 改行 ]

ドメイン定義 = "domain:" *WS ドメイン ID *WS 改行
               1* パーミッション

ドメイン ID = 1*<全ての Unicode 文字による継続、ただし改行は含まず>

パーミッション = パーミッション・レベル ":" API 名称 改行

API 名称: *WS 別名または名称 *(*WS "," *WS 別名または名称 ) *WS

別名または名称 = 別名参照 | API 名

別名参照 = <同じポリシー・ファイルの中で事前に別名定義を行った別名>

パーミッション・レベル = allow | ユーザー・パーミッション・レベル

ユーザー・パーミッション・レベル = 最上位レベル ["(" デフォルト・レベル ")"]

最上位レベル = ユーザー・パーミッション・レベル

デフォルト・レベル = ユーザー・パーミッション・レベル ; 最上位レベルより大きくすることはできません。

ユーザー・パーミッション・レベル = ブランケット | セッション | ワンショット 

許容 = "allow" ; ユーザーに確認せずにアクセスを許容します。

ブランケット = "blanket" ; アクセスを許容し、再度の確認を行いません。
                         ; 確認を行うときには、セッションとワンショットを包含して
                         ; ください。

セッション = "session" ; アクセスを許容し、次の MIDlet スイートの開始で確認を行います。
                       ; 確認を行うときは、ワンショットを包含してください。

ワンショット = "oneshot" ; アクセスを許容し、次回の使用時に確認を行います。
                         ; デフォルトが提供されないなら、デフォルトではアクセスを
                         ; 拒否します。

別名定義 = "alias:" *WS 別名 1*WS 別名 API 名称

別名 API 名称 =  API 名
               *(*WS "," *WS API 名 ) *WS 改行

別名 = Java 名称

API 名 = Java クラス名

WS = 継続 | 空白 | 水平タブ

継続 = 新行 空白

改行 = 1* 新行  ; 空行を許容し、無視します。

新行 = キャリッジ・リターン LF | LF | キャリッジ・リターン <後続する LF がない>

キャリッジ・リターン = <Unicode キャリッジ・リターン (U+000D)>

LF = <Unicode 行送り (U+000A)>

空白 = <Unicode 空白 (U+0020)>

水平タブ = <Unicode 水平タブ (U+0009)>

Java 名称 = 1*<Java クラス名で許容される文字から"."を除外>

Java クラス名 = 1*<Java クラス名で許容される文字>

ポリシー・ファイルの例:

allow: javax.microedition.io.HttpConnection
oneshot(oneshot): javax.microedition.io.CommConnection

alias: client_connections javax.microedition.io.SocketConnection,
  javax.microedition.io.SecureConnection,
  javax.microedition.io.HttpConnection,
  javax.microedition.io.HttpsConnection

domain: O=Acme Wireless, OU=Software Assurance
allow: client_connections
allow: javax.microedition.io.ServerSocketConnection,
  javax.microedition.io.UDPDatagramConnection
oneshot(oneshot): javax.microedition.io.CommConnection

domain: allnet
blanket(session): client_connections
oneshot: javax.microedition.io.CommConnection