このアイテムの全体的なポイントを理解していますが、ハッカーが可変期間オブジェクトの内部参照をどのくらい正確に取得するかを深く理解することに興味があります。彼はこれらの参照を介して内部の日付フィールドを破壊するので、彼がこれらの参照をどの程度正確に保持するのかを理解することが重要です。私は例とコードを読んで再読しましたが、この微妙な点を得ることはできませんでした。有効なJava項目76:シリアライゼーションとセキュリティ - ハッカーが不変期間オブジェクトの内部日付フィールドへの参照を正確に取得する方法を教えてください。
ブロッホは言う:
有効期間のインスタンスで始まり、その後の期間に内部のプライベート日付フィールドに 余分な参照を追加し バイトストリームを製造することによって変更可能な期間のインスタンスを作成することが可能です インスタンス。攻撃者はObjectInput- ストリームからPeriodインスタンスを読み取り、 に追加された「不正なオブジェクト参照」をストリームに読み込みます。これらの参照は、攻撃者が オブジェクト内のプライベートDateフィールドによって参照されるオブジェクト にアクセスできるようにします。これらの日付インスタンスを変更することにより、攻撃者は 期間インスタンスを突然変異させることができます。次のクラスは、この攻撃を示しています。
public class MutablePeriod { // A period instance public final Period period; // period's start field, to which we shouldn't have access public final Date start; // period's end field, to which we shouldn't have access public final Date end; public MutablePeriod() { try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(bos); // Serialize a valid Period instance out.writeObject(new Period(new Date(), new Date())); /* * Append rogue "previous object refs" for internal * Date fields in Period. For details, see "Java * Object Serialization Specification," Section 6.4. */ byte[] ref = { 0x71, 0, 0x7e, 0, 5 }; // Ref #5 bos.write(ref); // The start field ref[4]=4; //Ref#4 bos.write(ref); // The end field // Deserialize Period and "stolen" Date references ObjectInputStream in = new ObjectInputStream( new ByteArrayInputStream(bos.toByteArray())); period = (Period) in.readObject(); start = (Date) in.readObject(); end = (Date) in.readObject(); } catch (Exception e) { throw new AssertionError(e); } } }
ここで、この部分で何が起こっていますか?
/*
* Append rogue "previous object refs" for internal
* Date fields in Period. For details, see "Java
* Object Serialization Specification," Section 6.4.
*/
byte[] ref = { 0x71, 0, 0x7e, 0, 5 }; // Ref #5
bos.write(ref); // The start field
ref[4]=4; //Ref#4
bos.write(ref); // The end field
また、ハッカーがどのようにリファレンスを取得するのに役立ちますか?
コードの後半start = (Date) in.readObject();
は、作成された期間オブジェクトの内部参照をどのようにして得ますか?