Skip to main content

Welcome to a Grasp lesson

Create a free account to keep studying and create your own study path.

Lesson 23

TOCTOU Zafiyetlerini Tespit Etme

Recommended resources

Merhaba, bir önceki dersimizde eşzamanlılık (concurrency) kaynaklı yarış koşullarını ve bu zafiyetlerin özellikle "limit aşımı" gibi senaryolarda nasıl istismar edildiğini inceledik. Orada, aynı kritik koda paralel olarak erişen iş parçacıkları arasındaki zamanlama farkına odaklanmıştık ve bu deseni Time-of-Check to Time-of-Use (TOCTOU) olarak adlandırmıştık.

Bu derste, TOCTOU kavramını eşzamanlılığın dar kalıplarından çıkarıp daha geniş bir perspektife taşıyacağız. Öğrenme hedefimiz, dosya işlemleri, veritabanı kontrolleri ve yetkilendirme kararlarında TOCTOU zafiyetlerini tespit etmektir. Bu zafiyet sınıfı, bir programın mantıksal akışının, bir saldırganın müdahalesiyle zaman içinde nasıl bozulabileceğini ve güvenlik kontrollerinin nasıl anlamsız hale gelebileceğini gösteren en zarif örneklerdendir.

TOCTOU Zafiyetinin Genelleştirilmiş Hali

Önceki dersimizdeki yarış koşulu, aynı işlemi yapan iki iş parçacığının yarışmasıydı. Bugün inceleyeceğimiz TOCTOU ise, genellikle iki farklı aktör arasındaki bir yarıştır: meşru uygulama ve saldırgan.

Bu zafiyetin temel deseni üç adımdan oluşur:

  1. Kontrol (Check): Uygulama, bir kaynağın (dosya, veritabanı kaydı, kullanıcı oturumu vb.) belirli bir özelliğini veya durumunu kontrol eder. Örneğin, "Bu dosya bir sembolik link mi?" veya "Kullanıcının yönetici yetkisi var mı?"
  2. Boşluk (Gap): Kontrol anı ile kaynağın kullanılacağı an arasında kritik bir zaman aralığı, yani "yarış penceresi" (race window) oluşur.
  3. Kullanım (Use): Uygulama, kontrolün hala geçerli olduğu varsayımıyla kaynak üzerinde bir işlem gerçekleştirir. Örneğin, dosyaya yazar veya yönetici işlevini çalıştırır.

Zafiyet, bir saldırganın bu kritik zaman boşluğunda kaynağın durumunu değiştirebilmesiyle ortaya çıkar. Bu, ilk kontrolü geçersiz kılar ve sonraki eylemin beklenmedik ve genellikle tehlikeli sonuçlar doğurmasına neden olur.

Bu teorik tanımı, pratik bir vaka analiziyle somutlaştıralım.

A.I. ve MCP Dünyasında Race Condition Güvenlik Açıkları Büyük Risk Yaratacak.

Bu videoda Mehmet İnce, TOCTOU zafiyetlerinin gelecekte, özellikle yapay zeka ajanlarının kullanıldığı mimarilerde neden daha büyük bir risk oluşturacağını tartışıyor. Konuşmanın bir bölümünde, zafiyetin en temel ve klasik örneklerinden birini mükemmel bir şekilde açıklıyor.

Lütfen videonun şu kısımlarını izleyin: TOCTOU Tanımı: Konuşmacı, zafiyetin temel mantığını, bir yetki kontrolü ile işlemin kendisi arasındaki zaman aralığının nasıl istismar edilebileceğini açıklayarak konuya giriş yapıyor. Dosya Sistemi Örneği: Bu bölüm, öğrenme hedefimizle doğrudan örtüşen mükemmel bir örnek sunuyor. Bir uygulamanın check_permission (izni kontrol et) ve write_file (dosyaya yaz) gibi iki ayrı fonksiyonu çağırdığı senaryoyu düşünün. Saldırganın bu iki çağrı arasına girerek dosya referansını nasıl değiştirebileceği ve uygulamanın yanlış bir dosyaya yazmasının nasıl sağlanabileceği anlatılıyor. Mimari Risk: Burada, eski monolitik API'lerin aksine, mikroservis veya agent tabanlı modern mimarilerde bu tür fonksiyonların ayrı ayrı "expose" edilmesinin TOCTOU riskini nasıl artırdığına dikkat çekiliyor. Bu, sizin gibi mimari tasarım sorumlulukları olan bir uzman için önemli bir bağlam sunar.

Videoda açıklanan check_permission -> write_file senaryosu, TOCTOU zafiyetlerinin en klasik ve tehlikeli türlerinden biridir: dosya sistemi manipülasyonu.


Vaka Analizi 1: Dosya Sisteminde TOCTOU

Dosya sistemindeki TOCTOU zafiyetleri genellikle, yüksek ayrıcalıklara sahip bir programın (örneğin root olarak çalışan bir servis) daha düşük ayrıcalıklı bir kullanıcının kontrolündeki bir alanda (örneğin /tmp dizini) dosya işlemleri yaptığında ortaya çıkar.

