2016-08-26 1 views
2

このアイテムの全体的なポイントを理解していますが、ハッカーが可変期間オブジェクトの内部参照をどのくらい正確に取得するかを深く理解することに興味があります。彼はこれらの参照を介して内部の日付フィールドを破壊するので、彼がこれらの参照をどの程度正確に保持するのかを理解することが重要です。私は例とコードを読んで再読しましたが、この微妙な点を得ることはできませんでした。有効な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();は、作成された期間オブジェクトの内部参照をどのようにして得ますか?

答えて

0

ハッカーはストリームを作成したことを利用して、レイアウトを知っています。

特に、ハッカーは、ストリームに書き込まれた5番目のオブジェクトがPeriod.startによって参照されるDateオブジェクトであり、4番目のオブジェクトがPeriod.endによって参照されるDateオブジェクトであることを認識します。

Javaシリアル化は、独自の目的で、ストリームに「参照」を配置することを許可します。それ以外の場合、同じオブジェクトを指す2つのオブジェクトを直列化することは不可能です。

これらの「参照」をストリームに挿入すると(第4オブジェクトと第5オブジェクトの参照)、ハッカーは期間が保持する日付のインスタンスにアクセスします。

しかし、ハッカーがこれらのインスタンスを突然変異させる方法についてはわかりません。

関連する問題