Как выяснилось, операционная система Android использует крайне уязвимые RC4 и MD5 в качестве первого шифра по умолчанию для всех SSL-соединений. Проблема затрагивает приложения, в которых явно не прописано использование других шифров, то есть де-факто почти все приложения Android.
Что самое интересное, комбинацию RC4-MD5 стали использовать по умолчанию с декабря 2010 года, когда состоялся релиз Android 2.3. До этого момента в SSL использовалась более сильная криптография. Первым шифром по умолчанию была комбинация DHE-RSA-AES256-SHA.
Расследование показало, что ослабление шифра по умолчанию произошло перед выходом Android 2.3. До этого момента Android просто использовал стандартный список OpenSSL, однако сделанное сотрудниками Google в мае 2010 года изменение в коде добавило в Android собственный список шифров, который соответствует стандартам CipherSuite из JDK 6, принятым в 2002 году.
public static String[] getDefaultCipherSuites() {
- int ssl_ctx = SSL_CTX_new();
- String[] supportedCiphers = SSL_CTX_get_ciphers(ssl_ctx);
- SSL_CTX_free(ssl_ctx);
- return supportedCiphers;
+ return new String[] {
+ "SSL_RSA_WITH_RC4_128_MD5",
+ "SSL_RSA_WITH_RC4_128_SHA",
+ "TLS_RSA_WITH_AES_128_CBC_SHA",
...
+ "SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA",
+ "SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA"
+ };
}
Список шифров в Java обновился c выходом JDK 7, но в Android он остался старым из JDK 6.