Deprecated or Abandoned Package Detected
Detected an installed dependency that has been officially flagged as deprecated, archived by authors, or reached End-of-Life (EOL). Continued usage exposes applications to unpatched CVEs and supply-chain account takeovers.
Overview
The KEVLAR-DEPRECATED-PACKAGE rule triggers when a package present in your direct or transitive dependency tree has been officially deprecated on its upstream public registry (NPM, PyPI, NuGet, Packagist, Go proxy), archived on GitHub, or designated End-of-Life (EOL) by maintainers.
Package deprecation is not merely a cosmetic warning. It indicates that the author or maintaining foundation has permanently halted feature development, bug fixes, and security patches. Widely used legacy packages (such as request in Node.js, pycrypto in Python, or Microsoft.Data.OData in .NET) have modern, secure successors that should be adopted immediately.
Risk & Impact Analysis
Maintaining deprecated packages in your software supply chain presents acute operational and compliance liabilities:
Abandoned packages frequently suffer maintainer account takeovers, expired domain hijacks, or deceptive ownership handoffs that inject infostealers and crypto miners into dependent applications.
Vulnerabilities logged in the National Vulnerability Database (NVD) or Open Source Vulnerabilities (OSV) will never be remediated upstream. No maintainer is available to review security advisories.
Modern runtime engines deprecate unmaintained internal APIs (e.g. Node.js Buffer constructor, Python collections aliases), causing abandoned packages to trigger fatal runtime crashes.
PCI-DSS v4.0 (Req 6.3.2), SOC 2, HIPAA, and ISO 27001 explicitly mandate that third-party software components must be actively supported and maintained by upstream vendors.
How Kevlar Detects It
Kevlar CheckDeps performs automated deprecation audits against authoritative registry metadata endpoints without running package code:
-
1
Metadata Verification: Queries package registry metadata flags (e.g. NPM
deprecatedmessage field, PyPIDevelopment Status :: 7 - Inactivetrove classifier, NuGet package deprecation alternate metadata, Packagist abandoned flag). -
2
Curated EOL Database Cross-Check: Cross-checks dependency names and version ranges against Kevlar's built-in catalog of superseded libraries and recommended replacements.
-
3
SARIF Emission: Generates an
errorlevel SARIF finding containing the exact author deprecation notice and suggested replacement libraries.
Example SARIF v2.1.0 result emitted by Kevlar:
{
"ruleId": "KEVLAR-DEPRECATED-PACKAGE",
"level": "error",
"message": {
"text": "Package '[email protected]' is deprecated: 'request has been deprecated, see https://github.com/request/request/issues/3142'. Recommended alternative: 'undici' or 'axios'."
},
"locations": [
{
"physicalLocation": {
"artifactLocation": { "uri": "package.json" },
"region": { "startLine": 24, "endLine": 24 }
}
}
],
"properties": {
"package": "request",
"version": "2.88.2",
"deprecationNotice": "request has been deprecated, see https://github.com/request/request/issues/3142",
"suggestedReplacement": "undici",
"precision": "very-high"
}
}
Remediation Guide by Ecosystem
Replace deprecated dependencies with modern, actively maintained alternatives supported by current runtimes.
1. View official deprecation notice directly from the registry:
npm view <package-name> deprecated
2. Common Node.js package migrations:
| Deprecated Package | Recommended Replacement | Migration Path |
|---|---|---|
request | undici / native fetch() | Fast HTTP client backed by Node core |
moment | date-fns / dayjs | Lightweight, immutable, tree-shakeable |
babel-eslint | @babel/eslint-parser | Official scoped Babel parser |
3. Uninstall deprecated package and install replacement:
npm uninstall request npm install undici
1. Inspect package metadata and classifiers:
pip show <package-name>
2. Common Python package migrations:
| Deprecated Package | Recommended Replacement | Migration Path |
|---|---|---|
pycrypto | cryptography | Modern authenticated primitives & OpenSSL bindings |
nose | pytest | Standard active test runner in Python ecosystem |
python-memcached | pymemcache | Pure-Python, thread-safe, actively maintained |
3. Swap dependency in Poetry:
poetry remove pycrypto poetry add cryptography
1. Query all deprecated NuGet dependencies and check recommendations:
dotnet list package --deprecated
2. Remove the deprecated package and install the recommended modern package:
dotnet remove package <DeprecatedPackage> dotnet add package <RecommendedPackage>
1. Audit your dependencies for abandoned or archived packages:
composer audit --abandoned
2. Replace abandoned package with its community successor:
composer remove abandoned/package composer require modern/replacement-package
1. Inspect modules with deprecation notices in Go module proxy:
go list -m -u all
2. Install the recommended replacement module and clean up go.mod:
go get <replacement-module-path>@latest go mod tidy
Suppression & Policy Configuration
When replacing a deprecated package requires substantial architectural redesign or API refactoring, engineering teams can configure a tracked migration waiver in kevlar-suppressions.json:
expiresAt) and assign a named engineering owner. Once the date passes, Kevlar breaks CI builds to guarantee migration completion.
{
"version": "1.0",
"suppressions": [
{
"ruleId": "KEVLAR-DEPRECATED-PACKAGE",
"package": "request",
"version": "2.88.2",
"reason": "Legacy payment gateway client relies on request API hooks. Migration to undici scheduled for Q4 release.",
"approvedBy": "[email protected]",
"assignedOwner": "[email protected]",
"expiresAt": "2026-12-15T00:00:00Z",
"ticketUrl": "https://jira.company.internal/browse/PAY-3902"
}
]
}