TOCTOU的竞争条件如何运作?

时间:2014-01-04 17:57:45

标签: java multithreading security race-condition secure-coding

以下代码应该容易受到TOCTOU攻击:

 public Period(final Date start, final Date end) {
    if (start.compare(end) > 0) {
       throw new IllegalArgumentException("");
    }

    this.start = start;
    this.end = end;      // Class period has 2 private final member 
                         // variables Date start & end.

 }

我无法理解的是,这种竞争条件将如何运作?假设有2个线程T1和T2,其中T1有一组有效的参数,应该通过检查,T2是一个想要在类中设置无效值的黑客。

如果2个线程正在竞争并且这段代码是我们的关键部分,则说T1运行通过检查并休眠。现在,当T2开始运行时,它是否会再次通过检查(并且失败)?

1 个答案:

答案 0 :(得分:7)

问题是Date是可变的,所以另一个线程可以在检查end.setTime(0);后更改结束日期:start.after(end)(更容易编写条件)。

所以它看起来像:

  • T1:start.after(end) =>返回false,一切看起来都不错
  • T2:end.setTime(0); =>偷偷摸摸的线程2更改日期
  • T1:this.start = start; this.end = end; //boom =>你的班级不变不再有效