Tüm yazılar

#yazılım hataları#yazılım geliştirme#yazılım testi

Tarihin En Pahalı Yazılım Hataları: Tek Satır Kod Nasıl Milyarlar Yaktı?

Bir roketi 37 saniyede patlatan, bir şirketi 45 dakikada batıran ve 8,5 milyon bilgisayarı çökerten hatalar. Hiçbirinde hacker yok; hepsi gözden kaçan tek bir küçük ayrıntı.

Tarihin En Pahalı Yazılım Hataları: Tek Satır Kod Nasıl Milyarlar Yaktı?
İçindekiler 11

Tarihin en pahalı yazılım hataları çoğu zaman tek bir satırdan doğdu: yanlış bir birim, sığmayan bir sayı, sunuculardan birine yüklenmeyi unutulan kod. Bu yazıda bir roketi 37 saniyede patlatan, bir şirketi 45 dakikada batıran ve 8,5 milyon bilgisayarı aynı sabah mavi ekrana düşüren yazılım hatalarını, gerçek raporlara dayanarak anlatıyoruz.

Kısaca:

  • Ariane 5 roketi, 64 bitlik bir sayının 16 bitlik bir değişkene sığmaması yüzünden kalkıştan 37 saniye sonra yok edildi.
  • Knight Capital, sekiz sunucudan birine eski kodun kalması nedeniyle 45 dakikada 460 milyon dolardan fazla kaybetti.
  • 2024'teki CrowdStrike güncellemesi 8,5 milyon Windows cihazı çökertti; Fortune 500 şirketlerinin zararı 5,4 milyar dolar olarak hesaplandı.
  • Bir sonraki büyük tarih hatası 19 Ocak 2038'de bekliyor ve hâlâ çözülmüş değil.

Bu hikâyelerin ortak noktası şu: hiçbirinde kötü niyetli bir hacker yok. Hepsi, işini yapmaya çalışan iyi mühendislerin gözden kaçırdığı küçük bir ayrıntı. İşte tam da bu yüzden ürkütücüler.

1. Mars Climate Orbiter (1999): Pound ile Newton'un kavgası

NASA'nın Mars Climate Orbiter aracı dokuz ay yol aldıktan sonra, 23 Eylül 1999'da Mars'a vardığı anda sessizliğe gömüldü. Araştırma, sebebin uzay kadar büyük değil, bir fizik ödevi kadar küçük olduğunu gösterdi.

Yer kontrolünde çalışan yazılım, motor itkisini pound-force saniye (İngiliz birimi) cinsinden hesaplıyordu. Aracın navigasyon yazılımı ise aynı değeri newton saniye (metrik) bekliyordu. Bir pound-force yaklaşık 4,45 newton ettiği için, her düzeltme manevrası sistematik olarak yanlış hesaplandı. Araç planlanandan çok daha alçaktan yaklaştı ve Mars atmosferinde yanıp yok oldu.

Ders: İki sistem arasındaki sözleşme (API, veri formatı, birim) yazılı ve test edilmiş değilse, iki taraf da "doğru" çalışırken sonuç felaket olabilir.

2. Ariane 5 Uçuş 501 (1996): 37 saniyelik havai fişek

4 Haziran 1996'da Avrupa Uzay Ajansı'nın yeni roketi Ariane 5, ilk uçuşunda kalkıştan yaklaşık 37 saniye sonra rotasından saptı ve kendini imha etti. Üzerinde dört adet Cluster bilim uydusu vardı. Kayıp genellikle 370 milyon dolar civarında tahmin edilir.

ESA'nın soruşturma kurulu raporuna göre hata şuydu: roketin atalet referans sistemi, yatay hızla ilgili 64 bitlik bir ondalık sayıyı 16 bitlik işaretli bir tam sayıya dönüştürmeye çalıştı. Ariane 5, selefi Ariane 4'ten çok daha hızlı olduğu için sayı 32.767 sınırını aştı ve taşma (overflow) hatası oluştu. Yedek sistem de birebir aynı yazılımı çalıştırdığı için o da aynı nedenle, birkaç milisaniye önce çökmüştü.

İşin en acı tarafı: bu hesaplama kalkıştan sonra hiçbir işe yaramıyordu. Kod, Ariane 4'ten olduğu gibi taşınmıştı ve orada sorunsuz çalıştığı için yeni rokete göre yeniden test edilmemişti.

Ders: "Başka yerde çalışıyordu" bir test sonucu değildir. Yeniden kullanılan kod, yeni ortamın sınırlarıyla yeniden sınanmalı.

3. Therac-25 (1985–1987): Hızlı yazan operatör

Yazılım hatalarının en karanlık örneği bir radyoterapi cihazından geliyor. Therac-25, 1985 ile 1987 arasında altı hastaya normalin yüzlerce katı radyasyon verdi; bu kazalarda en az üç kişi hayatını kaybetti.

Nancy Leveson ve Clark Turner'ın klasikleşmiş incelemesi, sorunun bir yarış durumu (race condition) olduğunu ortaya koydu. Deneyimli bir operatör tedavi ayarlarını birkaç saniye içinde hızlıca düzelttiğinde, yazılım bu değişikliği fark etmeden yüksek enerjili ışını hazırlıyordu. Ekranda yalnızca anlamsız bir "Malfunction 54" mesajı çıkıyordu ve operatörler cihazı yeniden başlatıp devam edebiliyordu.

Önceki modellerde bu tür hataları fiziksel olarak engelleyen donanım kilitleri vardı. Therac-25'te bu güvenlik tamamen yazılıma emanet edilmişti.

Ders: Hayati sistemlerde güvenlik tek bir katmana bırakılmaz. Anlaşılmaz hata mesajları da en az hatanın kendisi kadar tehlikelidir.

4. Patriot füzesi (1991): Saniyenin onda biri

Körfez Savaşı sırasında, 25 Şubat 1991'de Suudi Arabistan'ın Dahran kentindeki Patriot hava savunma bataryası gelen bir Scud füzesini durduramadı. Füze bir ABD kışlasına isabet etti ve 28 asker hayatını kaybetti.

ABD Sayıştayı'nın (GAO) raporu sebebi açıkladı: sistem zamanı saniyenin onda biri (0,1) adımlarla sayıyordu. Ancak 0,1 sayısı ikili sistemde tam olarak ifade edilemez; tıpkı 1/3'ün ondalık olarak 0,333… diye sonsuza gitmesi gibi. Sistem 24 bitlik bir kayıtla çalıştığı için her adımda çok küçük bir yuvarlama hatası birikti. Batarya yaklaşık 100 saattir kesintisiz açıktı ve biriken sapma 0,34 saniyeye ulaşmıştı. Saniyede 1,6 kilometreden hızlı giden bir füze için bu, radarın yanlış yere bakması demekti.

Yazılım düzeltmesi, saldırıdan bir gün sonra bölgeye ulaştı.

Ders: Kayan noktalı sayılar gerçek sayılar değildir. Uzun süre çalışan sistemlerde küçük hatalar sessizce büyür.

5. Knight Capital (2012): 45 dakikada iflasın eşiği

1 Ağustos 2012 sabahı, ABD'nin en büyük borsa aracılarından Knight Capital'in otomatik alım satım sistemi çıldırdı. ABD Menkul Kıymetler ve Borsa Komisyonu'nun (SEC) raporuna göre sistem, yalnızca 212 müşteri emrini karşılamaya çalışırken piyasaya 4 milyondan fazla emir gönderdi, 397 milyon hisse işlem gördü ve şirket 460 milyon dolardan fazla zarar etti. Knight kısa süre sonra kurtarılmak zorunda kaldı ve rakibiyle birleşti.

Sebep bir deployment hatasıydı. Yeni bir borsa programı için yazılan kod sekiz sunucudan yalnızca yedisine yüklendi. Sekizinci sunucuda yıllardır kullanılmayan eski bir fonksiyon duruyordu ve yeni kod, bu eski fonksiyonu tetikleyen bir bayrağı yeniden kullanıyordu. Sistem piyasa açılmadan önce 97 uyarı e-postası gönderdi; kimse bunları bir alarm olarak görmedi.

Ders: Ölü kod ölü değildir, sadece uyuyordur. Otomatik ve tekrarlanabilir deployment, "herkes elle kopyalıyor" düzeninden her zaman daha güvenlidir.

6. left-pad (2016): 11 satır interneti durdurdu

22 Mart 2016'da bir geliştirici, bir isim anlaşmazlığı yüzünden npm'deki tüm paketlerini kaldırdı. Bunlardan biri, bir metnin soluna boşluk ekleyen yaklaşık 11 satırlık left-pad paketiydi.

Sorun şu ki, left-pad doğrudan ya da dolaylı olarak Babel ve React gibi dev projelerin bağımlılık zincirindeydi. Dünyanın dört bir yanında JavaScript projeleri bir anda derlenemez hâle geldi. npm, paketi kısa süre içinde geri getirdi ve sonrasında yayınlanmış paketlerin kaldırılmasını ciddi biçimde kısıtlayan yeni kurallar koydu.

Ders: Uygulamanız yalnızca sizin yazdığınız koddan oluşmuyor. Her bağımlılık, kontrolünüz dışında bir risk demek; kilit dosyaları (lockfile) ve bağımlılık denetimi bu yüzden var.

7. CrowdStrike (2024): Dünyanın en büyük mavi ekranı

19 Temmuz 2024 sabahı havalimanlarında uçuşlar durdu, hastanelerde randevular iptal edildi, bankalar ve televizyon kanalları yayından düştü. Sebep, siber güvenlik şirketi CrowdStrike'ın Falcon yazılımına gönderdiği sıradan bir içerik güncellemesiydi.

Microsoft'un tahminine göre güncelleme 8,5 milyon Windows cihazı çökertti. CrowdStrike'ın kök neden analizine göre yeni şablon 21 veri alanı bekliyordu, ancak sensöre yalnızca 20 alan veriliyordu. Yazılım olmayan 21. alanı okumaya çalıştı, bellek dışına çıktı ve işletim sisteminin çekirdeğinde çalıştığı için bilgisayarı da beraberinde götürdü. Hatalı dosya yaklaşık 78 dakika sonra geri çekildi, ancak cihazların büyük kısmı tek tek elle kurtarılmak zorunda kaldı.

Sigorta analiz şirketi Parametrix, yalnızca ABD'deki Fortune 500 şirketlerinin doğrudan zararını 5,4 milyar dolar olarak hesapladı.

Yazılım hatalarının bilinen maliyeti (milyon $)
CrowdStrike (2024, Fortune 500)5400 milyon $
Knight Capital (2012)460 milyon $
Ariane 5 (1996)370 milyon $
Mars Climate Orbiter (1999)125 milyon $

Kaynak: SEC, ESA, NASA ve Parametrix raporları

Ders: Aşamalı dağıtım (önce küçük bir cihaz grubu, sonra herkes) bir lüks değil, sigortadır. Bir güncelleme ne kadar "küçük" görünürse görünsün, bütün cihazlara aynı anda gönderilmemeli.

Sıradaki büyük hata: 19 Ocak 2038

Birçok sistem zamanı, 1 Ocak 1970'ten beri geçen saniye sayısı olarak 32 bitlik işaretli bir tam sayıda tutar. Bu sayının alabileceği en büyük değer 2.147.483.647'dir ve o saniye 19 Ocak 2038, 03:14:07 UTC'de dolacak. Bir saniye sonra sayaç eksiye döner ve bu sistemler kendilerini 13 Aralık 1901'de sanır.

Modern işletim sistemleri ve diller çoktan 64 bitlik zamana geçti. Ama gömülü cihazlar, eski veritabanı alanları, endüstriyel kontrol sistemleri ve yıllardır güncellenmeyen kodlar hâlâ risk altında. 2000 yılı (Y2K) sorunu, milyarlarca dolarlık önleyici çalışma sayesinde büyük bir krize dönüşmemişti. 2038 için de benzer bir hazırlık gerekiyor ve bu tarih, bugün yazılan kodun çoğunun hâlâ kullanımda olacağı kadar yakın.

Bu hatalardan çıkan 5 pratik kural

Tarihin en pahalı yazılım hataları, bugün her ekibin uygulayabileceği dersler bırakıyor:

  1. Sınırları test edin. En büyük sayı, en küçük sayı, boş değer, taşan değer. Ariane 5 ve 2038 aynı hatanın iki yüzü.
  2. Birimleri ve sözleşmeleri yazılı hâle getirin. Sistemler arası her veri alanı için tip, birim ve format belli olmalı.
  3. Deployment'ı otomatikleştirin. Elle yapılan her adım, Knight Capital'in sekizinci sunucusu olmaya adaydır.
  4. Aşamalı dağıtın ve geri almayı kolaylaştırın. Güncellemeleri önce küçük bir gruba gönderin; bir sorun çıktığında tek tıkla geri dönün.
  5. Uyarıları anlamlı kılın. "Malfunction 54" ya da okunmayan 97 e-posta, hiç uyarı olmamasından farksız.

