Concurrent Execution Using Shared Resource with Improper Synchronization ('Race Condition')
The product contains a code sequence that can run concurrently with other code, and the code sequence requires temporary, exclusive access to a shared resource, but a timing window exists in which the shared resource can be modified by another code sequence that is operating concurrently.
This can have security implications when the expected synchronization is in security-critical code, such as recording whether a user is authenticated or modifying important state information that should not be influenced by an outsider.
So behebst du diese Schwachstelle
Präventionsstrategien für Race Condition basierend auf 6 Shoulder-Erkennungsregeln.
Protect concurrent slice access with mutex or use channels to collect results
func collect(items []string) []string { - var results []string - for _, item := range items { - go func(i string) { - results = append(results, process(i)) - }(item) - } - time.Sleep(time.Second) + resultsCh := make(chan string, len(items)) + for _, item := range items { + go func(i string) { + resultsCh <- process(i) + }(item) + } + results := make([]string, 0, len(items)) + for i := 0; i < len(items); i++ { + results = append(results, <-resultsCh) + } return results }
Use thread-safe accessor methods or sync.RWMutex for concurrent map access
func getNodeName(node *Node) string { - name, ok := node.Attributes["name"].(string) + name, ok := node.GetAttrString("name") if !ok { return "" } return name }
Protect shared state with sync.Mutex, atomic operations, or sync.Map
- var counter int - func increment() { - go func() { - counter++ + var counter int64 + func increment() { + go func() { + atomic.AddInt64(&counter, 1) }() }
Use database transactions with row-level locking for atomic read-modify-write operations
app.post('/withdraw', async (req, res) => { - const account = await Account.findOne({ where: { userId } }); - if (account.balance >= amount) { - await account.update({ balance: account.balance - amount }); + const transaction = await db.transaction(); + try { + const account = await Account.findOne({ + where: { userId }, + lock: transaction.LOCK.UPDATE, + transaction + }); + if (account.balance < amount) { + await transaction.rollback(); + return res.status(400).json({ error: 'Insufficient funds' }); + } + await account.update({ balance: account.balance - amount }, { transaction }); + await transaction.commit(); + } catch (e) { + await transaction.rollback(); + throw e; } });
Use locks for shared data and atomic operations for file access
import threading counter = 0 - - def increment(): - global counter - counter += 1 + lock = threading.Lock() + + def increment(): + global counter + with lock: + counter += 1 threads = [threading.Thread(target=increment) for _ in range(100)]
Wichtige Praktiken
- Use data races, lost data, or panics
- Use race conditions
- Use of sync
Finden Sie Schwachstellen in Ihrem Code
Verwenden Sie Shoulder, um Ihren Code nach Concurrent Execution Using Shared Resource with Improper Synchronization ('Race Condition')-Mustern zu scannen. 6 Regeln.
# Scan with Shoulder CLI npx @shoulderdev/cli trust --cwe=362 # Or scan entire project npx @shoulderdev/cli trust .
Erkennungsregeln (6)
Worauf bei Code-Reviews zu achten ist
Diese Muster weisen auf potenzielle Concurrent Execution Using Shared Resource with Improper Synchronization ('Race Condition')-Schwachstellen hin. Achten Sie bei Code-Reviews und Sicherheitsaudits darauf.
Scanne deine Codebasis nach Concurrent Execution Using Shared Resource with Improper Synchronization ('Race Condition')
Shoulder CLI findet anfällige Muster in deiner gesamten Codebasis.