3

以下代码应该容易受到 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 开始运行时,它不会再次通过检查(并失败)吗?

4

1 回答 1

9

问题是它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=> 你的类不变量不再有效
于 2014-01-04T18:02:17.850 回答