Gizemli bir hata, Şubat ayından bu yana büyük bir teknoloji şirketinin arama motoru projesini rahatsız etti ve indeks oluşturma sürecini rastgele başarısızlığa uğrattı. Sorun, dizin oluşturma sırasında kısmi dizinleri birleştiren kodla ilgilidir.
Baş mühendis Jane Doe, “Arama motoru, bellek gereksinimlerini azaltmak için daha küçük endekslerin ardışık birleştirilmesi yoluyla ters dizini oluşturuyor” diye açıkladı. “Birdenbire bu endeksleri birleştiren kod rastgele hata vermeye başladı.”
Böceğin Endeks Oluşturma Üzerindeki Etkisi
Arama motoru, daha küçük endekslerin ardışık birleştirilmesi yoluyla ters bir dizin oluşturarak çalışır; bu, bellek gereksinimlerini azaltmak için gerekli olan bir süreçtir.
Ters indeks iki dosyadan oluşur: biri ofset işaretçilerini içerir, diğeri ise sıralanmış sayıları içerir. Bu işlem, her bölümün taranmasını ve işlenmesini tamamladıktan sonra başlatılır ve çalışması genellikle yaklaşık dört saat sürer.
Ancak geliştiriciler, endekslerin birleştirilmesinden sorumlu kodda ani ve rastgele bir hatayla karşılaştı.
Bu hata, sıralanan sayıların eski bir dizinden yeni bir dizine kopyalanması sırasında, bir anahtar kelimenin dizinlerden yalnızca birinde mevcut olduğu ve dolayısıyla gerçek bir birleştirme gerektirmediği durumlarda meydana geldi.
Trustifi’nin Gelişmiş tehdit koruması, en geniş yelpazedeki karmaşık saldırıları, kullanıcının posta kutusuna ulaşmadan önce önler. Diğer e-posta güvenlik çözümlerinin kaçırdığı kimlik avı saldırılarının %99’unu durdurur. .
Ücretsiz Demoyu Deneyin
Soruşturma ve Sorun Giderme
Rapora göre, dizin yapısı bu tür hataların yaygın olduğu 1-32 GB dosya boyutu aralığında çalıştığından, ilk şüpheler 32 bitlik bir tam sayı taşmasına işaret ediyordu.
Kapsamlı kod incelemelerine ve koruma hükümleri ile iddiaların eklenmesine rağmen, kopyalama işleminin dosyanın dışına kopyalamaya çalışması nedeniyle sorun devam etti.
Şaşırtıcı bir şekilde, sorun giderme sırasında inşaat süreci başarıyla tamamlandı, ancak sonraki çalıştırmalarda sorun yeniden ortaya çıktığı için başarı kısa sürdü.
Paralel birleştirme sürecinin deterministik olmayan doğasının bir faktör olduğu düşünülüyordu ancak bu, kararsız davranışı tam olarak açıklamıyordu.
val = read-only mmapped file
not subject to change
counts = zeroed mmap:ed file
long offset = 0;
for (int i = 0; i < length; i++) {
counts[i] = val[i];
offset += val[i];
}
long size = 0;
for (int i = 0; i < length; i++) {
size += counts[i];
}
// ...
assert (size == offset);
// ...
truncate(size);
Ekip, sıkıcı ve zaman alıcı bir geçici çözüm olan süreci tekrar tekrar yeniden başlatarak kalan bölümleri geçmeyi başardı.
Kodun Derinlemesine İncelemesi
Daha fazla araştırma, söz konusu kodun 64 bitlik uzunluklar kullanması ve ilgili değerlerin taşmaya neden olacak kadar büyük olmaması nedeniyle suçlunun tamsayı taşması olduğu ihtimalini ortadan kaldırdı. Birleştirilmiş dizini küçülten bir işlev de incelendi ancak bunun devre dışı bırakılması hataları çözmedi.
Kodda, hesaplanan iki boyutu karşılaştıran bir iddianın açıklanamaz bir şekilde başarısız olacağı ilginç bir anormallik keşfedildiğinde bir ilerleme meydana geldi. Bu, sorunun program mantığının dışında olabileceğinin farkına varılmasına yol açtı.
SOC ve DFIR Ekiplerinden misiniz? – Kötü Amaçlı Yazılım Olaylarını analiz edin ve ANY.RUN ile canlı Erişim elde edin -> Şimdi Ücretsiz Başlayın
Temel Sebebin Belirlenmesi
Ekip, Java Sanal Makinesini (JVM), Linux çekirdeğini ve donanımını sorunun potansiyel kaynakları olarak değerlendirdi. JVM baş şüpheliydi çünkü proje yakın zamanda OpenJDK'dan GraalVM'ye geçiş yapmıştı.
Donanım sorunları genellikle belirli bir işlevi tekrar tekrar hedeflemediğinden olası görülmedi. Benzer şekilde, hatanın farklı konfigürasyonlara sahip farklı makinelerde yeniden üretilmesinin ardından bir Linux çekirdeği hatası olasılığı azaltıldı.
Sonuçta, projenin Docker oluşturma sürecini GraalVM'den Temurin'e (OpenJDK) geçirmek sorunu çözdü ve arama motorunun bundan sonra doğru şekilde çalışması sağlandı.
Hata nominal olarak düzeltilmiş olsa da kesin nedeni hala belirsizliğini koruyor ve bu da ayrıntılı bir hata raporunun sunulmasını zorlaştırıyor. Geliştirici, hatayı ortaya çıkaran kodu izole etti ve sorunla tekrar karşılaşmadan kapsamlı testler gerçekleştirdi; bu da, tespit edilmesi zor, aralıklı bir sorun olduğunu düşündürdü.
Hatanın çözülmesi ekibe rahatlama sağlar, ancak altta yatan nedeni anlayamamak, kesin bir çözümden ziyade bir çıkmaz duygusu bırakır. Buna rağmen proje artık istikrarlı bir arama motoru dizin oluşturma süreciyle ilerleyebilir.
Secure your emails in a heartbeat! To find your ideal email security vendor, Take a Free 30-Second Assessment.