SAML replay açığı: imzalı Assertion, imzasız Response zarfı
SAML SSO'da InResponseTo imzasız olduğu için silinip replay koruması atlatılabilir; doğru çözüm imzalı assertion ID'sine dayanmaktır.
Çoğu SAML tümleştirmesinde IdP, <Response> zarfını değil içindeki <Assertion>'ı imzalar. Ancak replay koruması genellikle Response üzerindeki InResponseTo alanına dayanır — imzanın kapsamadığı, isteğe bağlı ve silinebilir bir alan. Bir saldırgan gerçek bir SAML yanıtını yakalayıp yalnızca InResponseTo'yu silerse, imza hâlâ geçerli kalır çünkü imza zaten sadece assertion'ı kapsıyordu. SP tarafı bunu IdP-initiated (istenmemiş) giriş sanıp replay kontrolünü tamamen atlar ve aynı assertion sınırsız kez tekrar oynatılabilir hale gelir.
Bu, üç adımlık, sıfır kriptografi gerektiren pratik bir saldırı: yanıtı yakala, InResponseTo'yu sil, tekrar gönder. İmza doğrulama, sertifika, issuer ve tarih kontrolleri hepsi geçer; çünkü hiçbiri bu spesifik atlamayı yakalayacak şekilde tasarlanmamıştır.
Doğru çözüm daha fazla doğrulama değil, doğru alanı doğrulamaktır: replay koruması, imzanın kapsadığı ve her zaman var olan assertion ID'sine bağlanmalı, NotOnOrAfter ile sınırlı tek kullanımlık bir önbellekte tutulmalıdır. InResponseTo eşleşmesi ve unsolicited yanıtların reddi gibi kontroller savunma derinliği olarak kalmalı, ama asıl yük imzalanmış baytlar üzerinde olmalıdır. Mühendisler için genel ders açık: bir imza yalnızca 'bu anahtarın sahibi bu baytları üretti' der — tazelik, hedef ve tekrar kullanılmama garantisi vermez; bu üç kontrolün her biri imzanın gerçekten kapsadığı bir alana dayanmalıdır.