VSS Forgery Against Bad Broadcast Channels
Verifiable Secret Sharing (VSS) is a method of secret sharing where extra information is included alongside the secret shares that allows each player to verify the share they received is consistent with the others. In other words, the share is valid and can be combined with others to deterministically reconstruct the shared secret.
VSS is commonly used in multi-party computation protocols to perform a distributed key generation (DKG) where no party learns the secret but they can still perform computations with it. These are of particular interest now as the blockchain space has taken a lot of interest in using threshold signatures to secure private keys and starting to deploy these in practice.
One key assumption made for the security of VSS is the existence and usage of a “broadcast channel” to share the proof with all parties. A broadcast channel is a communication channel which any party can send a message on, and every other party is able to receive the message in an unmodified form.
This post describes an attack that allows an adversary to forge VSS proofs for any public key without knowledge of the discrete log. It only works in systems where broadcast channels are not implemented correctly.
Forging the proof
We will use Shamir’s Secret Sharing with the Feldman VSS for this forgery.
Our adversary is tasked with creating a proof for some provided
The adversary constructs the proofs as follows:
- A sharing polynomial with random coefficients is created,
, but we do not include the first two coefficients as we normally would. - Shares for each participant are created:
- Commitments to each coefficient are created:
- For each participant
a separate is created for each proof:
Verification of the VSS for each participant
The resulting set of proofs convince the participants that their shares are legitimate shares of the
discrete log of
It’s easy to see why this does not work when a broadcast channel is in place, because each proof is specific to a participant, all but that participant would reject the proof as invalid.
While this attack only works against flawed implementations, this seems to be an interesting result which may be useful in other circumstances.
A variant of the attack
You may notice that the cancellation is likely detectable during verification by checking that all unique combinations of the commitments sum to zero. This may work for the specific attack outlined above, but there are likely other forms of similar attacks that would bypass explicit checks.
Here is another variant that requires knowledge of
The adversary constructs the proofs as follows:
- A sharing polynomial with random coefficients is created where we exclude the second coefficient
. - Shares are created:
- Commitments are created:
- Choose a random value
and set . - For each participant
a separate is created for each proof:
Verification for each participant