An application security vulnerability is “a hole or a weakness in the application, which can be a design flaw or an implementation bug, that allows an attacker to cause harm to the stakeholders of an application,” according to OWASP. These stakeholders include the application owner, application users, and others that rely on the application.
While it doesn’t call them vulnerabilities on the top line, MITRE, which maintains the CWE Top 25 list of common software security weaknesses, uses the term “vulnerability” in defining software weaknesses: “Software weaknesses are flaws, faults, bugs, vulnerabilities, and other errors in software implementation, code, design, or architecture that if left unaddressed could result in systems and networks being vulnerable to attack.”
These are certainly useful definitions to know. But they don’t add anything particularly actionable for software developers on their journey to secure coding. That’s where the security vulnerability lists like OWASP Top 10 Most Critical Web Application Security Risks and the similar but more extensive CWE Top 25 Most Dangerous Software Errors come into play.
These lists lay out the most critical types of security vulnerabilities to keep in mind as you develop software. But some application vulnerabilities warrant more scrutiny and mitigation efforts than others. So let’s take a closer look at the different types of vulnerabilities.
OWASP is well known for its top 10 list of web application security risks. But the organization’s website also lists dozens of entries grouped into 20 types of security vulnerabilities. Categories include API Abuse, Input Validation Vulnerability, and Session Management Vulnerability. OWASP’s application vulnerability descriptions talk about risk factors, give examples, and cross-link to related attacks, vulnerabilities, and controls.
MITRE and the SANS Institute put together the latest CWE/SANS Top 25 list in 2011. In that list, they categorize three main types of security vulnerabilities based their more extrinsic weaknesses:
Out of the CWE/SANS Top 25 types of security vulnerabilities, 11 involve porous defenses. Defensive techniques such as encryption, authentication, and authorization, when implemented correctly, are essential to application security. But when they are misused, abused, or otherwise implemented incorrectly—or just ignored—they become application vulnerabilities.
Three of these vulnerabilities point to a basic lack of good housekeeping: Missing Authentication, Missing Authorization, and Missing Encryption. And three others have to do with erroneous or ill-advised use of application defense techniques, including Incorrect Authorization, Incorrect Permission Assignment, and Improper Restriction of Excess Authentication Attempts.
Resource management involves creating, using, transferring, and destroying system resources such as memory. Proper, secure management resource is necessary for effective application defense. The types of security vulnerabilities in the CWE/SANS Top 25 category “Risky Resource Management” are related to ways that the software mismanages resources. These application vulnerabilities range from the classic Buffer Overflow and Path Traversal to the more-sci-fi-sounding Inclusion of Functionality from Untrusted Control Sphere and the ominously named Use of Potentially Dangerous Function.
Defending against these application vulnerabilities boils down to two strategies:
Liberal use of sandboxing and whitelisting can help here, but there are no guarantees. Other options include application security testing and vulnerability assessments to uncover these eight types of security vulnerabilities before something goes wrong.
The category “Insecure Interaction Between Components” has the fewest members of the CWE/SANS Top 25 software errors. But it also contains the most wanted—make that least wanted—list of security vulnerabilities. It’s a well-known rogues gallery bearing names like SQL Injection, Cross-Site Scripting, and Open Redirect.
What do these types of security vulnerabilities all have in common? They’re all related to how “data is sent and received between separate components, modules, programs, processes, threads, or systems.”