The basic disrupter attack against our scheme is to attempt to block restoration of as many machines as possible by controlling enough of their partners: any machine which has more than attacker machines as partners will believe its backups succeed, but come restoration time will find that it is unable to recover its data because the attacker machines refuse to cooperate.
In order to attack a large number of machines (presumedly for publicity) this way, the attacker will have to swap disk space with thousands of machines. The disk storage to do this directly, however, is beyond the budget of any likely attacker. However, by using a man-in-the-middle attack, a smart attacker can appear to be storing data for thousands of machines without using any local disk space. He simply steps between pairs of partners (see Section 2.1) and passes blocks back and forth, leaving each original partner to believe the attacker is backing up its data, when in fact they are still storing each other's data. If the attacker encrypts data going one way and decrypts data going the other way, he can ensure that when he bows out the stored data will be useless to the original partners.
We can prevent such man-in-the-middle attacks by changing our block-access protocols slightly. Intuitively, the idea is to provide only the following read operation: read a completely-random block. Unlike the normal read-specified-block operation, this operation cannot be passed through: if does a random read (say block is chosen) of , there is no way for to read block from efficiently because each random read he does has only a chance of returning block . On average must read blocks to fulfill each random-read request of . This means that a small number of challenges by will quickly force to exhaust his read quota with (see Section 3.2.3), leaving him unable to answer all of the challenges.
This restriction, of course, must be lifted while a restoration is in progress and may be lifted systemwide periodically so that cleaners can run efficiently. Figure 4 shows one way to formalize the random-read operation into a protocol. Steps 1-5 here, modulo the inclusion of 's name in the commitment, are a standard variant of the flipping-coins-by-telephone protocol [2]; step 6 returns the resulting chosen block, the one at offset xor .
We include 's name--either 's current IP address, or if that is spoofable, a public key--in the commitment in step 2 to prevent the random-number-choosing protocol itself from being passed through: If simply passes the commitment along to , he will be caught after he reveals the commitment in step 5 and sees that it does not have 's name in it. He is prevented from fixing up the commitment to have his name while still containing by the non-malleability of the commitment scheme [9]. Because he is unable to pass through the choice of , he is unable to trick and into agreeing on the same random number.