Atomicity violation¶
Kesintisiz çalıştığı varsayılan bir code region başka bir thread tarafından interleave edilir ve shared state'e yapılan birden fazla erişim boyunca bir invariant kırılır.
Mechanism¶
Note
Lu, Park, Seo & Zhou'ya göre, "Learning from Mistakes" (ASPLOS 2008), bir atomicity-violation bug'ı şudur: "bir code region'ının istenen atomicity'si ihlal edilir; yani birden fazla thread'den gelen memory erişimlerinin unserializable interleaving'i." Programcı bir check-and-use (ya da read-modify-write) region'ının bölünemez olduğunu varsaydı, ama değil; bu yüzden eşzamanlı bir thread aradaki boşlukta shared state'i mutate eder — eşdeğer bir serial execution'ı olmayan bir interleaving üretir.
MITRE CWE-362, ihlali race'i yaratan iki özelliği kodifiye eder: Atomicity — "başka hiçbir thread veya process aynı instruction dizisini … aynı resource'a karşı eşzamanlı olarak yürütemez" — ve Exclusivity.
Warning
Bunu bir ordering violation'dan ayır: orada iki erişim arasındaki göreli sıra ters döner (örn. use-before-init) ve bir condition variable ile düzeltilir. Bir atomicity violation ise bölünmez olması gereken bir region'ın bölünmesi/interleave edilmesidir ve tüm erişimleri kapsayacak şekilde bir lock'u genişleterek düzeltilir.
Walkthrough¶
Kanonik MySQL proc_info atomicity violation'ı:
// Thread 1 // Thread 2
if (thd->proc_info != NULL) {
thd->proc_info = NULL; // interleaves here
fputs(thd->proc_info, ...); // NULL-deref crash
}
Beklenen davranış: check-then-use atomic varsayılır, ama Thread 2 aradaki boşlukta pointer'ı null'lar → NULL dereference / crash. Bir exploitation bağlamında free'lenen/swap'lanan object kontrol edilebilir; bu da ihlal edilen invariant'ı bir use-after-free ya da double-fetch TOCTOU'ya çevirir.
Fix — check-and-use'u gerçekten atomic yap:
pthread_mutex_lock(&m);
if (thd->proc_info) fputs(thd->proc_info, f); // both accesses under one lock
pthread_mutex_unlock(&m);
// Thread 2 also takes &m before writing proc_info
Detection¶
- Dinamik race detector'lar: ThreadSanitizer (TSan), Helgrind/DRD.
- Atomicity'ye özgü araçlar (AVIO, atomizer) amaçlanan atomic region'ları çıkarsar ve unserializable interleaving'leri işaretler.
Mitigation¶
- Shared invariant'a yapılan tüm erişimleri aynı lock ile kapsa; sadece check'i lock'lama.
- Read-modify-write counter'lar için atomic type'lar /
compare_exchangekullan. - Çok adımlı bir karardan önce shared data'yı bir local'e snapshot'la.