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 に答える