CWE-697: Incorrect ComparisonWeakness ID: 697 Vulnerability Mapping:
DISCOURAGEDThis CWE ID should not be used to map to real-world vulnerabilities Abstraction: PillarPillar - a weakness that is the most abstract type of weakness and represents a theme for all class/base/variant weaknesses related to it. A Pillar is different from a Category as a Pillar is still technically a type of weakness that describes a mistake, while a Category represents a common characteristic used to group related things. |
Description The product compares two entities in a security-relevant context, but the comparison is incorrect, which may lead to resultant weaknesses. Extended Description This Pillar covers several possibilities: - the comparison checks one factor incorrectly;
- the comparison should consider multiple factors, but it does not check at least one of those factors at all;
- the comparison checks the wrong factor.
Common Consequences This table specifies different individual consequences associated with the weakness. The Scope identifies the application security area that is violated, while the Impact describes the negative technical impact that arises if an adversary succeeds in exploiting this weakness. The Likelihood provides information about how likely the specific consequence is expected to be seen relative to the other consequences in the list. For example, there may be high likelihood that a weakness will be exploited to achieve a certain impact, but a low likelihood that it will be exploited to achieve a different impact.Scope | Impact | Likelihood |
---|
Other
| Technical Impact: Varies by Context | |
Relationships This table shows the weaknesses and high level categories that are related to this weakness. These relationships are defined as ChildOf, ParentOf, MemberOf and give insight to similar items that may exist at higher and lower levels of abstraction. In addition, relationships such as PeerOf and CanAlsoBe are defined to show similar weaknesses that the user may want to explore. Relevant to the view "Research Concepts" (CWE-1000) Nature | Type | ID | Name |
---|
MemberOf | View - a subset of CWE entries that provides a way of examining CWE content. The two main view structures are Slices (flat lists) and Graphs (containing relationships between entries). | 1000 | Research Concepts | ParentOf | Base - a weakness
that is still mostly independent of a resource or technology, but with sufficient details to provide specific methods for detection and prevention. Base level weaknesses typically describe issues in terms of 2 or 3 of the following dimensions: behavior, property, technology, language, and resource. | 183 | Permissive List of Allowed Inputs | ParentOf | Class - a weakness that is described in a very abstract fashion, typically independent of any specific language or technology. More specific than a Pillar Weakness, but more general than a Base Weakness. Class level weaknesses typically describe issues in terms of 1 or 2 of the following dimensions: behavior, property, and resource. | 185 | Incorrect Regular Expression | ParentOf | Variant - a weakness
that is linked to a certain type of product, typically involving a specific language or technology. More specific than a Base weakness. Variant level weaknesses typically describe issues in terms of 3 to 5 of the following dimensions: behavior, property, technology, language, and resource. | 581 | Object Model Violation: Just One of Equals and Hashcode Defined | ParentOf | Class - a weakness that is described in a very abstract fashion, typically independent of any specific language or technology. More specific than a Pillar Weakness, but more general than a Base Weakness. Class level weaknesses typically describe issues in terms of 1 or 2 of the following dimensions: behavior, property, and resource. | 1023 | Incomplete Comparison with Missing Factors | ParentOf | Base - a weakness
that is still mostly independent of a resource or technology, but with sufficient details to provide specific methods for detection and prevention. Base level weaknesses typically describe issues in terms of 2 or 3 of the following dimensions: behavior, property, technology, language, and resource. | 1024 | Comparison of Incompatible Types | ParentOf | Base - a weakness
that is still mostly independent of a resource or technology, but with sufficient details to provide specific methods for detection and prevention. Base level weaknesses typically describe issues in terms of 2 or 3 of the following dimensions: behavior, property, technology, language, and resource. | 1025 | Comparison Using Wrong Factors | ParentOf | Class - a weakness that is described in a very abstract fashion, typically independent of any specific language or technology. More specific than a Pillar Weakness, but more general than a Base Weakness. Class level weaknesses typically describe issues in terms of 1 or 2 of the following dimensions: behavior, property, and resource. | 1039 | Automated Recognition Mechanism with Inadequate Detection or Handling of Adversarial Input Perturbations | ParentOf | Variant - a weakness
that is linked to a certain type of product, typically involving a specific language or technology. More specific than a Base weakness. Variant level weaknesses typically describe issues in terms of 3 to 5 of the following dimensions: behavior, property, technology, language, and resource. | 1077 | Floating Point Comparison with Incorrect Operator | ParentOf | Base - a weakness
that is still mostly independent of a resource or technology, but with sufficient details to provide specific methods for detection and prevention. Base level weaknesses typically describe issues in terms of 2 or 3 of the following dimensions: behavior, property, technology, language, and resource. | 1254 | Incorrect Comparison Logic Granularity | CanFollow | Variant - a weakness
that is linked to a certain type of product, typically involving a specific language or technology. More specific than a Base weakness. Variant level weaknesses typically describe issues in terms of 3 to 5 of the following dimensions: behavior, property, technology, language, and resource. | 481 | Assigning instead of Comparing |
Modes Of Introduction The different Modes of Introduction provide information about how and when this weakness may be introduced. The Phase identifies a point in the life cycle at which introduction may occur, while the Note provides a typical scenario related to introduction during the given phase. Demonstrative Examples Example 1 Consider an application in which Truck objects are defined to be the same if they have the same make, the same model, and were manufactured in the same year. (bad code) Example Language: Java
public class Truck {
private String make; private String model; private int year;
public boolean equals(Object o) {
if (o == null) return false; if (o == this) return true; if (!(o instanceof Truck)) return false;
Truck t = (Truck) o;
return (this.make.equals(t.getMake()) && this.model.equals(t.getModel()));
}
}
Here, the equals() method only checks the make and model of the Truck objects, but the year of manufacture is not included. Example 2 This example defines a fixed username and password. The AuthenticateUser() function is intended to accept a username and a password from an untrusted user, and check to ensure that it matches the username and password. If the username and password match, AuthenticateUser() is intended to indicate that authentication succeeded. (bad code) Example Language: C
/* Ignore CWE-259 (hard-coded password) and CWE-309 (use of password system for authentication) for this example. */
char *username = "admin"; char *pass = "password";
int AuthenticateUser(char *inUser, char *inPass) { if (strncmp(username, inUser, strlen(inUser))) { logEvent("Auth failure of username using strlen of inUser"); return(AUTH_FAIL); } if (! strncmp(pass, inPass, strlen(inPass))) { logEvent("Auth success of password using strlen of inUser"); return(AUTH_SUCCESS); } else { logEvent("Auth fail of password using sizeof"); return(AUTH_FAIL); } }
int main (int argc, char **argv) {
int authResult; if (argc < 3) { ExitError("Usage: Provide a username and password"); } authResult = AuthenticateUser(argv[1], argv[2]); if (authResult == AUTH_SUCCESS) { DoAuthenticatedTask(argv[1]); } else { ExitError("Authentication failed"); } }
In AuthenticateUser(), the strncmp() call uses the string length of an attacker-provided inPass parameter in order to determine how many characters to check in the password. So, if the attacker only provides a password of length 1, the check will only examine the first byte of the application's password before determining success. As a result, this partial comparison leads to improper authentication (CWE-287). Any of these passwords would still cause authentication to succeed for the "admin" user: This significantly reduces the search space for an attacker, making brute force attacks more feasible. The same problem also applies to the username, so values such as "a" and "adm" will succeed for the username. While this demonstrative example may not seem realistic, see the Observed Examples for CVE entries that effectively reflect this same weakness. Observed Examples Reference | Description |
| Chain: Python-based HTTP Proxy server uses the wrong boolean operators ( CWE-480) causing an incorrect comparison ( CWE-697) that identifies an authN failure if all three conditions are met instead of only one, allowing bypass of the proxy authentication ( CWE-1390) |
| Chain: Proxy uses a substring search instead of parsing the Transfer-Encoding header ( CWE-697), allowing request splitting ( CWE-113) and cache poisoning |
| Proxy performs incorrect comparison of request headers, leading to infoleak |
Weakness Ordinalities Ordinality | Description |
Primary | (where the weakness exists independent of other weaknesses) |
Memberships This MemberOf Relationships table shows additional CWE Categories and Views that reference this weakness as a member. This information is often useful in understanding where a weakness fits within the context of external information sources. Vulnerability Mapping Notes Usage: DISCOURAGED (this CWE ID should not be used to map to real-world vulnerabilities) | Reason: Abstraction | Rationale: This CWE entry is extremely high-level, a Pillar. However, sometimes this weakness is forced to be used due to the lack of in-depth weakness research. See Research Gaps. | Comments: Where feasible, consider children or descendants of this entry instead. |
Notes Research Gap
Weaknesses related to this Pillar appear to be under-studied, especially with respect to classification schemes. Input from academic and other communities could help identify and resolve gaps or organizational difficulties within CWE.
Maintenance This entry likely has some relationships with case sensitivity ( CWE-178), but case sensitivity is a factor in other types of weaknesses besides comparison. Also, in cryptography, certain attacks are possible when certain comparison operations do not take place in constant time, causing a timing-related information leak ( CWE-208). Content History Submissions |
---|
Submission Date | Submitter | Organization |
---|
2008-09-09 (CWE 1.0, 2008-09-09) | CWE Content Team | MITRE | | Modifications |
---|
Modification Date | Modifier | Organization |
---|
2008-11-24 | CWE Content Team | MITRE | updated Relationships, Taxonomy_Mappings | 2009-03-10 | CWE Content Team | MITRE | updated Related_Attack_Patterns | 2009-05-27 | CWE Content Team | MITRE | updated Description | 2011-03-29 | CWE Content Team | MITRE | updated Description | 2011-06-01 | CWE Content Team | MITRE | updated Common_Consequences | 2011-09-13 | CWE Content Team | MITRE | updated Relationships, Taxonomy_Mappings | 2012-05-11 | CWE Content Team | MITRE | updated Related_Attack_Patterns, Relationships | 2014-07-30 | CWE Content Team | MITRE | updated Relationships | 2017-05-03 | CWE Content Team | MITRE | updated Related_Attack_Patterns | 2017-11-08 | CWE Content Team | MITRE | updated Taxonomy_Mappings | 2018-03-27 | CWE Content Team | MITRE | updated Common_Consequences, Demonstrative_Examples, Description, Maintenance_Notes, Name, Observed_Examples, Relationships | 2019-01-03 | CWE Content Team | MITRE | updated Related_Attack_Patterns, Relationships | 2019-06-20 | CWE Content Team | MITRE | updated Related_Attack_Patterns | 2019-09-19 | CWE Content Team | MITRE | updated Relationships | 2020-02-24 | CWE Content Team | MITRE | updated Applicable_Platforms, Relationships, Type | 2020-06-25 | CWE Content Team | MITRE | updated Relationships | 2020-08-20 | CWE Content Team | MITRE | updated Related_Attack_Patterns | 2022-04-28 | CWE Content Team | MITRE | updated Related_Attack_Patterns | 2022-06-28 | CWE Content Team | MITRE | updated Observed_Examples | 2023-01-31 | CWE Content Team | MITRE | updated Description, Observed_Examples | 2023-04-27 | CWE Content Team | MITRE | updated Relationships | 2023-06-29 | CWE Content Team | MITRE | updated Mapping_Notes, Research_Gaps | Previous Entry Names |
---|
Change Date | Previous Entry Name |
---|
2018-03-27 | Insufficient Comparison | |
More information is available — Please edit the custom filter or select a different filter.
|