EngerekTech'te web, mobil ve kurumsal yazılım projelerinde otomatik testleri, CI/CD hatlarını ve kademeli yayını en baştan kurmamızın sebebi tam olarak bu hikâyeler.

Sıkça sorulan sorular

Tarihin en pahalı yazılım hatası hangisi?

Doğrudan ölçülebilen zarar açısından 2024'teki CrowdStrike kesintisi öne çıkıyor: yalnızca ABD'deki Fortune 500 şirketlerinin zararı 5,4 milyar dolar olarak tahmin edildi. Tek bir şirketin kısa sürede yaşadığı kayıp olarak ise Knight Capital'in 45 dakikada kaybettiği 460 milyon dolar en çarpıcı örneklerden biri.

Yazılım hataları neden bu kadar büyük zararlara yol açıyor?

Çünkü yazılım aynı hatayı saniyede milyonlarca kez ve binlerce cihazda aynı anda tekrarlayabilir. Bir insanın yapacağı hata tek bir işlemi etkilerken, otomatik bir sistemin hatası tüm işlemleri etkiler.

2038 problemi gerçekten bir tehlike mi?

Güncel bilgisayarlar ve telefonlar büyük ölçüde güvende, çünkü zamanı 64 bitlik sayılarla tutuyorlar. Risk; eski gömülü cihazlarda, 32 bitlik zaman alanı kullanan veritabanlarında ve uzun süredir güncellenmeyen sistemlerde. Bu sistemlerin 2038'den önce taranıp güncellenmesi gerekiyor.

Bu tür hatalar nasıl önlenir?

Tek bir yöntem yok; katmanlı bir yaklaşım gerekiyor: sınır değer testleri, kod incelemesi, otomatik deployment, aşamalı yayın, izleme ve anlamlı alarmlar. Hataların çoğu tek bir önlemi değil, birkaç önlemi birden atladığı için felakete dönüşüyor.

Kaynaklar

esa.intAriane 501 - Presentation of Inquiry Board reportMars Climate Orbiter - NASA ScienceNASA ScienceMars Climate Orbiter - NASA ScienceDesigned to study Mars from orbit and serve as a communications relay for the Mars Polar Lander and Deep Space probes, the Mars Climate Orbiter was unsuccessful due to a navigation error; an investigation found that the spacecraft burned up in Mars' atmosphere.U.S. Securities and Exchange CommissionSEC Charges Knight Capital With Violations of Market Access RuleU.S. GAO - Patriot Missile Defense: Software Problem Led to System Failure at Dhahran, Saudi ArabiaPatriot Missile Defense: Software Problem Led to System Failure at Dhahran, Sau…U.S. GAO - Patriot Missile Defense: Software Problem Led to System Failure at Dhahran, Saudi ArabiaPursuant to a congressional request, GAO reviewed the facts associated with the failure of a Patriot missile defense system in Dhahran, Saudi Arabia...web.stanford.eduLeveson & Turner: An Investigation of the Therac-25 Accidentsnpm Blog Archive: kik, left-pad, and npmblog.npmjs.orgnpm Blog Archive: kik, left-pad, and npmnpm Blog (Archive); updates from the npm team are now published on the GitHub Blog and the GitHub ChangelogHelping our customers through the CrowdStrike outage - The Official Microsoft BlogThe Official Microsoft BlogHelping our customers through the CrowdStrike outage - The Official Microsoft BlogOn July 18, CrowdStrike, an independent cybersecurity company, released a software update that began impacting IT systems globally. Although this was not a Microsoft incident, given it impacts our ecosystem, we want to provide an update on the steps we’ve taken with CrowdStrike and others to remedi…parametrixinsurance.comCrowdStrike's Impact on the Fortune 500Parametrix's in-depth analysis on CrowdStrike outage calculates direct financial loss and insured loss for the Fortune 500 companies.
PaylaşLinkedInXWhatsApp
Bu konuda yardıma mı ihtiyacınız var?

Yazıda anlattıklarımızı kendi projenize uygulamak isterseniz birlikte bakalım.

Bize yazın
YE

EngerekTech’in kurucusu. İşletmeler için web, mobil ve kurumsal yazılım geliştiriyor; Angular, Spring Boot ve Flutter ile çalışıyor, KPSS Düello ve Kelime Kavanozu uygulamalarını geliştirdi. Blogda yapay zekâ araçlarını ve yazılım geliştirmeyi kendi projelerinde kullandığı haliyle anlatıyor.