Remove insecure Math.random() fallback - #70
Open
alexgleason wants to merge 1 commit into
Open
Conversation
The fallback existed because remote debugging in Chrome ran the JS bundle in the browser's V8, where synchronous native module calls are not supported. Remote debugging in Chrome was removed from React Native before 0.81, the minimum version this package supports, and the bridgeless check already made this path dead code on the new architecture. Removing it guarantees that crypto.getRandomValues can never silently return predictable values from Math.random(), which is the correct failure mode for code generating key material. If the native module is unavailable, TurboModuleRegistry.getEnforcing throws instead.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
The
Math.random()fallback existed because the old "Debug JS Remotely" mode ran the JS bundle in desktop Chrome's V8, where synchronous native module calls are impossible (nativeCallSyncHookis undefined), so callinggetRandomBase64would throw. The fallback kept apps from crashing while debugging — at the cost ofcrypto.getRandomValuessilently returning predictable values.That rationale no longer applies:
RN$Bridgelesscheck already made the fallback dead code.What
Removes
insecureRandomValues,isRemoteDebuggingInChrome, and the branch that invoked them.getRandomValuesnow always uses a real CSPRNG (ExpoCrypto if present, otherwise the native module). If the native module were ever unavailable,TurboModuleRegistry.getEnforcingthrows instead of silently degrading — the right failure mode for a polyfill that applications use to generate key material (e.g. wallet private keys), where a silently weak RNG is a catastrophic failure. This class of bug has caused real-world thefts (e.g. the BitcoinJS "Randstorm" disclosures).