eslint-plugin-security Is Unmaintained. Here's What Nobody Tells You.

eslint-plugin-security has 1.5M weekly downloads but only 13 rules and no meaningful updates since 2020. Learn why it misses 90% of vulnerabilities—including SQL injection, JWT attacks, and AI/LLM security—and what modern ESLint security plugins to use instead.

9 min read
eslint-plugin-security Is Unmaintained. Here's What Nobody Tells You.
Share:

Skip to: What It Misses | The Alternative | Migration Guide | OWASP Coverage

TL;DR — Migrate in 60 Seconds

bash
npm uninstall eslint-plugin-security
npm install -D eslint-plugin-secure-coding

That's it. You now have 27 rules instead of 13, with full OWASP Top 10 mapping. Add the full security ecosystem and you get 194 security rules.

Want the full story? Keep reading.


Let's talk about the elephant in the Node.js security room.

eslint-plugin-security is the most-installed ESLint security plugin. It has 1.5M+ weekly downloads. It's recommended by countless tutorials. And it's been effectively unmaintained for years.

This isn't a hit piece—it's a reality check. And a thank you.

eslint-plugin-security pioneered JavaScript security linting. When it launched, it was the only game in town. The maintainers did important work that inspired everything that came after.

But the threat landscape has changed. Let's see where we are in 2026.

The Numbers Don't Lie

Metriceslint-plugin-securityModern Alternative
Total Rules13194
Last Meaningful Update2020Weekly
OWASP Top 10 CoveragePartial (~20%)100%
Flat Config Support⚠️ Limited✅ Native
AI/LLM Security Rules❌ None✅ 19 rules
PostgreSQL Rules❌ None✅ 13 rules
JWT Security Rules❌ None✅ 13 rules

The plugin was groundbreaking when it launched. But the JavaScript security landscape has changed dramatically since 2020.

Is eslint-plugin-security Still Maintained?

Let's look at the actual repository:

MetricValueWhat It Means
Last meaningful commit2020Core rules haven't evolved
Open issues45+Many from 2021-2022, unaddressed
Open PRs12+Several with no maintainer response
ESLint 9 support⚠️ PartialNo native flat config exports

Note: The plugin was transferred to eslint-community in 2023, which extended its life. But activity remains minimal, and the rule set hasn't grown.

What Does eslint-plugin-security Miss?

Let's be specific. Here are vulnerability categories the plugin cannot detect:

1. Modern SQL Injection Patterns

javascript
// ❌ NOT detected by eslint-plugin-security
const query = `SELECT * FROM users WHERE email = '${userInput}'`;
await pool.query(query);

The plugin has no PostgreSQL-aware rules. No understanding of parameterized queries. No detection of string concatenation in database contexts.

Detection: eslint-plugin-pg catches this with pg/no-unsafe-query.

2. AI/LLM Vulnerabilities

javascript
// ❌ NOT detected by eslint-plugin-security
import { generateText } from "ai";

const response = await generateText({
  model: openai("gpt-4"),
  prompt: userInput, // Prompt injection - no system prompt protection
});

AI security didn't exist when the plugin was written. There are zero rules for prompt injection, system prompt leakage, or tool abuse.

Detection: eslint-plugin-vercel-ai-security provides 19 rules for Vercel AI SDK patterns.

3. JWT Security Issues

javascript
// ❌ NOT detected by eslint-plugin-security
jwt.verify(token, secret, { algorithms: ["none"] }); // Algorithm confusion attack

JWT attacks are some of the most common vulnerabilities in Node.js applications. The plugin has no JWT-specific rules.

Detection: eslint-plugin-jwt catches algorithm confusion, missing expiration, and weak secrets.

4. Connection Leaks

javascript
// ❌ NOT detected by eslint-plugin-security
async function getUser(id) {
  const client = await pool.connect();
  return client.query("SELECT * FROM users WHERE id = $1", [id]);
  // client.release() never called - connection leak
}

Production outages from connection exhaustion are common. No detection.

Detection: pg/no-missing-client-release ensures every connect() has a matching release().

5. Path Traversal with Modern APIs

javascript
// ❌ NOT detected by eslint-plugin-security
import { readFile } from "node:fs/promises";
const content = await readFile(`./uploads/${filename}`);

The plugin's path traversal detection is limited to older fs patterns.

Detection: node-security/detect-non-literal-fs-filename understands modern node:fs/promises imports and validates path safety.

The 13 Rules, Reviewed

Let's look at what eslint-plugin-security actually provides:

RulePurposeStill Relevant?
detect-unsafe-regexReDoS prevention✅ Yes
detect-non-literal-regexpDynamic regex⚠️ Partial
detect-buffer-noassertBuffer safety❌ Deprecated in Node.js
detect-child-processCommand injection⚠️ Too broad
detect-disable-mustache-escapeXSS in templates⚠️ Framework-specific
detect-eval-with-expressioneval() detection✅ Yes
detect-no-csrf-before-method-overrideCSRF ordering⚠️ Express 3.x era
detect-non-literal-fs-filenamePath traversal⚠️ Partial
detect-non-literal-requireDynamic requires⚠️ ESM era issue
detect-object-injectionPrototype pollution✅ Yes
detect-possible-timing-attacksTiming attacks⚠️ High false positives
detect-pseudoRandomBytesInsecure random⚠️ Outdated API name
detect-bidi-charactersTrojan source✅ Yes

Verdict: ~4 rules are still fully relevant. ~5 are partially useful. ~4 are obsolete.

Why This Matters

If you're using eslint-plugin-security as your primary security linting:

  1. You're missing ~90% of detectable vulnerabilities
  2. You have no OWASP Top 10 coverage map for compliance
  3. You have no AI/LLM protection as your team adopts AI tools
  4. You're running on 2020-era detection in a 2026 threat landscape

What Should I Use Instead of eslint-plugin-security?

The modern approach is domain-specific security plugins that understand context. Think of it as a layered security architecture:

The Security Ecosystem: 10 Plugins, 194 Rules

CategoryPluginRulesWhat It Catches
🛡️ Coreeslint-plugin-secure-coding27Injection, XSS, secrets, prototype pollution
🖥️ Environmenteslint-plugin-node-security31Node.js: fs, child_process, crypto, vm, Buffer
eslint-plugin-browser-security45Browser: DOM XSS, postMessage, storage, CSP
🚂 Frameworkeslint-plugin-express-security10Express: cookies, CORS, CSRF, GraphQL
eslint-plugin-nestjs-security6NestJS: guards, validation, throttling
eslint-plugin-lambda-security14AWS Lambda: API Gateway, headers, input
🔐 Domaineslint-plugin-jwt13JWT: algorithm confusion, secrets, validation
eslint-plugin-pg13PostgreSQL: SQL injection, connection leaks
eslint-plugin-mongodb-security16MongoDB: NoSQL injection, operator attacks
🤖 AI/LLMeslint-plugin-vercel-ai-security19AI SDK: prompt injection, tool safety

Quick Start: Choose Your Stack

Node.js Backend (Express/Fastify):

bash
npm install -D eslint-plugin-secure-coding \
              eslint-plugin-node-security \
              eslint-plugin-express-security \
              eslint-plugin-pg \
              eslint-plugin-jwt

Serverless (AWS Lambda):

bash
npm install -D eslint-plugin-secure-coding \
              eslint-plugin-lambda-security \
              eslint-plugin-pg

MongoDB/Mongoose Backend:

bash
npm install -D eslint-plugin-secure-coding \
              eslint-plugin-mongodb-security \
              eslint-plugin-node-security \
              eslint-plugin-jwt

AI/LLM Applications:

bash
npm install -D eslint-plugin-secure-coding \
              eslint-plugin-vercel-ai-security \
              eslint-plugin-node-security

Browser/Frontend:

bash
npm install -D eslint-plugin-secure-coding \
              eslint-plugin-browser-security

Does This Support ESLint 9 Flat Config?

Yes. All 10 security plugins are built for the modern ESLint ecosystem with native flat config support:

javascript
// eslint.config.js - Full security suite
import secureCoding from "eslint-plugin-secure-coding";
import nodeSecurity from "eslint-plugin-node-security";
import express from "eslint-plugin-express-security";
import pg from "eslint-plugin-pg";
import jwt from "eslint-plugin-jwt";

