(57)【要約】【課題】悪意のある外部モジュールからのアクセスから重要なキャッシュデータを保護できるようにする。【解決手段】オペレーティングシステムにキャッシュ機構を備えた情報処理装置であって、キャッシュバッファを前記オペレーティングシステムの管理外のメモリ領域から割り当てる割当手段を備え、オペレーティングシステムの管理外のメモリ領域の割り当てを、システムの起動引数を用いて通知する通知手段をさらに備えるようにして、悪意のある外部モジュールからのキャッシュデータを使った情報流出を防ぐことができるようにする。【選択図】図４
2011053786.tif 000002
【特許請求の範囲】
【請求項１】
オペレーティングシステムにキャッシュ機構を備えた情報処理装置であって、
キャッシュバッファを前記オペレーティングシステムの管理外のメモリ領域から割り当てる割当手段を備えたことを特徴とする情報処理装置。
【請求項２】
前記割当手段による前記オペレーティングシステムの管理外のメモリ領域の割り当てを、システムの起動引数を用いて通知する通知手段をさらに備えたことを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記割当手段により前記オペレーティングシステムの管理外のメモリ領域の割り当てを、乱数を用いて指定する指定手段をさらに備えたことを特徴とする請求項１に記載の情報処理装置。
【請求項４】
前記オペレーティングシステムの管理外のメモリ領域の位置情報を暗号化して保持し、前記位置情報を登録されたモジュールに返却する返却手段をさらに備えたことを特徴とする請求項１に記載の情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は情報処理装置に関し、特に、機密性の高いデータを保持するために用いて好適な技術に関する。
【背景技術】
【０００２】
外部デバイスの多くは、搭載されている物理メモリと比べてアクセススピードが非常に遅い。そこで、この問題に対処するため、多くのオペレーティングシステム（ＯＳ）では、物理メモリを利用した「キャッシュ」機能を搭載し、デバイスのアクセススピードを向上させている。この様なシステムでは、外部デバイスに記憶されているデータと同じものが、長時間メインメモリ内に滞留する。そのため、悪意のあるプログラムによりバッファーオーバーフローなどの手段を用いて重要なデータが盗み出されることがある。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２００５−２８４３８３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
重要な内部データに自由にアクセスできるのはＯＳだけであり、第三者はＯＳ自体を通常書き換えることは不可能である。さらには、ＯＳと同じ実行権を持ち、重要なデータを盗み出すことが可能なプログラムを記述することは事実上、不可能である。そのため、従来は多くの場合、悪意のあるプログラムがＯＳにあるセキュリティーホールを悪用することにより、システム内の情報を盗んでいた。つまり、システム管理者は、ＯＳのセキュリティーホールの修正を正しく行っていれば、ある程度の被害を未然に防ぐことが可能であった。
【０００５】
ところが近年、Linuxを始めとするオープンソース由来のＯＳが幅広く普及してきている。これらのＯＳは、デバイスドライバなどの外部モジュールを動的にＯＳにリンクすることが可能であり、リンクされたデバイスドライバはＯＳと同じ権限で実行することができる。この外部モジュールは第三者によって作成することも可能なため、さまざまなＯＳの機能拡張実現に活用されている。このような外部モジュールは機能拡張には非常に有用である反面、セキュリティー面から見ると非常に危険な存在である。
【０００６】
特にキャッシュは、ＯＳが管理しているメインメモリ上に構築されているためアクセスも簡単であり、メインメモリには数多くの重要なデータが保持されている。キャッシュを用いれば悪意のある外部モジュールの作成者は、ＯＳ内部の複雑な管理機構を解析し、データを盗み出すための特別なプログラムコードを記述する必要がなく、簡単にキャッシュデータから重要なデータを盗み出すことが可能となってしまう。
【０００７】
本発明は前述の問題点に鑑み、悪意のある外部モジュールからのアクセスから重要なキャッシュデータを保護できるようにすることを目的としている。
【課題を解決するための手段】
【０００８】
本発明の情報処理装置は、オペレーティングシステムにキャッシュ機構を備えた情報処理装置であって、キャッシュバッファを前記オペレーティングシステムの管理外のメモリ領域から割り当てる割当手段を備えたことを特徴とする。
【発明の効果】
【０００９】
本発明によれば、機密情報を保護しつつキャッシュを使った高速なデータアクセスを実現することができる。
【図面の簡単な説明】
【００１０】
【図１】実施形態における情報処理装置のハード構成例を示すブロック図である。
【図２】ＯＳ側から見たメインメモリの構成例を示す図である。
【図３】通常のキャッシュ機構の動作の一例を示す図である。
【図４】実施形態におけるキャッシュ機能の動作の一例を示す図である。
【図５】システムを初期化する手順の一例を示すフローチャートである。
【図６】キャッシュ位置初期化処理の手順の一例を示すフローチャートである。
【図７】機密判別処理の手順の一例を示すフローチャートである。
【図８】ＯＳ管理外キャッシュ処理の手順の一例を示すフローチャートである。
【図９】キャッシュ位置返却処理の手順の一例を示すフローチャートである。
【発明を実施するための形態】
【００１１】
（第１の実施形態）
以下、本発明の実施形態について図面を参照しながら説明する。
図１は、本実施形態における情報処理装置１０のハード構成例を示すブロック図である。
図１において、ＣＰＵ１１は、情報処理装置１０全体を管理するためのものであり、メインメモリ１２にアクセスすることが可能である。また、情報処理装置１０には、アクセススピードの遅い外部デバイス１３が接続されており、一度アクセスしたデータはメインメモリ１２にキャッシュされ、二回目以降のアクセス時にはメインメモリ１２を参照することによりデータアクセスを高速にしている。
【００１２】
図２は、オペレーティングシステム（ＯＳ）側から見たメインメモリ１２の構成例を示す図である。本実施形態では、搭載メモリとして５１２ＭＢの物理メモリを搭載しているシステムを前提に説明する。また、本実施形態では、ＯＳは物理メモリの先頭に配置されるものとする。なお、システムによっては物理メモリの最後方にＯＳが置かれる場合もあるが、ＯＳの位置に限定されるものではない。通常、ＯＳはシステムに搭載された物理メモリを全て自身の管理下に置かれる。管理下に置くということにより、自身のメモリ管理機構がそのメモリ空間を認識し、かつその空間を様々な用途に使用できるように、使用履歴を管理することができる。
【００１３】
ここで、図２（ａ）は、ＯＳが全てのメモリ領域を認識させた場合のメモリ空間の一例を示す図である。これに対して図２（ｂ）は、本実施形態において、ＯＳの認識するメモリ空間の一例を示す図である。本実施形態では、５１２ＭＢある物理メモリのうち４４８ＭＢをＯＳに認識させ、残りの６４ＭＢはＯＳの管理外の領域を設けている。このようにすることにより、ＯＳは搭載物理メモリ全てを認識せず、一部のメモリ領域だけを用いて動作する。したがって、メモリ管理機構はＯＳ管理外メモリ領域を使用することはない。
【００１４】
キャッシュバッファ２１は、ＯＳが自身のメモリ管理領域内を使って実現する外部デバイス１３のデータをプールする空間である。キャッシュ機構はメモリ管理機構からＯＳが認識するメモリ空間を割当ててもらい、このキャッシュバッファ２１を構築する。なお、悪意のある外部モジュールはＯＳと同じ特権レベルで動作し、ＯＳが管理している情報に全てアクセスできるため、キャッシュバッファ２１がＯＳの認識する空間内にある限り、悪意のある外部モジュールからのアクセスに晒される危険がある。
【００１５】
そこで、本実施形態では、図２（ｂ）に示すように、メモリ空間内にキャッシュバッファ２２を設け、ＯＳ管理外メモリ領域に確保した外部デバイス１３のデータをプールする空間を設けている。この空間は、ＯＳのメモリ管理機構から割当ててもらうものではなく、この空間の位置は起動時に決定される。この様に、ＯＳの管理外の空間にキャッシュバッファを確保することにより、悪意のある外部のモジュールは通常のＯＳ機能を使ってこのキャッシュバッファにアクセスすることが不可能になる。
【００１６】
図３は、通常のキャッシュ機構の動作の一例を示す図である。例としてAP-aというアプリケーションプログラムが、外部デバイスにあるデータ３２を読み出す処理の流れについて説明する。
まず、AP-a３１はread要求をＯＳに対して発行する（処理３０１）。次に、ＯＳは自身の機能である仮想ファイルマネージャ３３の中でアプリケーションからの要求を処理する。そして、仮想ファイルマネージャ３３はキャッシュ機構３４に対して、データ３２を要求する（処理３０２）。
【００１７】
次に、キャッシュ機構３４は、自身の管理するキャッシュバッファ２１を調べ、既にデータ３２が存在すればそれを仮想ファイルマネージャ３３に返却する（処理３０６）。この場合、仮想ファイルマネージャ３３はキャッシュ機構３４がキャッシュされていたデータ３２を返却してくれば、それをそのままAP-a３１に返却して終了する（処理３０７）。一方、キャッシュバッファ２１にデータ３２がない場合は、キャッシュ機構３４はドライバに対してデータ３２の読み出しを要求する。この時ドライバが転送するバッファはキャッシュバッファ２１の領域になるようにする（処理３０３）。
【００１８】
ドライバはキャッシュ機構からの要求に従い、デバイスからデータ３２を読み出す（処理３０４）。そして、読み出したデータ３２を指定されたキャッシュバッファ２１の領域に転送する（処理３０５）。キャッシュ機構３４はドライバによるデータ３２のread処理が終了すると、転送されたキャッシュバッファ２１から要求されたデータ３２を仮想ファイルマネージャ３３に返却する（処理３０６）。そして、仮想ファイルマネージャ３３はキャッシュされていたときと同様に、読み出されたデータ３２をAP-a３１に返却して終了する（処理３０７）。この様にすることにより、データ３２はキャッシュバッファ２１内に蓄えられることになり、２回目以降はデータ３２へのアクセスが高速化する。
【００１９】
図４は、本実施形態におけるキャッシュ機能の動作の一例を示す図である。例としてAP-bというアプリケーションプログラムが、外部デバイス１３にあるデータ４３を読み出す処理の流れについて説明する。
まず、AP-b４１はread要求をＯＳに対して発行する（処理４０１）。すると、ＯＳは自身の機能である仮想ファイルマネージャ４５の中でアプリケーションからの要求を処理する。仮想ファイルマネージャ４５は機密判別処理４２でデータ４３が重要なデータであるかどうか判別する。この判別はAP-b４１によるオープン属性か、またはデータ４３のデータ属性に機密データフラグが立っているかで判断する。この判別の結果、データ４３が通常のデータであった場合は、標準のキャッシュ機構を使用するため、キャッシュ機構４６に処理を依頼する。この動作は、図３と同様であるため、説明は省略する。
【００２０】
一方、判別の結果、機密データであった場合は通常のキャッシュ機構を使わないようにする。したがって、ＯＳ管理外メモリ領域に確保したキャッシュバッファ２２を用いてキャッシュ処理を行う（処理４０２）。仮想ファイルマネージャ４５から要求を受けたＯＳ管理外キャッシュ機構４４は、ＯＳ管理外の領域から確保したキャッシュバッファ２２を調べ、データ４３が既にキャッシュされているか調査する。キャッシュされていた場合は、仮想ファイルマネージャ４５にキャッシュ済みのデータを返却する（処理４０６）。
【００２１】
一方、キャッシュバッファ２２にデータ４３が無い場合は、ＯＳ管理外キャッシュ機構４４はドライバに対してデータ４３の読み出しを要求する。この時、ドライバが転送するバッファはキャッシュバッファ２２の領域になるようにする（処理４０３）。ドライバはＯＳ管理外キャッシュ機構４４からの要求に従い、デバイスからデータ４３を読み出す（処理４０４）。そして、読み出したデータ４３を指定されたキャッシュバッファ２２の領域に転送する（処理４０５）。ＯＳ管理外キャッシュ機構４４は、ドライバによるデータ４３のread処理が終了すると、転送されたキャッシュバッファ２２から要求されたデータ４３を仮想ファイルマネージャ４５に返却する（処理４０６）。そして、仮想ファイルマネージャ４５は、キャッシュされていたときと同様に、読み出されたデータ４３をAP-b４１に返却して終了する（処理４０７）。
【００２２】
以上のような手順で行うことにより、データ４３はキャッシュバッファ２２内に蓄えられることになり、２回目以降はデータ４３へのアクセスが高速化する。また、キャッシュされているデータ４３はＯＳ管理外の領域にあるため、通常のメモリ管理機構からはアクセスすることができない。さらに、通常のキャッシュ機構からも管理されない。このため、たとえＯＳと同じ権限をもつ悪意のある外部モジュールを使ったとしても、データの読み取りは非常に困難になる。
【００２３】
図５は、ＯＳ管理外キャッシュ機構をもつシステムを初期化する手順の一例を示すフローチャートである。ＯＳ管理外キャッシュ処理を用いる場合は、ＯＳが認識するメモリサイズの指定（本実施形態ではmem＝４４８ＭＢ）が必須である。また、管理外のバッファ位置を固定するならキャッシュバッファ２２のアドレス情報（本実施形態ではout＿addr＝0x1D00,0000）が必要である。管理外のバッファ位置をランダムにする場合は、ランダム指定を用いることを宣言（out＿cache＿rand）する必要がある。これらの情報はシステムの起動引数として引き渡される物とする。以下、ステップＳ５０１〜Ｓ５０９の処理の詳細について説明する。なお、図５に示す各処理は、ＣＰＵ１１の制御により行われる。
【００２４】
まず、ステップＳ５０１において、起動引数にmem指定があるか否かをチェックする。このチェックの結果、mem指定がある場合は、ＯＳが認識するメモリ量が制限される。この場合、ステップＳ５０２に進み、内部変数ramに指定されたＲＡＭサイズをコピーする。一方、ステップＳ５０１のチェックの結果、mem指定がない場合は、ＯＳはシステムに搭載されている物理メモリ全てを利用する。よってこの場合はステップＳ５０３に進む。そして、ステップＳ５０３において、ＤＲＡＭコントローラにアクセスし、搭載物理メモリ量を計測する。計測されたメモリ量は内部変数ramに保持する。
【００２５】
次に、ステップＳ５０４において、ＯＳのメモリ管理機構を初期化する処理を行う。このメモリ管理初期化処理にはＯＳが認識するＲＡＭ量を通知する。メモリ管理初期化処理では、ＯＳが空きメモリを管理するための構造の初期化や、仮想記憶を使用するＯＳであれば認識するＲＡＭに対応するページテーブルの構築などを行う。いずれにしろ、起動引数でＯＳが認識するＲＡＭの量を制限した場合、残りの物理メモリの領域はメモリ管理機構からは認識されない領域になる。
【００２６】
次に、ステップＳ５０５において、ＯＳ管理外キャッシュ機構を利用するか否かを判別する。具体的には、起動引数にout＿cacheかout＿cache＿randの指定があるか否かを判別する。この判別の結果、いずれの指定も無い場合は、ＯＳ管理外キャッシュ機構は使用しないと判別できるので、初期化処理を終了する。一方、ステップＳ５０５の判別の結果、何れか一方の指定がある場合は、ステップＳ５０６において、起動引数にmem指定があるか否かを判別する。ＯＳ管理外キャッシュ機構はＯＳ管理外メモリ領域の存在が不可欠であるため、この判別の結果、ＯＳ管理外キャッシュ機構を使用するにもかかわらず、ＯＳ管理外メモリ領域のmem指定が無い場合は、エラー終了する。
【００２７】
一方、ステップＳ５０６の判別の結果、mem指定がある場合は、ステップＳ５０７において、out＿cache指定があるか否かをチェックする。このチェックの結果、out＿cache指定がある場合は、キャッシュバッファ２２の指定があるので、ステップＳ５０８において、内部変数ramにout＿cacheの値（本実施形態では0x1D00,0000）をコピーする。
【００２８】
一方、ステップＳ５０７のチェックの結果、out＿cache指定がない場合は、ランダム指定となる。この場合はステップＳ５０９に進み、ランダム指定されたアドレス位置を算出する。このとき、ベースとなるアドレスは起動引数で指定されたＯＳ管理外メモリ領域の先頭である。本実施形態では４４８ＭＢがＯＳ管理メモリ領域なのでmem＝４４８ＭＢが渡される。よってベースとなるアドレスは448*1024*1024＝0x1C00,0000である。ランダム指定では、このベースアドレスに（０〜９の乱数×ブロックサイズ）を加えてキャッシュバッファ２２の位置を決定する。ブロックサイズは任意であるが、小さすぎても意味が無く、大きすぎるとメモリの容量が無駄になる。よって１ＭＢぐらいが妥当であると考えられるが、この値は任意に選択できるものとする。そして、決定したキャッシュバッファ２２の位置を内部変数ramにコピーする。
【００２９】
次に、ステップＳ５１０において、ステップＳ５０８もしくはステップＳ５０９で決定したキャッシュバッファ２２の位置を保存する。この位置を保存するため、変数ramを引数にして後述するキャッシュ位置初期化処理を行う。そして、処理を終了する。
【００３０】
図６は、キャッシュ位置初期化処理の手順の一例を示すフローチャートである。キャッシュ位置初期化処理は、システム初期化処理によって行われる処理である。時引数としてキャッシュバッファ２２の物理メモリ位置が引き渡される。以下、図６の処理について説明する。
ステップＳ６０１において、引数で渡されたキャッシュバッファ２２の物理メモリ位置情報を暗号化する。そして、暗号化したキャッシュバッファ２２の物理メモリ位置情報を変数out＿cache＿addrに保存する。暗号化のアルゴリズムは特に限定しないが、これにより悪意のある外部モジュールが、out＿cache＿addrにアクセスしたとしてもキャッシュバッファ２２の位置を知ることは不可能になる。
【００３１】
図７は、仮想ファイルマネージャ４５により行われる機密判別処理の手順の一例を示すフローチャートである。以下、ステップＳ７０１〜Ｓ７０４について説明する。
【００３２】
まず、ステップＳ７０１において、ユーザプログラムからのファイルアクセスが、機密データへのアクセスであるかを判別するために、オープン属性に機密フラグが立っているか否かを判別する。この判別の結果、機密フラグが立っている場合は、ＯＳ管理外キャッシュ機構を使ったデータアクセスを行うため、ステップＳ７０４に進む。
【００３３】
一方、ステップＳ７０１の判別の結果、機密フラグが立っていない場合は、ステップＳ７０２において、ファイル属性に機密フラグが立っているか否かを判別する。この判別の結果、機密フラグがたっていない場合は、通常のデータアクセスと判断されるので、ステップＳ７０３に進み、通常のキャッシュ機構に処理を依頼する。一方、ステップＳ７０２の判別の結果、機密フラグが立っている場合は、ＯＳ管理外キャッシュ機構を用いたデータアクセスを行うため、ステップＳ７０４に進み、ＯＳ管理外キャッシュ処理を実行する。
【００３４】
図８は、ＯＳ管理外キャッシュ処理の手順の一例を示すフローチャートである。以下、ステップＳ８０１〜Ｓ８０５について説明する。
まず、ステップＳ８０１において、キャッシュバッファ２２の位置を知るため、キャッシュ位置返却処理を行う。キャッシュ位置返却処理は外部モジュールからの呼び出しにはエラーを返却するが、この管理外キャッシュ処理には正しいキャッシュバッファ２２の位置を返却する。そして、得られたアドレスを内部変数cache＿addrに保持する。なお、このキャッシュ位置返却処理の詳細については、図９の説明において後述する。
【００３５】
次に、ステップＳ８０２において、キャッシュバッファ位置決定処理を行う。キャッシュバッファ位置決定処理は、引数として渡されたキャッシュバッファ２２のアドレスと、アクセスする外部デバイスの情報、及びアプリケーションがアクセスする機密データの位置情報などを元に、キャッシュバッファ内で使用する位置を決定する。この処理で決定したキャッシュバッファ内の位置を変数bufに保持する。この位置決定アルゴリズムは、外部デバイスの種類やアクセス手段によって変化する。例えばＨＤＤのようなブロックデバイスなどの場合、セクタ位置やブロック番号を元に決定する。また、本実施形態では、キャッシュバッファ内の位置決定アルゴリズムについては何でもよいため、詳細な説明は省略する。
【００３６】
次に、ステップＳ８０３において、ステップＳ８０２で決定した変数bufを調べ、キャッシュバッファ２２にすでに必要とする機密データが保持されているか否かを判別する。この判別の結果、既にキャッシュ済みである場合は、ステップＳ８０５に進み、bufの内容を仮想ファイルマネージャ４５に返却し、処理を終了する。一方、ステップＳ８０３の判別の結果、キャッシュされていない場合は、ステップＳ８０４に進む。
【００３７】
ステップＳ８０４において、ドライバに対して、目的とする機密データの読み出しを依頼する。このとき、読み出した結果を保存するアドレスは、ステップＳ８０２で決定したbufである。ドライバに処理を依頼した後、データ転送が終了するまでスリープし、データ転送が終了すると、デバイスドライバの割り込みハンドラから転送終了割り込みによって起床させられる。そして、前述したようにステップＳ８０５では、bufに入っている機密データを仮想ファイルマネージャ４５に返却し、処理を終了する。
【００３８】
図９は、キャッシュ位置返却処理の手順の一例を示すフローチャートである。この処理はＯＳ管理外キャッシュ処理によってのみ行われるものである。以下、ステップＳ９０１〜Ｓ９０２について説明する。
まず、ステップＳ９０１において、この処理の呼び出し元をチェックする。このチェックの結果、ＯＳ管理外キャッシュ処理以外から呼び出された場合は、何も処理せずエラーリターンとする。これにより悪意のある外部デバイスからのキャッシュバッファ２２へのアクセスを防ぐ。一方、ステップＳ９０１のチェックの結果、ＯＳ管理外キャッシュ処理からの呼び出しである場合は、ステップＳ９０２に進む。そして、ステップＳ９０２において、変数out＿cache＿addrに保持されている暗号化されたアドレス情報を復号化し、実際にアクセスできるアドレス情報にして返却する。
【００３９】
本実施形態では、機密性が高いデータに関するキャッシュを通常のキャッシュ領域には取り込まない。機密性が高いかどうかの判断は、オープン時のフラグか、ファイル属性フラグによって判断する。機密性が高いデータへのアクセスの場合は、そのデータはＯＳ管理外のメモリ空間に保持する。通常のキャッシュ機構及びメモリ管理機構は、このメモリ空間を認識しないので、悪意のある外部モジュールがキャッシュ機構を使ってキャッシュされたデータにアクセスしようとしても失敗する。
【００４０】
また、本実施形態によれば、この特別なキャッシュバッファ領域の指定も外部から分かりにくくしている。一つ目の指定方法としては、システムの起動引数として通知する方法である。この方法ではキャッシュバッファの位置は起動引数として引き渡されるため、オープンソースプログラムコードに含まれない。よって公開されるＯＳのプログラムコードをすべて解析されたとしても、そのアドレスが漏れる恐れが少なくなる。そして、二つ目の指定方法としては、キャッシュバッファの領域をランダムに決定する。これにより、キャッシュバッファの位置をシステムが起動するごとに変えることが可能になり、悪意のある外部モジュールからの参照をさらに難しくする。
【００４１】
以上のようにして指定されたキャッシュバッファの位置は保護機構によって保持される。この保護機構は、キャッシュバッファ位置情報を要求するモジュールをチェックする。チェック内容は、事前に登録済みのモジュールだけを正常な要求として判断する。つまり、後からシステムに追加される外部モジュールは登録されていないので、キャッシュバッファ位置情報を得ることはできない。以上のような構成により、機密性の高いデータを扱う時はアクセスしにくい特別なキャッシュ領域を使うことが可能になるので、悪意のある外部モジュールからのキャッシュデータを使った情報流出を防ぐことが可能となる。
【００４２】
（その他の実施形態）
また、本発明は、以下の処理を実行することによっても実現される。即ち、上述した実施形態の機能を実現するソフトウェア（プログラム）を、ネットワーク又は各種記憶媒体を介してシステム或いは装置に供給し、そのシステム或いは装置のコンピュータ（またはＣＰＵやＭＰＵ等）がプログラムを読み出して実行する処理である。
【符号の説明】
【００４３】
１１  ＣＰＵ、１２  メインメモリ
【図１】
2011053786.tif 000003
【図２】
2011053786.tif 000004
【図３】
2011053786.tif 000005
【図４】
2011053786.tif 000006
【図５】
2011053786.tif 000007
【図６】
2011053786.tif 000008
【図７】
2011053786.tif 000009
【図８】
2011053786.tif 000010
【図９】
2011053786.tif 000011