Skip to content

Conversation

@georgewrmarshall
Copy link
Contributor

@georgewrmarshall georgewrmarshall commented Oct 22, 2025

Description

Implements critical NPM supply chain attack protection by adding a 3-day minimum age gate for package installations. This security enhancement prevents the installation of freshly published packages that could contain malicious code, providing a crucial defense against supply chain attacks.

The implementation follows instructions from the security team for protecting against ongoing NPM supply chain threats, requiring all packages to be at least 3 days old before installation while maintaining exceptions for trusted MetaMask and LavaMoat packages.

Related issues

Fixes: https://consensyssoftware.atlassian.net/browse/DSYS-242

Manual testing steps

  • Verify yarn version upgraded to 4.10.2+ for age gate support
  • Run yarn install to confirm age gate configuration works without blocking existing dependencies
  • Confirm @metamask/* and @lavamoat/* packages are pre-approved and can bypass age restrictions
  • Test that the repository builds and runs correctly with new yarn version
  • Attempt to install a very recent package to verify age gate blocks it (optional security validation)

Screenshots/Recordings

Not applicable - this is a security infrastructure change without visual components.

Pre-merge author checklist

  • I have reviewed the Files changed tab
  • Yarn version updated to 4.10.2 to support npmMinimalAgeGate feature
  • Added npmMinimalAgeGate: 4320 (3 days in minutes) to .yarnrc.yml
  • Added npmPreapprovedPackages list with trusted @metamask/* and @lavamoat/* packages
  • Verified yarn install works correctly with new configuration
  • All existing scripts and workflows continue to function
  • I have tested this PR on my local machine

Pre-merge reviewer checklist

  • I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed).
  • I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots.

Security Impact

Protection Against Supply Chain Attacks:

  • 3-Day Age Gate: Prevents installation of packages newer than 3 days, allowing community time to identify and report malicious packages
  • Trusted Package Bypass: @metamask/* and @lavamoat/* packages can bypass restrictions for urgent security updates
  • Zero Developer Friction: Protection works transparently without changing development workflows

Before:

  • Any NPM package could be installed immediately upon publication
  • Vulnerable to fresh supply chain attacks and malicious package injections
  • No protection against compromised packages in the first hours/days

After:

  • All external packages must be at least 72 hours old before installation
  • Trusted MetaMask and LavaMoat packages can bypass for emergency updates
  • Automatic protection against fresh malicious packages with zero workflow impact

Technical Details

Configuration Changes:

  • package.json: Updated packageManager from [email protected] to [email protected]
  • .yarnrc.yml: Added npmMinimalAgeGate: 4320 (3 days in minutes)
  • .yarnrc.yml: Added npmPreapprovedPackages with ["@metamask/*", "@lavamoat/*"]

Yarn Lock Updates:

  • Minor typescript patch hash update (expected with yarn version change)
  • No breaking dependency changes

Security Alignment:

  • Follows MetaMask security best practices for supply chain protection
  • Implements defense-in-depth strategy alongside existing @lavamoat/allow-scripts protection
  • Compatible with existing LavaMoat yarn plugin configuration

Note

Enable a 3‑day NPM package age gate in Yarn and bump Yarn to 4.10.3, updating constraints and lockfile accordingly.

  • Config/Security:
    • Add npmMinimalAgeGate: 4320 and npmPreapprovedPackages (@metamask/*, @lavamoat/*) in .yarnrc.yml.
  • Tooling:
  • Lockfile:
    • Update yarn.lock TypeScript patch resolution/checksum.

Written by Cursor Bugbot for commit 4d63fe0. This will update automatically on new commits. Configure here.

@github-actions
Copy link
Contributor

📖 Storybook Preview

@github-actions
Copy link
Contributor

📖 Storybook Preview

Comment on lines +21 to +28
# NPM Supply Chain Attack Protection
# Minimum age gate: only allow packages older than 3 days (4320 minutes)
npmMinimalAgeGate: 4320

# Pre-approved packages that can bypass the age gate
npmPreapprovedPackages:
- '@metamask/*'
- '@lavamoat/*'
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adding configurations from notion document

"yargs": "^17.7.2"
},
"packageManager": "yarn@4.2.2",
"packageManager": "yarn@4.10.3",
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Upgrading yarn version

@georgewrmarshall georgewrmarshall marked this pull request as ready for review October 22, 2025 23:18
@georgewrmarshall georgewrmarshall requested a review from a team as a code owner October 22, 2025 23:18
@github-actions
Copy link
Contributor

📖 Storybook Preview

@github-actions
Copy link
Contributor

📖 Storybook Preview

@github-actions
Copy link
Contributor

📖 Storybook Preview

@georgewrmarshall georgewrmarshall merged commit 7bf7fc2 into main Oct 24, 2025
79 checks passed
@georgewrmarshall georgewrmarshall deleted the security-update branch October 24, 2025 17:37
@georgewrmarshall georgewrmarshall mentioned this pull request Dec 9, 2025
7 tasks
brianacnguyen pushed a commit that referenced this pull request Dec 9, 2025
## **Description**

This PR releases version 17.0.0 of the MetaMask Design System, featuring
important fixes for mobile font compatibility, the addition of the
ButtonHero component to React, export fixes for React Native, and
various dependency updates including ESLint configuration upgrades.

## **Included PRs**

#836, #837, #838, #840, #843, #845, #846, #847, #848, #850, #851, #852,
#853, #854, #855, #856, #857, #858, #859, #861, #862, #863, #864

## **Manual testing steps**

1. Check package.json version bumps align with included changes
2. Check changelog accurately reflects the release

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs)
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Release 17.0.0 introducing React `ButtonHero`, RN font naming changes
and TWRNC preset font family rename (both breaking), plus RN export fix
and dependency updates.
> 
> - **Release 17.0.0**
>   - Bump root `package.json` to `17.0.0`.
> - **React (`@metamask/[email protected]`)**
>   - Add `ButtonHero` component for prominent CTAs.
>   - Update `@metamask/utils` peer to `^11.8.1`.
> - **React Native (`@metamask/[email protected]`)**
> - BREAKING: Rename font files to hyphenated PostScript format for iOS
Metro compatibility.
>   - Export missing `TextButtonSize` enum.
> - Peer: require `@metamask/design-system-twrnc-preset@^0.3.0`; update
`@metamask/utils` peer.
> - **TWRNC preset (`@metamask/[email protected]`)**
> - BREAKING: Rename font family names to hyphenated PostScript format
for iOS/expo-font.
> - **Changelogs**
>   - Update `CHANGELOG.md` links and entries for all packages.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
9a90311. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants