The Friday Deploy
The plain English newsletter for people who run the business, not the tech stack. No jargon. Every Friday.
Why Outdated Dependencies Are a Security Risk
Your developer mentioned that some dependencies are outdated and need updating. You’re wondering if this is urgent or if it can wait until the next development sprint. This article explains what outdated dependencies actually mean for your business, how serious the risks are, and how to make informed decisions about prioritising updates.
What Dependencies Actually Are
Modern web applications don’t build everything from scratch. Instead, they use pre-built components called dependencies – libraries and frameworks that handle common functionality like user authentication, payment processing, or sending emails.
Think of dependencies like buying pre-manufactured parts for a house instead of crafting every component yourself. You use a trusted supplier’s door handles, light switches, and plumbing fixtures rather than making your own.
Your Rails application might use 50-200 of these dependencies. Each one was written by someone else, maintained by someone else, and updated by someone else. When security vulnerabilities are discovered in these components, the maintainers release updates to fix them.
Why Dependencies Become Outdated
Dependencies become outdated for several reasons, not all equally concerning.
Normal updates happen constantly. Maintainers fix bugs, improve performance, and address newly-discovered security issues. If you’re running a version from six months ago, you’re probably missing minor improvements and possibly some security patches.
Major version upgrades require more work. When a dependency releases a major new version, it often includes breaking changes that require code modifications. Teams defer these updates because they’re time-consuming, not because they’re unnecessary.
Abandoned dependencies are the serious problem. Sometimes the people maintaining a dependency stop working on it entirely. No more updates, no more security fixes. If you’re using an abandoned dependency and a vulnerability is discovered, you have no upstream fix coming.
The Security Risks That Actually Matter
Not all outdated dependencies pose the same level of risk. Understanding which vulnerabilities actually threaten your business helps you prioritise updates intelligently.
Known vulnerabilities with published exploits
When a security researcher discovers a vulnerability in a popular dependency, they typically publish details to a database like CVE (Common Vulnerabilities and Exposures) or the National Vulnerability Database. Attackers scan the internet looking for applications using vulnerable versions.
This isn’t theoretical. Automated tools actively search for known vulnerabilities. If your application uses a dependency with a published CVE and hasn’t been updated, attackers can find and exploit it.
The 2017 Equifax breach, which exposed data for 147 million people and cost over $1.4 billion, began with exploitation of a known vulnerability in Apache Struts. The patch had been available for two months before the breach. Equifax wasn’t using it.
Remote code execution
The most serious vulnerabilities allow attackers to run arbitrary code on your server. They can install malware, steal data, or take complete control of your system.
Log4Shell, discovered in late 2021, was a remote code execution vulnerability in Log4j, a logging library used in thousands of Java applications. Within hours of disclosure, millions of exploitation attempts were detected globally.
Data exposure
Some vulnerabilities allow attackers to access data they shouldn’t see. This might be customer information, payment details, or internal business data.
The Target data breach in 2013, which compromised 40 million credit cards and cost over $200 million, involved exploitation of outdated point-of-sale software that hadn’t received security updates.
Escalation of privileges
Vulnerabilities might allow regular users to gain administrative access or bypass authentication entirely. Even if an attacker starts with limited access, these vulnerabilities let them expand control.
How to Assess Your Actual Risk
Not every outdated dependency demands immediate attention. Here’s how to evaluate which updates matter most.
Check severity ratings
Vulnerabilities are rated on severity using CVSS scores from 0-10. Critical vulnerabilities (9.0-10.0) demand immediate attention. High severity (7.0-8.9) should be addressed within days or weeks. Medium and low severity issues can often wait for regular update cycles.
Your developer can run tools like bundle audit for Rails dependency scanning or npm audit for Node applications to identify known vulnerabilities and their severity ratings. Rails projects can also use Brakeman to scan application code for security issues.
Consider exposure
A vulnerability in code that handles user input or processes external data is more dangerous than one in an internal admin tool with limited access. If the vulnerable component isn’t exposed to the internet or untrusted users, the risk is lower.
Evaluate exploit availability
Some vulnerabilities are theoretical – security researchers identified a potential problem, but no working exploit exists. Others have published exploit code that anyone can use. Vulnerabilities with available exploits need faster response.
Account for your data sensitivity
The same vulnerability poses different risks depending on what you’re protecting. An ecommerce platform handling payment data faces different stakes than a blog with no sensitive information.
The Real Costs of Outdated Dependencies
Understanding financial impact helps frame security updates as business decisions, not just technical tasks.
Research by Kaspersky found that companies with outdated technology suffer 47% higher costs when data breaches occur – $1.2 million versus $836,000 for companies with updated systems. For small and medium businesses, the difference is even starker at 54% higher costs.
Beyond direct breach costs, outdated dependencies create ongoing drags on productivity. Developers spend more time working around bugs that were fixed in newer versions. Integration with modern tools becomes difficult. Technical debt accumulates, making each subsequent update more complex and expensive.
Regulatory implications matter for certain industries. HIPAA, PCI-DSS, and other compliance frameworks require maintaining supported, secure software. Using dependencies with known vulnerabilities can result in compliance failures and associated penalties.
When to Prioritise Updates Immediately
Certain scenarios demand urgent action regardless of your regular development schedule.
Update immediately if a critical vulnerability (CVSS 9.0+) has been disclosed in a widely-used dependency that your application relies on. The window between disclosure and mass exploitation can be hours.
Prioritise updates when the vulnerable component handles authentication, payment processing, or sensitive data access. These are your highest-value targets for attackers.
Act quickly if you’re in a regulated industry and the vulnerability affects compliance. Waiting for the next sprint might mean falling out of compliance.
Address it now if the dependency is end-of-life and a security issue has been found. With no upstream fixes coming, you need to either update to a supported version or replace the dependency entirely.
When You Can Defer Updates
Not every outdated dependency requires dropping everything. These situations allow for scheduled updates in normal development cycles.
Low and medium severity vulnerabilities in components with limited exposure can typically wait for regular sprint planning. Address them in priority order rather than as emergencies.
If the vulnerable code path isn’t used in your application, the theoretical vulnerability doesn’t create practical risk. A security issue in a feature you’ve disabled or never implemented doesn’t threaten your system.
When a dependency has a security update but the vulnerability doesn’t affect your specific use case, schedule the update for convenience rather than urgency.
Questions to Ask Your Developer
Get specific information to make informed prioritisation decisions.
Which dependencies have known vulnerabilities? Ask for the list with severity ratings and CVE numbers so you can research the specific issues.
What’s the exploit timeline? When was the vulnerability disclosed? How long has a fix been available? Is there evidence of active exploitation?
What breaks if we update? Understanding the scope of changes helps you assess whether this update can happen quickly or requires more extensive testing.
How exposed are these components? Are the vulnerable dependencies handling user input, or are they used in internal tools with limited access?
What’s the update path? Can we update just the vulnerable dependency, or does it require upgrading multiple related components?
Building a Sustainable Update Process
Rather than responding to security issues reactively, implement systems that catch them before they become urgent problems.
Automated dependency scanning
Tools like Dependabot, Snyk, or bundler-audit automatically monitor your dependencies and flag known vulnerabilities. These run on every code change and alert your team when issues are found.
Setting up automated scanning takes an hour or two initially but prevents the scenario where you discover critical vulnerabilities months after fixes are available.
Regular update cycles
Schedule dependency updates as part of regular development work, not just when security issues arise. Monthly or quarterly update cycles keep dependencies reasonably current without the urgency of emergency patches.
Routine updates are faster and less risky than large updates that span many versions. Updating from version 2.4 to 2.5 is straightforward. Updating from 2.4 to 5.0 after two years often requires significant code changes.
Documented dependencies
Maintain a software bill of materials (SBOM) that lists every dependency your application uses. When a vulnerability is announced in a popular library, you can immediately check whether you’re affected rather than spending hours investigating.
Testing automation
Comprehensive automated tests let you update dependencies with confidence. If tests pass after an update, you know nothing broke. Without tests, you’re either blindly deploying updates or spending days on manual testing.
Handling End-of-Life Dependencies
The most difficult dependency situations involve components that are no longer maintained.
When a dependency reaches end-of-life, no security fixes are coming. You have three options: accept the risk, fork and maintain it yourself, or replace it with an actively maintained alternative.
Accepting the risk is rarely appropriate unless the component has extremely limited exposure and replacing it would be prohibitively expensive. This decision should be documented and reviewed by whoever owns security decisions in your organisation.
Forking and maintaining the dependency yourself means your team becomes responsible for security fixes. This makes sense only if you have the expertise and capacity to monitor for vulnerabilities and develop patches.
Replacing the dependency is usually the right long-term choice. It’s expensive upfront but eliminates ongoing security risk and maintenance burden. Budget for this work and prioritise it over new features if the dependency is critical.
The Decision Framework
Use this checklist to evaluate whether a dependency update is urgent or can be scheduled.
Severity assessment:
- Critical (CVSS 9.0+) with available exploit → Update immediately
- High (CVSS 7.0-8.9) affecting sensitive components → Update within days
- Medium/Low (CVSS < 7.0) → Schedule in regular update cycle
Exposure check:
- Processes external user input → High priority
- Handles authentication/payment → High priority
- Internal tool with limited access → Lower priority
- Disabled or unused code path → Defer
Dependency status:
- End-of-life with no fixes available → Plan replacement
- Actively maintained with fix available → Standard update
- No fix available yet → Monitor closely
Business context:
- Regulated industry → Compliance requirements may dictate timeline
- High-value data → Lower tolerance for known vulnerabilities
- Public-facing application → Higher attack surface
Common Mistakes to Avoid
Several approaches to dependency management create more problems than they solve.
Never ignore security warnings with the assumption that your application isn’t important enough to attack. Automated scanning means attackers aren’t choosing targets carefully – they’re exploiting every vulnerable system they find.
Don’t skip dependency updates because “everything works fine”. Security vulnerabilities are invisible until they’re exploited. Waiting for evidence of a problem means waiting until you’ve been breached.
Avoid letting dependencies drift for months or years without updates. The longer you wait, the more painful updates become. A six-month gap might require a few hours of work. A three-year gap often requires days or weeks.
Don’t update dependencies immediately before major launches without thorough testing. If you’re deploying a marketing campaign tomorrow, today isn’t the day to update 50 dependencies. Schedule security updates around your business critical periods.
The Bigger Picture
Dependency security is fundamentally about managing accumulated technical debt before it becomes crisis.
Modern applications rely on dozens or hundreds of external dependencies. Each represents a potential security issue waiting to be discovered. The question isn’t whether vulnerabilities will be found, but whether you have processes to address them promptly when they are.
Companies that treat dependency updates as routine maintenance spend less on security overall than companies that respond only to crises. Regular updates cost hours per month. Emergency responses to breaches cost weeks of remediation work plus the actual breach damage.
The most expensive approach is assuming your current dependencies are safe until proven otherwise. By the time you have proof – in the form of a security incident – you’re already dealing with consequences rather than prevention.
Good dependency management isn’t about achieving perfect security. It’s about maintaining a reasonable security posture through consistent, informed decision-making about which risks to address and when.
If your developer raises concerns about outdated dependencies, treat it as an opportunity to review your update processes rather than just a task to complete. The goal isn’t fixing this one issue – it’s building systems that prevent these issues from becoming urgent in the first place.
Read more Technical Deep Dives
Dependencies, Maintenance, Rails, Security
Previous NextThe Friday Deploy
The plain English newsletter for people who run the business, not the tech stack. No jargon. Every Friday.