JP5415918B2 - インプットメソッドエディタ - Google Patents
インプットメソッドエディタ Download PDFInfo
- Publication number
- JP5415918B2 JP5415918B2 JP2009270625A JP2009270625A JP5415918B2 JP 5415918 B2 JP5415918 B2 JP 5415918B2 JP 2009270625 A JP2009270625 A JP 2009270625A JP 2009270625 A JP2009270625 A JP 2009270625A JP 5415918 B2 JP5415918 B2 JP 5415918B2
- Authority
- JP
- Japan
- Prior art keywords
- ime
- server
- client
- version
- user
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims description 75
- 230000008569 process Effects 0.000 claims description 54
- 244000035744 Hura crepitans Species 0.000 claims description 25
- 238000012545 processing Methods 0.000 claims description 13
- 238000004891 communication Methods 0.000 claims description 11
- 230000006870 function Effects 0.000 description 23
- 238000006243 chemical reaction Methods 0.000 description 20
- JCYWCSGERIELPG-UHFFFAOYSA-N imes Chemical compound CC1=CC(C)=CC(C)=C1N1C=CN(C=2C(=CC(C)=CC=2C)C)[C]1 JCYWCSGERIELPG-UHFFFAOYSA-N 0.000 description 7
- 230000008859 change Effects 0.000 description 4
- 241000234587 Canna Species 0.000 description 3
- 235000005273 Canna coccinea Nutrition 0.000 description 3
- 230000002159 abnormal effect Effects 0.000 description 3
- 230000001419 dependent effect Effects 0.000 description 3
- 230000004044 response Effects 0.000 description 3
- 230000009471 action Effects 0.000 description 2
- 238000013461 design Methods 0.000 description 2
- 230000007717 exclusion Effects 0.000 description 2
- 230000009466 transformation Effects 0.000 description 2
- KJLPSBMDOIVXSN-UHFFFAOYSA-N 4-[4-[2-[4-(3,4-dicarboxyphenoxy)phenyl]propan-2-yl]phenoxy]phthalic acid Chemical compound C=1C=C(OC=2C=C(C(C(O)=O)=CC=2)C(O)=O)C=CC=1C(C)(C)C(C=C1)=CC=C1OC1=CC=C(C(O)=O)C(C(O)=O)=C1 KJLPSBMDOIVXSN-UHFFFAOYSA-N 0.000 description 1
- VYZAMTAEIAYCRO-UHFFFAOYSA-N Chromium Chemical compound [Cr] VYZAMTAEIAYCRO-UHFFFAOYSA-N 0.000 description 1
- 206010000210 abortion Diseases 0.000 description 1
- 230000004913 activation Effects 0.000 description 1
- 230000006399 behavior Effects 0.000 description 1
- 230000027455 binding Effects 0.000 description 1
- 238000009739 binding Methods 0.000 description 1
- 238000004590 computer program Methods 0.000 description 1
- 238000012217 deletion Methods 0.000 description 1
- 230000037430 deletion Effects 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 230000010365 information processing Effects 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 230000001360 synchronised effect Effects 0.000 description 1
- 238000013519 translation Methods 0.000 description 1
Landscapes
- Document Processing Apparatus (AREA)
Description
IMEは、イベント処理部、GUI(グラフィカルユーザインタフェース)表示部、テキスト変換部を含む複数の機能からなる。これらの機能は、典型的に、一体構造のコンポーネント(特定の機能を持つソフトウェア部品)として実現される。Microsoft社のWindows(登録商標)では、このコンポーネントは1つのプロセスとして実行される形式ではなく、アプリケーションによってロードされる1つのDLL(ダイナミックリンクライブラリ)である。従って、このコンポーネントはアプリケーションと同じ権限で実行される。IMEコンポーネントがセキュリティホールを有すると、攻撃者は不正にホストアプリケーションの権限を獲得することができる。これは大きなセキュリティ上の懸念事項である。例えば、winlogon.exeのようなスクリーンロックプログラムがIMEの脆弱性を利用して攻撃者によって攻撃されると、攻撃者はスクリーンをロックしたユーザの権限を用いて任意のプログラムを実行することができる。
MS-IME(Windows(登録商標)のデフォルトのIME)および「ことえり」(Macintosh(登録商標)のデフォルトのIME)は一体構造の設計に基づく。すなわち、全てのコンポーネントは1つのバイナリファイルとして実装されている。この実装は国際化(インターナショナライゼーション、I18N)および移植をより困難にする。MS-IMEおよび「ことえり」は、中国語、日本語、韓国語について異なるIME実装を有する。そのため、MS-IMEのコードはこれらの言語の間で共有されない。
クライアント−サーバモデルで設計されたIMEは、IMEクライアントのみが新たなバージョンに更新され、古いバージョンのIMEサーバがまだ動作している場合、またはその逆の場合に問題を有する。IMEクライアントプログラムが更新されても、既存のアプリケーションがまだ古いバージョンのIMEクライアントを使用している(古いバージョンのIMEクライアントプログラムを実行中である)場合、2つの異なるIMEクライアントが1つのIMEサーバにアクセスする場合が生じうる。新たなバージョンのIMEクライアントが、古いバージョンのIMEサーバとの間の古いバージョンの通信プロトコルをサポートしないとき、IMEクライアントは動作しない。古いバージョンのIMEクライアントと新たなバージョンのIMEサーバの間でも同じことが生じる。
状態のないIMEクライアントが各々のキー入力イベントをIMEサーバに送信して出力情報を受信するクライアント−サーバ型のIMEにおいて、入力セッションの間に、IMEサーバが異常終了して再起動されたとき、ユーザは意図しない出力を見ることになりうる。
第2に、言語に依存せず、移植性を有するインプットメソッド実装のための状態のないセッション管理に関する。
第3に、コンピュータの再起動なしでのIMEバージョンの更新に関する。
第4に、セッションのプレイバックに関する。
本発明では、安全性の目的のために、IMEを複数のプロセス(一形態として、1つのクライアントDLLと1つのサーバプロセス)に分離して機能をモジュール化する。複数のプロセスには、異なるセキュリティポリシーを適用し、サンドボックス、整合性レベルの変更のような異なる保護技術を適用することが可能である。
また、「整合性レベル」とは、Microsoft社のWindows Vista(Windowsは登録商標)で導入されたセキュリティ上の概念である。この整合性レベルは、高・中・低と分かれており、それによって、下記のように、ファイルシステムにどこまでアクセスできるかが決まる。
高:%ProgramFiles%やHKLMへの書き込みが可能(管理者権限)。
中:%UserProfile%やHKCUへの書き込みが可能(ユーザ権限)。
低:専用の場所にのみ書き込みが可能。
IMEの移植性および国際化を向上させるIMEアーキテクチャを開示する。IMEを実装するために、各々のオペレーティングシステムが提供するIMEフレームワークを使用しなければならない。これらのフレームワークの違いはIMEの移植を困難にする。また、言語が異なるとIMEの使い勝手が異なる。IMEアーキテクチャを言語から独立にすることは困難であることが知られている。本発明では、基本的に、IMEをクライアントとサーバの2つのコンポーネントに分離する。また、本発明では、クライアントとサーバの間で状態のないプロトコルを使用する。クライアントとサーバは、IPC(プロセス間通信)またはRPC(リモートプロシージャコール(遠隔手続き呼び出し))を用いて互いに通信する。言語に依存する全てのIMEモデルがサーバ内に実装され、これはIMEフレームワークに依存する必要がない。プロトコルは状態がないので、クライアントの役割を簡単にすることができ、クライアントはユーザのキー入力イベントを受信してサーバに送信し、サーバからの表示情報に従って表示する。単にサーバ部分を置き換えることによって新たな言語のための新たなIMEを実現することができる。
本発明は、コンピュータの再起動なしで実現されたIMEを更新する技術である。新たなバージョンのIMEクライアントが古いバージョンのIMEサーバと互換性のある通信プロトコルを有するとき、この更新はユーザに気付かれずに行われる。新たなバージョンのプロトコルが古いバージョンのプロトコルと互換性がないとき、それを検出し、どのように処理すべきかユーザに回答を促す。
IMEサーバインスタンスが異常終了したときでも、IMEクライアントは、以前のキー入力イベントを新たに実行されたサーバに再送することによって、現在のユーザセッションをシームレスに継続することができる。
IME DLLはアプリケーションと同じセキュリティレベルで動作する。もし、IME DLLがセキュリティホールを有し、アプリケーションが高いセキュリティレベル(Windows Vista(Windowsは登録商標)において「高」整合性レベルとも呼ばれる)で動作しているならば、悪意のあるユーザ/アプリケーションは、セキュリティホールを利用して、ユーザの個人データ(ユーザ履歴データ)を取得し、それを外部のサーバに送信するような悪意のある操作を行うことも可能である。これに対し、本発明によるクライアント−サーバモデルは、悪意のあるユーザ/アプリケーションからユーザデータを保護することができる。本発明によるIMEサーバは隔離されているので、制限されたサンドボックス環境内でプロセスを起動することができる。サンドボックス化されたIMEサーバは、ローカルコンピュータにおいて安全でないリソースにアクセスすることができない。
異なるオペレーティングシステムは、異なるIMEフレームワークを有する。IMEをプラットフォームから独立にするために、これらのIMEフレームワークへの依存を最小にすることが望ましい。コアの変換エンジンを1つの独立したプロセスとして分離することは、移植性のために役立つ。
アプリケーションがクラッシュすると、そのアプリケーションに結合しているIMEは同時にkillされる(プログラムの実行が終了させられる)。IMEがユーザ履歴または任意の変更可能なデータをローカルファイルシステムに同期させている間のアプリケーションのクラッシュは災難である。従来のIMEの設計は、このような場合に弱い。意図しないアプリケーションのクラッシュのために、時々、IME辞書が破壊されることがある。本発明では、そのような心配はない。本発明によるIMEクライアントDLLは状態のある動作をせず、IMEクライアントDLLがkillされても、セッション情報はIMEサーバ内に残っている。そのため、ユーザデータを安全にローカルファイルシステムに同期させることができる。
1つのアプリケーションは、1つのIME DLLのインスタンスを生成する。従来は、複数のIMEインスタンスが存在し、辞書およびユーザ履歴のような共有リソースを使用していることが常に生じるので、IME DLLは共有リソースの同時使用を防止するために、プロセスに渡る相互排除ロックを使用しなければならない。これに対し、本発明によるIMEサーバはユーザごとに単一のプロセスであるので、システム自身はプロセスに渡るロックを行う必要がなく、これはIMEを従来のシステムよりずっと簡単にする。
また、説明中のアプリケーションは、アプリケーションプログラムがコンピュータに読み込まれ、このプログラムに含まれる命令をコンピュータが実行することにより構築される情報処理装置と考えることができる。
なお、説明中のDLL(ダイナミックリンクライブラリ)は、プログラムそのものを意味する場合と、DLLがコンピュータに読み込まれ、このプログラムに含まれる命令をコンピュータが実行することにより実現されるものを意味する場合がある。
図1に示すように、一実施形態によるIMEクライアントはWindows(登録商標)上の共有ライブラリ(DLL)として実現される。このDLLは、図2に示す、変換機能を含んでいた従来のDLLと比較してサイズが小さい。図1の点線内は、サンドボックス内で動作する、ユーザ毎に単一のIMEサーバである。移植性があり、大域的な相互排除はなく、ロバストである。一方、図2に示す従来のIMEアーキテクチャでは、アプリケーションの権限で動作し、変換機能は移植性がなく、共有リソースはプロセスに渡る相互排除ロックが必要であり、管理が難しかった。
クライアントは、プラットフォームに固有のフレームワーク(例えば、Windows(登録商標)用のIMM32またはTSF)を用いて実現される。クライアントは、状態のないイベントリスナおよびGUI表示部を有するシンクライアントである(Windows(登録商標)においては、イベントリスナとGUI表示部も分離されている)。
クライアントはサーバに全てのキー入力イベントを送信し、サーバはクライアントに表示情報を返送する(Windows(登録商標)においては、サーバから送信された表示情報に、座標などの描画情報を付与して、GUI表示部で表示している)。
本発明によるIMEサーバプロセスは、安全なサンドボックス内で起動される。これは、Google Chrome(Google社が開発したウェブブラウザ)のために使用されるサンドボックスライブラリを使用することができる。
IMEサーバプロセスのサンドボックス内での起動に関するプログラムコードの例を以下に示す。
if (S_OK != ::SHGetFolderPathW(NULL,
CSIDL_PROGRAM_FILES,
NULL,
SHGFP_TYPE_CURRENT,
mozc_server_path)) {
LOG(ERROR) << "cannot find Program and Files";
return false;
}
wcsncat_s(mozc_server_path, MAX_PATH,
L"\\Google\\Mozc\\mozc_server.exe",
_TRUNCATE);
HANDLE job_handle = 0;
// Create a Job inside restricted sandbox environment.
const DWORD err_code = sandbox::StartRestrictedProcessInJob(
mozc_server_path,
sandbox::USER_INTERACTIVE, // main token
sandbox::USER_INTERACTIVE, // impersonate token
sandbox::JOB_LOCKDOWN, // job token
sandbox::INTEGRITY_LEVEL_LOW, // integritiy level
&job_handle);
if (ERROR_SUCCESS != err_code) {
LOG(ERROR) << "cannot launch mozc_server: " << ::GetLastError();
return false;
}
IMEサーバが通常のプロセスとして起動されることを防止するために、IMEサーバは、最初に、自身のプロセスが正しいサンドボックス環境内で実行されているかをチェックする。より詳しくは、次の健全性チェック(sanity check)が実行される。戻り値がServerUtil::DENYであるとき、IMEサーバプロセスは起動されない。
健全性チェックに関するプログラムコードの例を以下に示す。
// Open process token,
if (!::OpenProcessToken(::GetCurrentProcess(), TOKEN_QUERY, &hToken)) {
return ServerUtil::DENY;
}
// If CurrentProcess doesn't have RESTRICTED token, return ServerUtil::DENY
if (!::IsTokenRestricted(hToken)) {
::CloseHandle(hToken);
return ServerUtil::DENY;
}
TOKEN_STATISTICS ts;
DWORD dwSize = 0;
// Use token logon LUID instead of user SID, for brevity and safety
if (!::GetTokenInformation(hToken, TokenStatistics,
(LPVOID)&ts, sizeof(ts), &dwSize)) {
::CloseHandle(hToken);
return ServerUtil::DENY;
}
::CloseHandle(hToken);
// Do not execute the server if i'm system
const LUID SystemLuid = SYSTEM_LUID;
const LUID LocalServiceLuid = LOCALSERVICE_LUID;
const LUID NetworkServiceLuid = NETWORKSERVICE_LUID;
if (EqualLuid(SystemLuid, ts.AuthenticationId) ||
EqualLuid(LocalServiceLuid, ts.AuthenticationId) ||
EqualLuid(NetworkServiceLuid, ts.AuthenticationId)) {
return ServerUtil::DENY;
}
OSVERSIONINFO osi = { 0 };
osi.dwOSVersionInfoSize = sizeof(osi);
if (!::GetVersionEx(&osi)) {
return ServerUtil::DENY;
}
// Vista or later (Check the current session id is not 0)
if (osi.dwMajorVersion >= 6) {
// SessionId == 0 is special env.
DWORD dwSessionId = 0;
if (!::ProcessIdToSessionId(::GetCurrentProcessId(), &dwSessionId) ||
dwSessionId == 0) {
return ServerUtil::DENY;
}
}
// mozc_server's main thread is impersonated.
if (!::RevertToSelf()) {
return ServerUtil::DENY;
}
// OK my process is inside a safe environment!
return ServerUtil::NORMAL;
Windows(登録商標)環境でクライアント/サーバを実現するために、COM(Component Object Model)を使用することが推奨されている。しかし、Windows Vista(Windowsは登録商標)の場合、アプリケーションが「高」整合性レベルで起動されると、本発明によるIME COMサーバも「高」整合性レベルで起動される。「低」整合性レベル、「中」整合性レベルの場合も同様である。従って、Windows Vista(Windowsは登録商標)の場合、異なる整合性レベルを有する3つのIMEサーバ(COMインスタンス)が同時に起動される。本発明によるクライアント−サーバモデルにおいて、ユーザ当たり1つのIMEサーバインスタンスは強い制約であり、複数のインスタンスを許容する次善策は望まない。
一実施形態によるIMEは、単一スレッド、単一接続モデルを採用する。IMEサーバは1つのポートのみオープンし、IMEクライアントからの複数の接続を処理する。このモデルを採用する主な理由は、簡単さと良好な移植性である。ほとんど全てのプラットフォームが単一スレッド、単一接続のIPCをサポートしている。
IMEクライアントは、全てのキー入力イベント(例えば、‘A’のキーを押した。)をサーバに送信し、そのキー入力イベントに対応する表示情報(例えば、‘A’は、下線を付して日本語“あ”として表示せよ。)を取得する。接続は状態がない。一般に、IPC接続の持続時間はたいへん短い。IMEサーバが表示情報の応答を完了すると、即座に接続を閉じて、他の接続を待つ。
単一接続/単一スレッドモデルの課題の1つは、悪意のあるユーザがIMEサーバに接続して何も行わないならば、IMEサーバはブロックされる(処理の進行を妨げられる)ことである。また、逆の場合も生じうる。悪意のあるIMEサーバがIMEクライアントに何も応答を送信しないならば、IMEクライアントはブロックされる。
このような場合を防止するために、IPC接続はタイムアウトを実行すべきである。サーバ/クライアントがある時間内(例えば、500ミリ秒以内)にメッセージを送信しないならば、サーバ/クライアントは現在の接続を終了する。Windows(登録商標)において、そのようなタイムアウトは、オーバーラップI/O(Overlapped I/O)を使用することによって容易に実現される。
タイムアウトに関するプログラムコードの例を以下に示す。
const char *buf, size_t buf_length, int timeout) {
if (buf_length == 0) {
return false;
}
OVERLAPPED Overlapped;
::ZeroMemory(&Overlapped, sizeof(Overlapped));
bool error = false;
while (buf_length > 0) {
if (!::WriteFile(handle, buf,
static_cast<DWORD>(buf_length), NULL, &Overlapped) &&
ERROR_IO_PENDING != ::GetLastError()) {
error = true;
break;
}
if (WAIT_OBJECT_0 != ::WaitForSingleObject(handle, timeout)) {
LOG(WARNING) << "Write timeout: " << timeout;
error = true;
break;
}
DWORD size = 0;
if (!::GetOverlappedResult(handle, &Overlapped, &size, TRUE)) {
error = true;
break;
}
buf_length -= size;
buf += size;
}
return !error;
}
実行されるプログラム同士がコンピュータ内部でデータをやり取りするプロセス間通信の方式の1つに名前付きパイプがある。
名前付きパイプのパス名は他のユーザから予測不可能であるべきである。そうでないと、悪意のあるユーザは、有効なIMEサーバが開始する前に、偽物の名前付きパイプのIMEサーバを生成することができる。さらに、悪意のあるユーザは、IMEサーバがパス名を生成するためにユーザ名を使用していると、それを発見することができるので、パス名の生成にユーザ名を使用することは安全ではない。
パス名の生成に関するプログラムコードの例を以下に示す。
memset(buf, '\0', buf_size);
HCRYPTPROV hprov;
if (!::CryptAcquireContext(&hprov,
NULL,
NULL,
PROV_RSA_FULL,
CRYPT_VERIFYCONTEXT)) {
return false;
}
if (!::CryptGenRandom(hprov,
static_cast(buf_size),
reinterpret_cast(buf))) {
::CryptReleaseContext(hprov, 0);
return false;
}
::CryptReleaseContext(hprov, 0);
}
IMEサーバが名前付きパイプのパス名を生成すると、そのパス名をユーザプロファイルディレクトリ内に保存する。ユーザプロファイルディレクトリの場所は、例えば、次の通りである。なお、<user>はユーザ名を表わし、<IME>はIMEに付与した固有の名称を表わす。
Windows XP(Windowsは登録商標)の場合
c:\Document Setting\<user>\Local Settings\Application Data\google\<IME>
Windows Vista(Windowsは登録商標)またはWindows 7(Windowsは登録商標)の場合
c:\Users\<user>\AppData\LocalLow\google\<IME>
LinuxまたはMacintosh(登録商標)の場合
~/.<IME>/
Windows(登録商標)の場合、所有者を知るための文書化されていない方法が存在するようであるが信頼できないので、それは使用しない。
Macintosh(登録商標)の場合、そのようなAPIは存在しない。
Linuxの場合、Linuxのファイルロックは単に勧告のロックである。ファイルロックそれ自体は信頼できない。
Windows Vista(Windowsは登録商標)の場合、相手のプロセスIDを知るAPIが存在するので、それを使用することができる(http://msdn.microsoft.com/en-us/library/aa365446(VS.85).aspx)。
Windows XP(Windowsは登録商標)の場合、同等なAPIは存在しない。
Macintosh(登録商標)の場合、同等なAPIは存在しない。
Linuxの場合、Unix Domainソケット(Unixは登録商標)を用いて相手のpidを知ることができる。/proc/<pid>/execを読み出すことによって、パスを知ることができる。
Windows XP(Windowsは登録商標)、Macintosh(登録商標)は、相手のpidを知るためのサポートはないので、IPCを介してPIDを送信することができる。これは、不慮の攻撃を防止することができる。
CreateNamedPipeのデフォルトパラメータを用いた、同じパス名を有する複数のNamedPipeサーバのインスタンス(プロセス)は許容される。これは致命的なセキュリティホールとなりうる。悪意のあるアプリケーションは、同じパス名を使用することによって偽物のIMEサーバを容易に生成することができる。複数のインスタンス生成を防止するために、Windows XP(Windowsは登録商標)以降にFILE_FLAG_FIRST_PIPE_INSTANCEフラグが導入された。詳細は
http://msdn.microsoft.com/en-us/library/aa365150(VS.85).aspx
を参照。Microsoft社によればフラグを設定することが強く推奨される。
http://support.microsoft.com/kb/308403/en
を参照。
名前付きパイプは有効なユーザのみからアクセスされるべきである。有効なセキュリティ属性をCreateNamedPipe APIに渡す。図5に示すように、これは、ローカルシステム、管理者、および、現在のユーザからのアクセスを許可する。他のユーザからのアクセスは許可されない。MakeSecurityAttributes関数の実装を知るためには
http://s/?fileprint=//depot/google3/experimental/mozc/third_party/sandbox/security_attributes.cc
を参照。
CreateNamedPipe APIの呼び出しに関するプログラムコードの例を以下に示す。
if (!sandbox::MakeSecurityAttributes(&SecurityAttributes)) {
LOG(ERROR) << "Cannot make SecurityAttributes";
return;
}
// Create a named pipe.
wstring wserver_address;
Util::UTF8ToWide(server_address.c_str(), &wserver_address);
handle_ = ::CreateNamedPipe(wserver_address.c_str(),
PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED |
FILE_FLAG_FIRST_PIPE_INSTANCE,
PIPE_TYPE_MESSAGE |
PIPE_READMODE_MESSAGE |
PIPE_WAIT,
(num_connections <= 0 ?
PIPE_UNLIMITED_INSTANCES : num_connections),
sizeof(request_),
sizeof(response_),
0,
&SecurityAttributes);
if (handle_ == INVALID_HANDLE_VALUE) {
LOG(FATAL) << "CreateNamedPipe failed" << ::GetLastError();
return;
}
名前付きパイプのなりすましを不可能にしなければならない。そうでなければ、悪意のあるIMEサーバはクライアント接続をなりすますことができ、クライアント権限で悪意のあるコードを実行することができる。名前付きパイプのなりすましを不可能にするために“SECURITY_SQOS_PRESENT|SECURITY_IDENTIFICATION|SECURITY_EFFECTIVE_ONLY”フラグをCreateFile APIに渡す。CreateFile APIの呼び出しに関するプログラムコードの例を以下に示す。
handle_ = ::CreateFile(wserver_address.c_str(),
GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING,
FILE_FLAG_OVERLAPPED |
SECURITY_SQOS_PRESENT |
SECURITY_IDENTIFICATION |
SECURITY_EFFECTIVE_ONLY,
NULL);
次に、本発明によるIMEサーバが複数のアプリケーションからの複数の変換リクエストをどのように管理するかを説明する。1つのアプリケーションは、現在の入力モード、現在の変換状態、等を保持する1つのセッションをオープンする。全てのセッションが互いに隔離されていることを保証しなければならない。
IMEクライアントDLLは、最初に、セッションIDをIMEサーバに要求する。セッションはこのセッションIDを用いて管理される。例えば、キー入力イベント‘a’がセッションIDとともに送信される。IMEサーバは、セッションIDを見ることによってどのアプリケーション(セッション)が‘a’のキーを受信したかを知ることができる。もはや現在のセッションにアクセスする必要がないならば、IMEクライアントはDeleteSessionリクエストを呼び出すことができる。
IMEクライアント>CreateSession
IMEサーバ >Your session id is 123
IMEクライアント>SendKey 123 ‘a’
IMEサーバ >...
...
IMEクライアント>DeleteSession 123
セッションメッセージは、protocol buffer 2(オープンソースのプロトコルバッファ)を使用することによって平文のバイト列に符号化される。
セッションIDは、他のアプリケーションから予測不可能であるべきである。そうでなければ、悪意のあるクライアントは、偽物のリクエストを送信し、間接的にセッション情報を編集することができる。IMEサーバは上述したCreateRandomSequence関数を用いてランダムなセッションID(符号なし64ビット整数)を生成する。総当たり攻撃によって有効なIDを取得することは可能であるが、予測可能なセッションID(連続したID、等)を使用するよりずっと安全である。
悪意のあるクライアントが膨大な数の偽物のCreateSessionリクエストを送信すると、IMEサーバはヒープメモリを消費し、結局、クラッシュする。そのような場合を防止するために、全てのセッションIDは、一種の固定のLRU(least recently used)キャッシュによって管理される。例えば、サイズは64に設定される。有効なセッションのサイズが64に到達すると、IMEサーバは最も古いセッションを削除する。この処理は、CreateSessionリクエストへの全てのDoS攻撃を常に阻止するとは限らないが、少なくとも意図しないメモリ消費を防止することができる。それに加えて、DoS攻撃を止めるために次の処理を追加することができる。
・CreateSessionが呼び出されたとき、1秒(1秒は任意である。)以内に他のCreateSessionを要求することができない。
・IMEクライアントが、30秒間、(SendKeyのような)リクエストを送信しないとき、セッションは自動的に削除される。この処理はゾンビセッションを消去する。
・IMEクライアントが、CreateSessionの後に、2分間、リクエストを送信しないとき、セッションは自動的に消去される。
・IMEクライアントDLLは、IMEサーバによってセッションが消去されたときでも、変換を維持するために十分にロバストであるべきである。
IMEクライアントはIMEサーバを共有する。IMEサーバがまだ起動されていないと、IMEクライアントはIMEサーバを起動する。各々のユーザは、各々のIMEサーバに接続する。ユーザはIMEサーバを共有しない。複数のコンピュータは、そのうちの1つのコンピュータ上のIMEサーバを共有しない。従って、クライアント−サーバ接続は1つのコンピュータ内で閉じている。1つのコンピュータが複数のデスクトップを有するときでも、1つのIMEサーバが存在する。IMEサーバは、ユーザ履歴のようなデータをユーザのホームディレクトリに保存することが可能である。しかし、この場合、例えば、NFS(ネットワークファイルシステム)を使用して複数のコンピュータの間でそのホームディレクトリを共有するようなことは行うべきでない。
・1つのコンピュータ上の複数のデスクトップに対して、1つのIMEサーバプロセス。なお、1つのユーザプロファイルに2つのコンピュータがアクセスした場合は検討を要する。
・1つのIMEサーバプロセスに対して、1つの変換部インスタンス。すなわち、変換部は単一のものである。
・1サーバプロセスに対して、複数接続。
・接続はワンショットであり、キープアライブは行わない。
・コンテキスト(セッション)はセッションIDによって管理される。
・2つのアプリケーションが同じセッションIDを使用するとき、IMEサーバは1つのスレッドなので、セッションIDをロックする必要はない。
・IMEサーバは単一のスレッドである。
・変換部における全てのメソッドはスレッドセーフでなければならない。排他的な動作が存在するならば、ロックを行う。
IMEクライアントは、各々のオペレーティングシステムが提供するIMEフレームワーク上で実現される。IMEクライアントが行うのは、ユーザのキー入力イベント(例えば、“a”のキーが押された。)を取得すること、このキー入力イベントをIMEサーバに送信すること、IMEサーバはクライアントが送信したキー入力イベントに対応する表示情報(例えば、下線を付して日本語“あ”を表示せよ。)を返送するので、それを表示すること、のみである。IMEクライアントは状態を管理しない。
IMEサーバは、IMEクライアントと異なるプロセスで実行される。接続のためにRPCを使用するならば、IMEサーバは異なるコンピュータで実行されうる。IMEサーバは、任意のIMEフレームワーク上で実装する必要がないので、IMEサーバの実装はより移植性が高くなる。異なるプラットフォーム上で動作する、異なるIMEクライアントは同一のIMEサーバに接続することができる。IMEサーバは、全てのキー入力イベントを処理し、表示情報をIMEクライアントに返送する。表示情報は、アプリケーションに表示すべき現在の(部分的に)変換された日本語テキストおよび候補ウィンドウの内容を含む。
1.IMEクライアント→IMEサーバ: 新たなセッションを生成せよ。
2.IMEサーバ→IMEクライアント: OK。あなたのセッションIDは123。
3.IMEクライアント→IMEサーバ: ‘a’が押された。IDは123。
4.IMEサーバ→IMEクライアント: 現在の行に下線を付して“あ”と表示せよ。
5.IMEクライアント→IMEサーバ: ‘i’が押された。IDは123。
6.IMEサーバ→IMEクライアント: 現在の行に下線を付して“あい”と表示せよ。
7.IMEクライアント→IMEサーバ: ‘ ’(空白)が押された。IDは123。
8.IMEサーバ→IMEクライアント: 現在の行に“愛”と表示せよ。
9.IMEクライアント→IMEサーバ: ‘ ’(空白)が押された。IDは123。
10.IMEサーバ→IMEクライアント: 現在の行に“愛”と表示し、内容が[愛、合、あい、相、...]である候補ウィンドウを表示し、第1候補を強調表示せよ。
11.IMEクライアント→IMEサーバ: “down”キーが押された。IDは123。
12.IMEサーバ→IMEクライアント: 現在の行に“合”と表示し、内容が[合、あい、相、...]である候補ウィンドウを表示し、第2候補を強調表示せよ。
13.IMEクライアント→IMEサーバ: “enter”キーが押された。IDは123。
14.IMEサーバ→IMEクライアント: アプリケーションにテキスト“合”を送信せよ。
15.・・・
16.IMEクライアント→IMEサーバ: セッション123を消去する。
17.IMEサーバ→IMEクライアント: OK。終了。
プロトコルのバージョンは、例えば、ファイル名「.session.ipc」のような.ipcファイルに保存される。.ipcファイルはprotobufでシリアライズしたメッセージである。プロトコルバッファ(http://code.google.com/p/protobug/)を更新したい場合、ipc/ipc.hファイルを修正する。列挙されたIPC_PROTOCOL_VERSIONフィールドが存在する。IMEクライアントおよびIMEサーバのバージョンは、例えば、バイナリ実行形式ファイル内にエンコードされる。.ipcファイルにもIMEクライアントおよびIMEサーバのバージョンがエンコードされる。
IMEクライアントのバージョンがIMEサーバのバージョンと同じである場合、これは通常の場合であり、特別な動作はしない。
<ケース2>
IMEクライアントのバージョンがIMEサーバのバージョンより新しい場合、IMEクライアントはIMEサーバを再起動する。すなわち、IMEサーバプログラムの実行を停止させ、新たなプログラムバージョンのIMEサーバプログラムをメモリに読み込ませ、実行させる。
<ケース3>
IMEクライアントのバージョンがIMEサーバのバージョンより古く、プロトコルが互換性を有する場合、IMEクライアントはIMEサーバとの接続を維持する。
<ケース4>
IMEクライアントのバージョンがIMEサーバのバージョンより古く、プロトコルが互換性を有さない場合、IMEクライアントはIMEサーバとの接続を中止する。
新たなバージョンのIMEクライアントは、動作しているIMEサーバのバージョンが古いことを検出すると、古いバージョンのサーバを停止させ、新たなバージョンのIMEサーバを起動させる(図6(b))。
一方、IMEの実行形式ファイルの更新以前からアプリケーションとともに動作しているIMEクライアントは、動作しているIMEサーバのバージョンがIMEクライアントのバージョンより新しいことを検出すると、そのIMEクライアントは、IMEサーバのプロトコルのバージョンを参照してプロトコルの互換性をチェックする(図6(c))。
プロトコルが互換性を有するならば、そのIMEクライアントは新たなバージョンのIMEサーバに接続する(図6(d))。そうでないならば、IMEクライアントは接続を中止し、ユーザにバージョンの不一致を知らせる(図6(e))。
1.Omaha(プログラムの新バージョンを自動でインストールするGoogle社のプログラム)は、コンピュータの記憶装置に保存されているIMEクライアントDLLおよびIMEサーバプログラムを移動してファイル名を変更する。新たなIMEクライアントDLLおよびIMEサーバプログラムがコンピュータの記憶装置に保存される。
2.新たに起動されたアプリケーションは、新たなバージョンのIMEクライアントDLLをメモリに読み込む。
3.IMEクライアントがCreateSessionコマンドを送出するとき、.ipcファイルをチェックすることによってプロトコルのバージョンの不一致を検出することができる。
4.IMEクライアントのバージョンがIMEサーバ(実行中のIMEサーバ)のバージョンより新しい場合、IMEクライアントはIMEサーバをユーザに気付かれずに再起動する。再起動はCreateSessionコマンドを送出するときのみ実行される。
5.再起動後もプロトコルのバージョン、あるいは、IMEのバージョンが変わらないならば、エラーを示すダイアログウィンドウをコンピュータのディスプレイに表示する。
6.古いバージョンのIMEクライアントDLLをコンピュータのメモリに読み込んだ元のアプリケーションは新たなバージョンのIMEサーバと通信することができない。この場合、すなわち、IMEクライアントのプロトコルのバージョンがIMEサーバのバージョンより古い場合、IMEクライアントはエラーを示すダイアログウィンドウをコンピュータのディスプレイに表示する。
1.Omahaは、コンピュータの記憶装置に保存されているIMEクライアントDLLおよびIMEサーバプログラムを移動してファイル名を変更する。新たなIMEクライアントDLLおよびIMEサーバプログラムがコンピュータの記憶装置に保存される。
2.新たに起動されたアプリケーションは、新たなバージョンのIMEクライアントDLLをメモリに読み込む。
3.IMEクライアントがCreateSessionコマンドを送出するとき、.ipcファイルをチェックすることによってプロトコルのバージョンの不一致を検出することができる。
4.プロトコルのバージョンが互換性を有するので、IMEクライアントはIMEサーバを安全に再起動することができる。再起動はCreateSessionコマンドを送出するときのみ実行される。
5.再起動後もIMEサーバのバージョンが変わらないならば、エラーを示すダイアログウィンドウをコンピュータのディスプレイに表示する。
6.古いバージョンのIMEクライアントDLLをコンピュータのメモリに読み込んだ元のアプリケーションは古いバージョンのIMEクライアントプログラムを使用する。これは、他のアプリケーションがCreateSessionコマンドを送出するときIMEサーバのみ更新され、すなわち、ユーザが何かキー入力している間はIMEサーバが更新されないだけであるので、大きな問題ではない。また、互換性のあるプロトコルのバージョンはクライアント−サーバ間の通信が破壊されないことを保証する。
Claims (2)
- クライアントプログラムとサーバプログラムとを含むインプットメソッドエディタであって、
前記クライアントプログラムは、ファイルシステムにアクセス可能なレベルを指定するパラメータを用いてサンドボックス環境内でサーバプログラムを起動する処理と、キー入力イベントをプロセス間通信によって送信する処理と、前記キー入力イベントに対応する表示情報を前記プロセス間通信によって受信する処理と、前記表示情報に従って表示する処理とをコンピュータに実行させ、
前記サーバプログラムは、前記サンドボックス環境内で実行されているかチェックする処理と、前記プロセス間通信によってキー入力イベントを受信する処理と、前記キー入力イベントを対応する文字情報に変換する処理と、前記文字情報を含む表示情報を前記プロセス間通信によって返送する処理とをコンピュータに実行させるインプットメソッドエディタ。 - 前記プロセス間通信のための経路は、前記サンドボックス環境のセキュリティ属性に対応するように生成される請求項1に記載のインプットメソッドエディタ。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2009270625A JP5415918B2 (ja) | 2009-11-27 | 2009-11-27 | インプットメソッドエディタ |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2009270625A JP5415918B2 (ja) | 2009-11-27 | 2009-11-27 | インプットメソッドエディタ |
Related Child Applications (3)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2013235736A Division JP5745599B2 (ja) | 2013-11-14 | 2013-11-14 | インプットメソッドエディタ |
JP2013235737A Division JP5640137B2 (ja) | 2013-11-14 | 2013-11-14 | インプットメソッドエディタ |
JP2013235738A Division JP5640138B2 (ja) | 2013-11-14 | 2013-11-14 | インプットメソッドエディタ |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2011113403A JP2011113403A (ja) | 2011-06-09 |
JP5415918B2 true JP5415918B2 (ja) | 2014-02-12 |
Family
ID=44235671
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2009270625A Active JP5415918B2 (ja) | 2009-11-27 | 2009-11-27 | インプットメソッドエディタ |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP5415918B2 (ja) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2017073039A1 (en) * | 2015-10-26 | 2017-05-04 | Ricoh Company, Ltd. | Information system |
CN109960498B (zh) * | 2017-12-26 | 2022-09-06 | 深圳联友科技有限公司 | 一种基于c++的html编辑器编辑及升级方法及装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2695483B2 (ja) * | 1989-09-07 | 1997-12-24 | 富士通株式会社 | 整合性チェック方法 |
-
2009
- 2009-11-27 JP JP2009270625A patent/JP5415918B2/ja active Active
Also Published As
Publication number | Publication date |
---|---|
JP2011113403A (ja) | 2011-06-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9635138B2 (en) | Client-server input method editor architecture | |
US10515208B2 (en) | Isolation and presentation of untrusted data | |
US10503564B2 (en) | Method and apparatus for handling security of an application and its extension | |
CA2761563C (en) | Annotating virtual application processes | |
US9239909B2 (en) | Approaches for protecting sensitive data within a guest operating system | |
KR101453742B1 (ko) | 웹 어플리케이션 실행을 위한 보안 제공 장치 및 방법 | |
WO2014101393A1 (zh) | 应用实现方法及装置 | |
WO2010111147A2 (en) | Input content to application via web browser | |
WO2007126701A1 (en) | Isolated access to named resources | |
KR20110123867A (ko) | 웹 어플리케이션 실행 장치 및 그의 웹 어플리케이션 관리 방법 | |
JP4668698B2 (ja) | インストールされているアプリケーションによって要求されるソフトウェア制御サービスのイネーブル化 | |
KR101482151B1 (ko) | 웹 어플리케이션 실행 장치 및 방법 | |
JP5415918B2 (ja) | インプットメソッドエディタ | |
CN105095748B (zh) | 一种浏览器隔离使用的方法 | |
JP5640138B2 (ja) | インプットメソッドエディタ | |
JP5745599B2 (ja) | インプットメソッドエディタ | |
JP5640137B2 (ja) | インプットメソッドエディタ | |
JP2005085259A (ja) | エンターテイメントモード機能を有するコンピュータシステム | |
JP6285974B2 (ja) | サーバシステム、クライアント装置及びプログラム | |
Veeramani | Smart clients versus web forms | |
KR101563657B1 (ko) | 샌드박싱 된 윈도우 응용프로그램 외부로의 데이터 전송방법 | |
JP2018014139A (ja) | サーバシステム、クライアント装置及びプログラム |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20121031 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20130416 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20130613 |
|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20131015 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20131114 |
|
R150 | Certificate of patent or registration of utility model |
Ref document number: 5415918 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
RD02 | Notification of acceptance of power of attorney |
Free format text: JAPANESE INTERMEDIATE CODE: R3D02 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
S533 | Written request for registration of change of name |
Free format text: JAPANESE INTERMEDIATE CODE: R313533 |
|
R350 | Written notification of registration of transfer |
Free format text: JAPANESE INTERMEDIATE CODE: R350 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |