Хотя я понимаю общую точку зрения этого пункта, я заинтересован в глубоком понимании того, как именно хакер получает внутренние ссылки изменяемого объекта 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?