export default [
  secureCoding.configs.recommended,
  nodeSecurity.configs.recommended,
  express.configs.recommended,
  pg.configs.recommended,
  jwt.configs.recommended,
];

Rule-by-Rule Migration

Every eslint-plugin-security rule has a modern replacement:

eslint-plugin-securityModern ReplacementPlugin
detect-unsafe-regexsecure-coding/no-redos-vulnerable-regexsecure-coding
detect-eval-with-expressionnode-security/detect-eval-with-expressionnode-security
detect-child-processnode-security/detect-child-processnode-security
detect-non-literal-fs-filenamenode-security/detect-non-literal-fs-filenamenode-security
detect-object-injectionsecure-coding/detect-object-injectionsecure-coding
detect-possible-timing-attacksnode-security/no-timing-unsafe-comparenode-security
detect-non-literal-regexpsecure-coding/detect-non-literal-regexpsecure-coding

But that's just the migration. The real value is the 181 additional security rules you gain:

CategoryRulesExamples
Browser Security45DOM XSS, postMessage, storage, CSP
Node.js Security31fs, child_process, crypto, vm, Buffer
AI/LLM Security19Prompt injection, tool safety, streaming
MongoDB Security16NoSQL injection, operator attacks, ODM vulnerabilities
PostgreSQL13Connection leaks, COPY exploits, search_path hijacking
JWT Vulnerabilities13Algorithm 'none', missing exp, weak secrets
AWS Lambda14API Gateway, headers, input validation
Express.js10Cookies, CORS, CSRF, GraphQL
NestJS6Guards, validation, throttling

OWASP Top 10 Coverage

The ultimate test of a security plugin is OWASP coverage:

OWASP 2021 Categoryeslint-plugin-securityInterlace Ecosystem
A01: Broken Access Control✅ 12 rules
A02: Cryptographic Failures⚠️ 1 rule✅ 15 rules
A03: Injection⚠️ 3 rules✅ 45 rules
A04: Insecure Design✅ 8 rules
A05: Security Misconfiguration✅ 18 rules
A06: Vulnerable Components⚠️ External*
A07: Auth Failures✅ 22 rules
A08: Software/Data Integrity⚠️ 1 rule✅ 12 rules
A09: Logging Failures✅ 6 rules
A10: SSRF✅ 8 rules

*A06 (Vulnerable Components) requires Software Composition Analysis (SCA) tools like npm audit, Snyk, or Socket—not static analysis. ESLint can't detect outdated dependencies.

Total coverage: eslint-plugin-security ~20% | Interlace ~100%

Ready to Upgrade?

Option 1: Quick Migration (60 seconds)

bash
npm uninstall eslint-plugin-security
npm install -D eslint-plugin-secure-coding
npx eslint . --max-warnings 0

Option 2: Full Security Suite (5 minutes)

bash
npm install -D eslint-plugin-secure-coding eslint-plugin-pg \
              eslint-plugin-jwt eslint-plugin-node-security

Option 3: See What You're Missing First

Run ESLint with the new plugins on your codebase. You'll likely find vulnerabilities that were invisible before.

bash
npx eslint . --format stylish

A Note on Open Source Maintenance

Maintaining open-source projects is hard, often thankless work. The eslint-plugin-security maintainers gave the community years of value. This article isn't criticism—it's recognition that the community has evolved, and our tools should too.

If you use and benefit from open-source security tooling, consider sponsoring maintainers who keep the ecosystem alive.


The Bottom Line

eslint-plugin-security was important. It pioneered JavaScript security linting. But we owe it to our codebases to use tools that match today's threat landscape.

13 rules from 2020 aren't enough for 2026.


Explore the Full Ecosystem

194 security rules. 10 specialized plugins. 100% OWASP Top 10 coverage.

The Interlace ESLint Ecosystem provides comprehensive security static analysis for modern Node.js applications.

📖 Documentation | ⭐ GitHub | 📦 NPM


Related Articles:


Build Securely.

I'm Ofri Peretz, a Security Engineering Leader and the architect of the Interlace Ecosystem. I build static analysis standards that automate security and performance for Node.js fleets at scale.

ofriperetz.dev | LinkedIn | GitHub

Built with Nuxt UI • © 2026 Ofri Peretz