AWS API Gateway kimlik doğrulama bypass zafiyeti, ters eğik çizgi ile yetkilendirme atlatma.

AWS API Gateway Bypass: Tek Bir Ters Eğik Çizgiyle $12K Ödül!

AWS API Gateway Yetkilendirmesi Tek Bir Karakterle Nasıl Atlatıldı?

Bir fintech’in mobil API’sinde yapılan rutin incelemeler sırasında şaşırtıcı bir güvenlik açığı keşfedildi. Normalde ‘GET /v1/accounts’ isteği 401 Unauthorized yanıtı verirken, aynı isteğin sonuna eklenen tek bir ters eğik çizgiyle (‘GET /v1/accounts/’) tam hesap verileriyle birlikte 200 OK yanıtı alındı. Bu tek karakterlik fark, sistemin güvenlik duruşunu tamamen değiştirdi.

İncelenen Altyapı ve Teknik Detaylar

API, AWS HTTP API üzerinde çalışıyordu; bu, REST API’ye göre daha yeni ve uygun maliyetli bir alternatiftir. Yetkilendirici (Lambda authorizer), bir JWT’yi (JSON Web Token) Cognito’ya karşı kontrol ederek bir IAM politikası döndürüyordu. Bu, standart bir kurulumdu.

OpenAPI’deki yönlendirmeler şu şekilde tanımlanmıştı:

/v1/accounts:
  get:
    x-amazon-apigateway-integration:
      uri: arn:aws:apigateway:...

/v1/accounts/{accountId}:
  get:
    x-amazon-apigateway-integration:
      uri: arn:aws:apigateway:...

Yetkilendirici her istekte çalışmasına rağmen, HTTP API iki karar veriyordu: bu yol mevcut mu ve yetkilendirici buna izin veriyor mu? Bu iki katman, bir ‘eşleşmenin’ ne anlama geldiği konusunda aynı fikirde değildi.

Şaşırtıcı Sonuçlar ve Bypass Mekanizması

Yol üzerinde yapılan ‘ffuf’ taraması tutarsız sonuçlar verdi:

  • `GET /v1/accounts` => 401 Unauthorized
  • `GET /v1/accounts/` => 200 OK + tam veri
  • `GET /v1/accounts//` => 200 OK
  • `GET /v1/accounts?foo=bar` => 401 Unauthorized
  • `GET /v1/accounts%2f` => 404 Not Found

Desen şuydu: bir yol önekine uyan herhangi bir yol, yetkilendiriciyi tetikliyor, ardından yetkilendirme yeniden kontrol edilmeksizin entegrasyona düşüyordu.

HTTP API varsayılan olarak ‘açgözlü yol eşleştirme’ (greedy path matching) kullanır. Bu durumda, ‘/v1/accounts/’ ifadesi ‘/v1/accounts’ ile bir önek olarak eşleşti. Yetkilendirici çalıştı ve ‘İzin Ver’ yanıtını döndürdü. Ancak entegrasyon eşlemesi belirsizdi. Yol yeniden yazıldı, yetkilendirme bağlamı düşürüldü ve aniden geçerli bir JWT olmadan erişim sağlandı.

Bypass Nasıl Gerçekleşti?

Detaylı incelemede, API Gateway’in ‘açgözlü eşleşme’ mekanizmasının ters eğik çizgi içeren yolu yeniden yazdığı, eğik çizgiyi kaldırdığı ve ‘/v1/accounts’ entegrasyonuna yönlendirdiği ortaya çıktı. Yetkilendirme kontrolü orijinal yol üzerinde gerçekleşti, ancak entegrasyon yeniden yazılan yol üzerinde çalıştı ve bu yeniden yazma işlemi yetkilendirme bağlamını kaybetti. Yazar, özel bir başlık kullanarak bunu doğruladı: ‘/v1/accounts/’ çağrıldığında, entegrasyon ‘userId: undefined’ aldı ve ‘userId’ değerini doğrulamadı. Bu, API anahtarı için tüm hesapları döndürmesine neden oldu, ki bu da JWT ile yetkilendirilmesi gereken bir durumdu.

Zafiyetin Gerçek Etkisi ve Düzeltmeler

Aynı bypass, ‘POST /v1/transfers/’ üzerinde de çalıştı. Geçerli bir JWT olmadan para transferleri başlatılabiliyordu. Arka uç, ‘fromAccount’ın kullanıcıya ait olup olmadığını kontrol ediyordu, ancak ‘userId’ tanımsız olduğu için varsayılan olarak bir sistem hesabına yönlendirildi. Yazar, 0.01 dolarlık bir test transferi başlattı ve transfer başarıyla gerçekleşti.

Zafiyetin bildirilmesi üzerine, fintech ertesi gün düzeltmeleri uyguladı:

  • HTTP API’den REST API’ye geçiş (daha sıkı yol eşleştirme).
  • Her Lambda’da, sadece yetkilendiricide değil, ‘userId’ doğrulamasının eklenmesi.

Bu keşif için 12.000 dolarlık bir ödül alındı.

Comments

No comments yet. Why don’t you start the discussion?

    Bir yanıt yazın

    E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir