2016-08-26 9 views
2

Хотя я понимаю общую точку зрения этого пункта, я заинтересован в глубоком понимании того, как именно хакер получает внутренние ссылки изменяемого объекта Period. Он развращает внутренние поля Даты через эти ссылки, поэтому важно понять, как именно он получает эти ссылки. Я прочитал и перечитал пример и код, но не смог получить эту тонкую точку.Эффективная Java-статья 76: Сериализация и безопасность. Как именно хакер получает ссылки на внутренние поля даты неизменяемого объекта Period?

Блохи говорят:

Можно создать изменяемый период экземпляра изготовляя поток в байт, который начинается с действительным экземпляром Period, а затем присоединяет дополнительных ссылки на частные поля раздела внутренних на период экземпляр. Атакующий считывает экземпляр Period из потока ObjectInput- и затем считывает «ссылки на объекты-изгои», которые были добавлены в поток потоком . Эти ссылки дают злоумышленнику доступ к объектам , на которые ссылаются частные поля Даты в течение периода . Мутируя эти экземпляры 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(); дать ему внутренние ссылки созданного объекта Period?

ответ

0

Хакер использует тот факт, что он создал поток, поэтому он знает макет.

В частности, хакер знает, что 5-й объект, записанный в поток, является объектом Date, на который ссылается Period.start, а 4-й объект - объект Date, на который ссылается Period.end.

Java-сериализация для собственных целей позволяет размещать «ссылки» в потоке. В противном случае было бы невозможно сериализовать два объекта, указывающих на один и тот же объект.

Вставляя эти «ссылки» в поток (ссылки на 4-й и 5-й объекты), хакер получает доступ к экземплярам даты, удерживаемой периодом.

Я не уверен, как хакер будет мутировать эти экземпляры.