[目次] [前項目] [次項目]

オブジェクト直列化におけるセキュリティ


トピック:

概要

オブジェクト直列化システムを使えば、オブジェクトグラフからバイトストリームを作成し、(ディスクに保管するか、ネットワークを介して)Java 環境の外へ送り、それを使って、同じ状態をもつ前と同等な新しいオブジェクトセットを再作成することができます。

オブジェクトの状態がこの環境の外でどうなるかは、(定義により)Java システムの制御外のことであり、したがって、システムで提供されるセキュリティの制御外のことです。ここで疑問がわきます。それでは、オブジェクトが直列化された後、結果の配列を調べて、たとえば、ウィルスを Java プログラムに注入することが可能なのか。このセクションの目的は、このようなセキュリティの心配に応えることです。

設計目標

オブジェクト直列化の目標は、できる限りシンプルでありながら、知られているセキュリティの制約と一貫性があることです。システムがシンプルであるほど、安全である可能性はより高くなります。次のポイントは、オブジェクト直列化におけるセキュリティがどのように実装されているのかを要約したものです。

transient の使用による重要なシステムリソースの保護

ファイルハンドルなど、システムリソースに対する直接ハンドルは、アドレス空間に依存する種類の情報ですので、オブジェクトの持続性状態の一部として書き込むことはできません。したがって、このような情報をもつフィールドは、transient として宣言しなければなりません。そうすれば、それらが直列化されることはありません。これは、transient キーワードの新しい意味でも、重複した意味でもないことに注意してください。

ファイルハンドルのようなリソースが transient で宣言されていない場合は、オブジェクトが直列化状態にいる間に変更される可能性があり、それが直列化復元されたとき、リソースのアクセスが適切でない可能性があります。

クラス特有の直列化メソッドの作成

直列化復元されたオブジェクトが、保証されるべきある不変量のセットを壊す状態にならないよいうに、クラスがそれ独自の直列化と直列化復元のメソッドを定義することができます。あるクラスのデータメンバ間で維持する必要がある不変量のセットがある場合、これらの不変量について知り得るのはそのクラスだけですので、これらの不変量を検査する直列化復元メソッドを提供するかどうかは、そのクラスの作成者次第です。

このことは、セキュリティを心配していない場合でも重要です。ディスクファイルが壊れ、直列化データが無効になることも可能です。したがって、そのような不変量を検査することは、単にセキュリティのためだけではありません。これは有効性を確保する手段なのです。しかし、これを行うことができるのは、特定クラスのためのコードの中だけです。なぜなら、どの不変量を維持し、検査するかを直列化パッケージで判断する方法がないからです。

バイトストリームの暗号化

Java 仮想マシンの外でバイトストリームを保護する別の方法は、直列化パッケージで作成したストリームを暗号化することです。バイトストリームを暗号化すれば、直列化されたオブジェクトの private 状態をデコードされ、読み込まれることが防げます。

この実装では、直列化/直列化復元に対してクラスが特別な独自のメソッドをもつことができることと、直列化のためのストリーム抽象を使用することによって、暗号化が可能です。これにより、その出力を他のストリームやフィルタに組み込むことができます。



[目次] [前項目] [次項目]

Copyright (C) 1996, 1997 Sun Microsystems, Inc. All rights reserved.