Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Issue Report: Vulnerability in Shamir Secret Sharing Scheme Implementation #39

Open
K1LL3RC0D3 opened this issue Aug 10, 2024 · 3 comments

Comments

@K1LL3RC0D3
Copy link

Summary
A vulnerability has been identified in the Shamir Secret Sharing Scheme implementation. The reconstruction process yields plausible but incorrect results when shares are corrupted, indicating potential flaws in the system's error handling and validation.

Details
The implementation of the Shamir Secret Sharing Scheme should ideally produce nonsensical or clearly incorrect results when shares are manipulated. However, in the current implementation, corrupted shares can still generate results that appear plausible.

Key Observations

  • Reconstructed Secret from Corrupted Shares: Corrupted shares can yield results that are plausible secrets, despite being incorrect.

  • Potential Weakness: This suggests that the system may not be properly validating or handling corrupted shares.

Steps to Reproduce

  1. Review Reconstruction Code:

Verify that the reconstruction process is accurate and adheres to Shamir's Secret Sharing principles.

`from sympy import symbols, simplify

def reconstruct_secret(shares, threshold):
"""Reconstruct the secret from shares using Lagrange interpolation."""
x = symbols('x')
total_sum = 0
for i, (xi, yi) in enumerate(shares):
terms = [1]
for j, (xj, _) in enumerate(shares):
if i != j:
terms.append((x - xj) / (xi - xj))
term_product = 1
for term in terms:
term_product *= term
total_sum += yi * term_product
secret = simplify(total_sum.subs(x, 0))
return secret
`

  1. Validate with Corrupted Shares:

Test the reconstruction with shares that have been artificially corrupted.

`def is_valid_secret(secret):
"""Check if the reconstructed secret is valid."""
return isinstance(secret, int) and secret > 0

Example shares

shares = [(1, 1308), (2, 1458), (3, 1684), (4, 1986), (5, 2364)]
threshold = 3

Test reconstruction with all valid combinations

from itertools import combinations
for combo in combinations(shares, threshold):
reconstructed_secret = reconstruct_secret(combo, threshold)
print(f"Reconstructed secret from shares {combo}: {reconstructed_secret}")

Test with corrupted shares

corrupted_shares = [(xi, yi + 1000) for xi, yi in shares]
try:
reconstructed_secret = reconstruct_secret(corrupted_shares[:threshold], threshold)
if is_valid_secret(reconstructed_secret):
print("Reconstructed secret from corrupted shares:", reconstructed_secret)
else:
print("Reconstructed secret from corrupted shares is invalid:", reconstructed_secret)
except Exception as e:
print("Error with corrupted shares:", e)
`

Expected Behavior
In a secure implementation:

  • Corrupted shares should produce results that are clearly incorrect or nonsensical.

  • The system should ideally detect and handle errors from corrupted shares.

Actual Behavior
Corrupted shares can still produce plausible secrets, suggesting that the implementation may not effectively validate the integrity of the shares.

Impact
The ability to reconstruct plausible secrets from corrupted shares may expose vulnerabilities and indicate insufficient validation in the secret reconstruction process.

Recommendations

  • Review and Update Reconstruction Code: Ensure that the reconstruction process follows the correct principles and handles errors properly.

  • Enhance Error Handling: Implement mechanisms to detect and handle corrupted or invalid shares more effectively.

  • Document and Test Vulnerabilities: Develop additional test cases to explore various types of corruption and validate the system's robustness.

Please address this issue to improve the security and reliability of the Shamir Secret Sharing Scheme implementation.

@K1LL3RC0D3
Copy link
Author

i managed to find 7 words

do i get a bitcoin for this?

@K1LL3RC0D3
Copy link
Author

currently working on lattice-based attack to solve the challenge

@SmartArt09
Copy link

SmartArt09 commented Nov 22, 2024

i managed to find 7 words

do i get a bitcoin for this?

How do you know those are the correct words?

Also, I to have yet to find a share that is a valid mnemonic in itself. :)
I don't think shares can be "corrupted". The program generates new mnemonic shares (sometimes also with same indices if the total shares generated is closer to the max limit of 255) for the same original mnemonic every time the program is run. So, if you run the program, say 4 times with a 3 of 5 threshold scheme, combining any 3 of the total 20 shares (whether from individual runs or overall) may result in a valid combination for a different "original" mnemonic. Though, like you said, not every combination is valid either.

It's all just entropy being generated (with some modification for splitting and restoring) in each run of the program. So even if you change 1 or 2 words of a mnemonic share, it is either not going to combine successfully or combine to form a different mnemonic than the one you might be expecting.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants