次のコードは、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 が実行を開始するとき、再びチェックを通過する (そして失敗する) ことはありませんか??