Skip to content

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_exchange kullan.
  • Çok adımlı bir karardan önce shared data'yı bir local'e snapshot'la.

References