Aşağıdaki diyagram bu durumu görselleştirmektedir.

Bu diyagramda, ayrıcalıklı bir program (set-uid root) ve bir saldırgan programı arasındaki etkileşim gösterilmektedir. Ayrıcalıklı program, `/tmp/X` yolundaki bir dosyaya erişim iznini `access()` ile kontrol eder. Bu kontrol anı ile dosyayı `open()` ile açtığı an arasındaki "TOCTOU-window"da, saldırgan programı `/tmp/X`'i hassas bir sistem dosyasına (`/etc/passwd`) işaret eden bir sembolik link ile değiştirir. Sonuç olarak, ayrıcalıklı program, `/etc/passwd` dosyasına yazma işlemi yapar.

Bu teorik senaryonun daha karmaşık ve gerçekçi bir örneği, uygulama güncelleme mekanizmalarında karşımıza çıkabilir.

Bu sıralı diyagram, bir Electron uygulamasının güncelleme mekanizmasındaki bir TOCTOU zafiyetini göstermektedir. Süreç şu şekildedir: (6) Uygulama, indirilen güncelleme dosyasının imzasını ve hash'ini doğrular. (7) Bu *doğrulanmış* dosyayı geçici bir dizine kaydeder. (8) Tam bu sırada, saldırgan geçici dizindeki doğrulanmış dosyayı kötü amaçlı bir dosya ile değiştirir. (10-12) Uygulama, kurulum işlemine devam ederken geçici dizindeki değiştirilmiş dosyayı alır, kurar ve kötü amaçlı kodu çalıştırır.

Her iki örnekte de desen aynıdır:

  1. Kontrol: Sembolik link kontrolü veya dosya imza doğrulaması.
  2. Boşluk: Dosyanın diskte savunmasız kaldığı an.
  3. Kullanım: Dosyanın açılması veya kurulması.

Bir kod denetçisi olarak, access(), stat(), readlink() gibi kontrol fonksiyonlarını takiben aynı dosya yolu üzerinde open(), rename(), unlink() gibi işlem yapan fonksiyonları aramalısınız. Eğer bu iki işlem arasında dosyanın atomik olarak kilitlendiğine dair bir kanıt yoksa, potansiyel bir TOCTOU zafiyeti mevcuttur.


Vaka Analizi 2: Yetkilendirme ve Veritabanı Kontrolleri

TOCTOU sadece dosya işlemlerine özgü değildir. Aynı desen, yetkilendirme kararları ve veritabanı kontrollerinde de ortaya çıkabilir. Bu durumlar genellikle, bir iş akışının birden çok adımdan oluştuğu ve durumun zaman içinde değişebileceği senaryolarda görülür.

Örneğin, bir kullanıcının parolasını değiştirdiği bir senaryo düşünün:

  1. Kontrol (get_user_info): Uygulama, parola değiştirme formunu göstermek için önce kullanıcının bilgilerini ve mevcut yetkilerini veritabanından çeker.
  2. Boşluk: Kullanıcı yeni parolasını forma girerken, arka planda bir yönetici bu kullanıcının hesabını askıya alır veya yetkilerini kısıtlar. Veritabanındaki kullanıcı durumu değişir.
  3. Kullanım (update_password): Kullanıcı "Kaydet" butonuna bastığında, uygulama, ilk kontrolün hala geçerli olduğunu varsayarak parola güncelleme işlemini gerçekleştirir. Oysa kullanıcı artık askıya alınmış bir hesaba aittir ve bu işlemin engellenmesi gerekirdi.

Mehmet İnce'nin videosunda da bu senaryoya değiniliyor.

A.I. ve MCP Dünyasında Race Condition Güvenlik Açıkları Büyük Risk Yaratacak.

Aynı videoda, bu tür bir durum değişikliğinin modern mimarilerde nasıl bir risk oluşturabileceği açıklanıyor.

Lütfen bu kısa bölümü izleyin. Burada, get user info ve update password gibi iki metodun peş peşe çağrılması arasındaki zaman farkının, state (durum) değişikliğine yol açarak nasıl bir TOCTOU zafiyeti oluşturabileceği vurgulanmaktadır.

Bu tür zafiyetleri kodda tespit etmek için, çok adımlı iş akışlarını analiz etmeniz gerekir. Kendinize şu soruyu sorun: "Yetkilendirme veya durum kontrolü, işlemin yapıldığı kritik anda mı, yoksa akışın başında bir kez yapılıp sonra varsayıldı mı?"

Veritabanı seviyesindeki bu tür yarış koşullarını önlemenin en sağlam yolu, önceki derste de bahsettiğimiz gibi, atomik işlemler kullanmaktır. Bir veritabanı satırını önce okuyup sonra güncelleyecekseniz, bu satırı okuma anında kilitlemeniz gerekir. SELECT ... FOR UPDATE gibi SQL komutları tam olarak bu işe yarar. İşlem (transaction) bitene kadar başka hiçbir işlemin o satırı değiştirmesine izin vermez, böylece "kontrol" ve "kullanım" anlarını atomik bir bütün haline getirir.


Kod Analizi Stratejisi ve Endüstri Standartları

Bu dersin ışığında, bir kod denetçisi olarak TOCTOU zafiyetlerini avlamak için stratejinizi şu şekilde güncelleyebilirsiniz:

  1. Dosya Yolu Takibi: Kodda bir dosya yolunun (path) bir değişkende saklandığı ve bu değişkenin önce bir kontrol fonksiyonuna (access, stat vb.), ardından bir yazma/değiştirme fonksiyonuna (open, write, rename vb.) parametre olarak verildiği yerleri arayın.
  2. Geçici Dosya Kullanımını İnceleyin: Uygulamanın /tmp gibi genel yazma iznine sahip dizinlerde dosya oluşturduğu, doğruladığı ve sonra işlediği mekanizmaları özellikle inceleyin. Electron updater örneğinde olduğu gibi, doğrulama ve kullanım adımları arasındaki boşluklar en tehlikeli olanlardır.
  3. Çok Adımlı İş Akışlarını Haritalayın: Yetkilendirme kararları içeren karmaşık iş akışlarında, kritik eylemin gerçekleştirildiği fonksiyonda yetkinin yeniden doğrulanıp doğrulanmadığını kontrol edin. Yetki kontrolünün akışın başında yapılıp yapılmadığına güvenmeyin.
  4. Atomik Alternatifleri Arayın: Eğer kod, bir kaynağın varlığını kontrol edip sonra oluşturuyorsa (if not exists -> create), işletim sisteminin veya kütüphanenin bu işlemi atomik olarak yapan bir alternatifi olup olmadığını araştırın (örneğin, open komutunun O_CREAT | O_EXCL bayrakları).

Bu yaklaşım, OWASP ASVS (Uygulama Güvenliği Doğrulama Standardı) gibi endüstri standartlarıyla da tamamen uyumludur.

[PDF] OWASP Uygulama Güvenliği Doğrulama Standardı 4.0

ASVS, güvenli uygulamalar için bir gereksinimler listesi sunar. TOCTOU'nun ne kadar temel bir endişe olduğunu görmek için ilgili maddelere göz atalım.

Lütfen PDF'nin 54. sayfasındaki V11.1 İş Mantığı Güvenlik Gereksinimleri tablosuna bakın ve madde 11.1.6'yı okuyun. Bu madde, hassas operasyonların TOCTOU'dan etkilenmemesi gerektiğini açıkça belirtir. Ardından, 18. sayfadaki V1.11 İş Mantığı Mimari Gereksinimleri tablosuna gidin ve madde 1.11.3'ü inceleyin. Bu madde ise özellikle kimlik doğrulama ve erişim kontrolü gibi kritik akışların TOCTOU'ya karşı dirençli olmasını bir mimari gereksinim olarak ortaya koyar.

Bu standartlar, TOCTOU'nun sadece bir "implementasyon hatası" değil, aynı zamanda dikkate alınması gereken bir "tasarım ve mimari" sorunu olduğunu teyit eder.


Sonuç

Bu dersimizde TOCTOU zafiyetlerinin kapsamını, eşzamanlılık problemlerinin ötesine taşıyarak dosya sistemleri, yetkilendirme mantığı ve veritabanı işlemlerini de içerecek şekilde genişlettik.

Temel Çıkarımlar:

  • TOCTOU, bir kaynağın durumunun kontrol edildiği an (Check) ile kullanıldığı an (Use) arasındaki zaman boşluğunun (Gap) istismar edildiği genel bir zafiyet desenidir.
  • Bu desen, sadece paralel iş parçacıkları arasında değil, aynı zamanda uygulama ile harici bir saldırgan arasında da ortaya çıkabilir.
  • Dosya işlemlerinde, genellikle sembolik link manipülasyonu veya geçici dosya değişimi yoluyla istismar edilir. Kod analizi, aynı dosya yolunu kullanan kontrol ve işlem fonksiyon çiftlerini aramalıdır.
  • Yetkilendirme ve veritabanı kontrollerinde, çok adımlı iş akışları sırasında durumun değişebileceği varsayımıyla hareket edilmelidir. Çözüm, kritik eylemlerden hemen önce yetkiyi ve durumu yeniden doğrulamaktır.
  • Nihai çözüm atomikliktir. İşlemleri ya işletim sistemi/veritabanı seviyesinde atomik hale getirmek (örn: SELECT ... FOR UPDATE) ya da "kontrol et ve kullan" adımlarını mantıksal olarak birbirinden ayrılamaz tek bir birim olarak tasarlamak gerekir.

Önceki derslerimizde durum geçişlerinin sırasını ve zamanlamasını inceledik. Bir sonraki dersimizde, işler ters gittiğinde ne olacağına odaklanacağız. "Hata yönetimi ve yeniden deneme mantığında istismar edilebilir durum tutarsızlıkları ve kısmi geri alma açıklarını analiz etmek" konusunu ele alarak, bir uygulamanın hatalardan kurtulmaya çalışırken istemeden nasıl yeni güvenlik açıkları yaratabileceğini göreceğiz.