Doprecyzujmy - w grubych klientach lub aplikacjach mobilnych. Normalnie, w przypadku aplikacji webowych, testowanie transport layer security polega na sprawdzeniu jakie protokoły/szyfry są oferowane przez serwer. W takim scenariuszu ma to trochę sensu, bo to ostatecznie serwer decyduje co zostanie wynegocjowane a przeglądarki, jeśli nie są za stare, nie używają archaicznych protokołów i szyfrów.
Inaczej sytuacja wygląda w przypadku aplikacji (mobilnych, desktopowych). Może okazać się, że klient jest skłonny zaakceptować wszystko co popadnie łącznie z czymś, co nie daje właściwie żadnego bezpieczeństwa (głównie aNULL). Coś takiego aż prosi się o MitM.
Kiedy coś takiego może się stać? Generalnie jeśli programiści używają funkcji wbudowanych w platformę nie powinno być tragicznie. Klient może być skłonny zaakceptować SSLv3 (teoretycznie powinien zacząć od czegoś lepszego, patrz: graceful degradation), może też akceptować szyfry słabsze (i tutaj wchodzi temat negocjacji z serwerem). Gorzej, jeśli programista używa bezpośrednio funkcji niskopoziomowych i, na przykład, nie do końca rozumie jak działają cipher listy w OpenSSL.
Jak to sprawdzić? Zawsze dobrze zrobić zrzut ruchu i zobaczyć co proponuje klient w Client Hello, wygląda to mniej więcej tak:
Cipher Suites (11 suites)
Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (0xc02b)
Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)
Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (0xc00a)
Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (0xc009)
Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (0xc013)
Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (0xc014)
Cipher Suite: TLS_DHE_RSA_WITH_AES_128_CBC_SHA (0x0033)
Cipher Suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA (0x0039)
Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA (0x002f)
Cipher Suite: TLS_RSA_WITH_AES_256_CBC_SHA (0x0035)
Cipher Suite: TLS_RSA_WITH_3DES_EDE_CBC_SHA (0x000a)
I na większą skalę - jeśli ktoś ma możliwość monitorowania większego ruchu (ISP), to może być w stanie wychwycić ciekawe przypadki. Przez pewien czas monitorowałem z ciekawości swoją sieć i znalazłem takie kwiatki:
TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA (0x0011)
TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA (0x0014)
TLS_RSA_EXPORT_WITH_DES40_CBC_SHA (0x0008)
TLS_RSA_EXPORT_WITH_RC4_40_MD5 (0x0003)
Na widok tych dwóch pierwszych tak mi się Logjam przypomniał...
Muszę spróbować ustalić, która aplikacja coś takiego wyprawia ;)
UPDATE:
Wygląda na to, że "winowajcą" jest telefon Samsung Galaxy S3. Większość, ale nie wszystkie, Client Hello wysyłane z niego zawierają te ciekawe szyfry wspomniane powyżej. Hosty, z którymi się łączy, przedstawiają się certyfikatami wystawionymi dla:
aax-us-east.amazon-adsystem.com
api.accuweather.com
api.amazon.com
*.cloudfront.net
cognito-identity.us-east-1.amazonaws.com
*.crashlytics.com
device-metrics-us.amazon.com
*.googleapis.com
mads.amazon.com
*.manhattan.yahoo.com
sns.us-east-1.amazonaws.com
sts.amazonaws.com
www.google.com
*.yimg.com
yql.yahooapis.com
Jak widać - nazwy można łatwo zmapować co najmniej z kilkoma różnymi aplikacji. Czyli wygląda na to, że w tym przypadku jednak platforma. Ktoś chętny do podsłuchania swojego smartfona?
P.S: Android 4.3 nie powinien mieć tych szyfrów włączonych, co innego staroć 2.3.7.