A remote code execution vulnerability in protobuf.js (GHSA-xq3m-2v4x-88gg) affecting versions 8.0.0/7.5.4 and lower allows attackers to inject malicious code through unsafe dynamic code generation. If your JavaScript applications use this library—directly or as a transitive dependency—you need to patch now and address the underlying dependency management issues that allowed this vulnerability to slip through.
This isn't just about applying an update. This vulnerability highlights two systemic weaknesses: incomplete dependency visibility and a build pipeline that doesn't catch dynamic code execution patterns violating secure coding practices. Here's how to fix both.
Preparation Checklist
Immediate access requirements:
- Dependency manifest files (package.json, package-lock.json, or yarn.lock)
- Write access to your CI/CD pipeline configuration
- Deployment capability to production
Tools to install:
npm auditoryarn audit(built into npm 6+ and yarn 1.12+)- A software composition analysis tool for tracking transitive dependencies (Snyk, Dependabot, or OWASP Dependency-Check)
- Static analysis tools to flag
eval(),Function(), andnew Function()patterns
Team coordination:
- Notify your application teams about an upcoming production deployment
- Brief your security operations team on the vulnerability signature for monitoring
- Document which applications use protobuf.js
Step-by-Step Implementation
Phase 1: Identify Exposure (30-60 minutes)
1. Find all affected instances
Run this in each application repository:
npm ls protobufjs
# or for yarn:
yarn why protobufjs
This identifies both direct and transitive usage. Most teams discover they're using protobuf.js indirectly through gRPC clients, Firebase libraries, or API code generators.
2. Check versions
npm list protobufjs --depth=0 | grep protobufjs
Any version 8.0.0 or lower (or 7.5.4 or lower in the 7.x branch) is vulnerable.
3. Map your exposure
Create a spreadsheet with:
- Application name
- protobuf.js version
- Direct or transitive dependency
- Last deployment date
- Production vs. staging vs. development
This becomes your patch priority list.
Phase 2: Apply the Patch (1-2 hours per application)
For direct dependencies:
Update your package.json:
{
"dependencies": {
"protobufjs": "^8.0.1"
}
}
Then run:
npm install
npm audit fix
For transitive dependencies:
This requires more effort. You can't directly control what versions your dependencies use. Options:
- Force a resolution (npm 8.3+):
{
"overrides": {
"protobufjs": "8.0.1"
}
}
Or for yarn:
{
"resolutions": {
"protobufjs": "8.0.1"
}
}
Update the parent dependency that includes protobuf.js. Check if a newer version of your gRPC library or Firebase SDK exists.
Contact the maintainer if the parent dependency is internal or a vendor library.
Test before deploying:
Run your integration test suite. The protobuf.js API surface didn't change between 8.0.0 and 8.0.1, but you're validating that the override doesn't break transitive dependency version constraints.
Phase 3: Fix the Root Cause (2-4 hours)
Patching addresses the symptom. Now prevent this class of vulnerability from entering your codebase.
1. Add SCA scanning to CI/CD
Configure your pipeline to fail builds with known vulnerabilities. For GitHub Actions:
- name: Run security audit
run: |
npm audit --audit-level=high
if [ $? -ne 0 ]; then
echo "High or critical vulnerabilities found"
exit 1
fi
2. Block unsafe dynamic code patterns
Add ESLint rules that flag eval(), Function(), and new Function():
{
"rules": {
"no-eval": "error",
"no-implied-eval": "error",
"no-new-func": "error"
}
}
This catches the coding pattern that made protobuf.js vulnerable in the first place.
3. Implement dependency review
For organizations under PCI DSS, Requirement 6.3.2 mandates that custom software is reviewed prior to release. Extend this to dependency updates:
- New dependencies require security team approval
- Major version updates trigger a security review
- Monthly dependency audits become a recurring task
Validation - How to Verify It Works
Confirm the patch:
npm ls protobufjs
You should see version 8.0.1 (or 7.5.5 if you're on the 7.x branch) with no vulnerable versions in the tree.
Test the CI/CD gate:
Temporarily add a known vulnerable package to package.json:
{
"dependencies": {
"lodash": "4.17.15"
}
}
Your pipeline should fail the build. If it doesn't, your audit configuration isn't working.
Verify dynamic code detection:
Add this to a test file:
const malicious = new Function('return process.env');
ESLint should flag it as an error. If your IDE doesn't show the error immediately, run:
npx eslint .
Maintenance and Ongoing Tasks
Weekly:
- Review Dependabot or Snyk alerts
- Triage vulnerabilities by CVSS score and exploitability
Monthly:
- Run
npm auditacross all repositories - Update dependencies with available patches
- Review your dependency override list—overrides should be temporary
Quarterly:
- Audit your static analysis rules against OWASP ASVS v4.0.3 Section 5.2 (Sanitization and Sandboxing)
- Review which applications still use legacy dependencies
- Update your SCA tool signatures
Document your response:
For SOC 2 Type II auditors, maintain evidence of:
- When you discovered the vulnerability
- Which systems were affected
- Remediation timeline
- Preventive controls you implemented
The protobuf.js vulnerability was discovered by researcher Cristian Staicu and reported by Endor Labs. The fix exists—versions 8.0.1 and 7.5.5 are available now. But the real work is building the dependency management discipline that prevents the next one from reaching production.



