结构: Simple
Abstraction: Base
状态: Draft
被利用可能性: unkown
The software does not lock or does not correctly lock a resource when the software must have exclusive access to the resource.
When a resource is not properly locked, an attacker could modify the resource while it is being operated on by the software. This might violate the software's assumption that the resource will not change, potentially leading to unexpected behaviors.
Language: {'cwe_Class': 'Language-Independent', 'cwe_Prevalence': 'Undetermined'}
范围 | 影响 | 注释 |
---|---|---|
['Integrity', 'Availability'] | ['Modify Application Data', 'DoS: Instability', 'DoS: Crash, Exit, or Restart'] |
策略:
Use a non-conflicting privilege scheme.
策略:
Use synchronization when locking a resource.
The following function attempts to acquire a lock in order to perform operations on a shared resource.
bad C
However, the code does not check the value returned by pthread_mutex_lock() for errors. If pthread_mutex_lock() cannot acquire the mutex for any reason the function may introduce a race condition into the program and result in undefined behavior.
In order to avoid data races correctly written programs must check the result of thread synchronization functions and appropriately handle all errors, either by attempting to recover from them or reporting it to higher levels.
good C
This Java example shows a simple BankAccount class with deposit and withdraw methods.
bad Java
However, the deposit and withdraw methods have shared access to the account balance private class variable. This can result in a race condition if multiple threads attempt to call the deposit and withdraw methods simultaneously where the account balance is modified by one thread before another thread has completed modifying the account balance. For example, if a thread attempts to withdraw funds using the withdraw method before another thread that is depositing funds using the deposit method completes the deposit then there may not be sufficient funds for the withdraw transaction.
To prevent multiple threads from having simultaneous access to the account balance variable the deposit and withdraw methods should be synchronized using the synchronized modifier.
good Java
An alternative solution is to use a lock object to ensure exclusive access to the bank account balance variable. As shown below, the deposit and withdraw methods use the lock object to set a lock to block access to the BankAccount object from other threads until the method has completed updating the bank account balance variable.
good Java
映射的分类名 | ImNode ID | Fit | Mapped Node Name |
---|---|---|---|
PLOVER | Insufficient Resource Locking | ||
The CERT Oracle Secure Coding Standard for Java (2011) | VNA00-J | Ensure visibility when accessing shared primitive variables | |
The CERT Oracle Secure Coding Standard for Java (2011) | VNA02-J | Ensure that compound operations on shared variables are atomic | |
The CERT Oracle Secure Coding Standard for Java (2011) | LCK00-J | Use private final lock objects to synchronize classes that may interact with untrusted code | |
Software Fault Patterns | SFP19 | Missing Lock |