有效的Java项目76:序列化和安全性 - 黑客如何准确获取对不可变Period对象的内部Date字段的引用?



虽然我理解了这一点,但我有兴趣深入了解黑客究竟是如何获得可变Period对象的内部引用的。他通过这些引用破坏了内部Date字段,因此了解他是如何确切地获得这些引用是很重要的。我已经读了一遍又一遍的例子和代码,但不能得到这个微妙的点。

布洛赫说:

可以创建一个可变的Period实例以有效的Period实例开始然后追加的字节流对Period内部私有Date字段的额外引用实例。攻击者从ObjectInput-中读取Period实例流,然后读取附加的"非法对象引用"去小溪。这些引用使攻击者能够访问由周期内的私有Date字段引用的对象对象。通过改变这些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对象的内部引用?

黑客利用了他创建流的事实,所以他知道布局。

特别是,黑客知道写入流的第5个对象是Period引用的Date对象。第四个对象是Period.end. 引用的Date对象。

Java序列化,出于自身的目的,允许将"引用"放入流中。否则,就不可能序列化指向同一对象的两个对象。

通过在流中插入这些"引用"(对第4和第5个对象的引用),黑客获得了对Period持有的Date实例的访问权。

我不确定黑客会如何去改变这些实例。

相关内容

  • 没有找到相关文章

最新更新