MobiVM / robovm

Ahead of time compiler for JVM bytecode targetting iOS, Mac OSX and Linux
https://mobivm.github.io
942 stars 132 forks source link

* SSL session caching/reusing disabled to prevent memory corruption #785

Closed dkimitsa closed 2 months ago

dkimitsa commented 2 months ago

Context

making multiple request to same host/port cause some of them terminated with message

error:14077102:SSL routines:SSL23_GET_SERVER_HELLO:unsupported protocol (/Users/tomski/Coding/asidik/robovm/target/checkout/compiler/vm/rt/android/external/openssl/ssl/s23_clnt.c:714 0x107f58871:0x00000000)

(or application crashed random places)

root case

Reusing same Session cause same native SSL_Session to be used with each opened OpenSSLSocketImpl. It associates it's native pointer with its SSL.

sessionToReuse = this.getCachedClientSession(clientSessionContext);
if (sessionToReuse != null) {
    NativeCrypto.SSL_set_session(this.sslNativePointer, sessionToReuse.sslSessionNativePointer);
}

As result multiple OpenSSLSocketImpl and its SSL will use same single session. Problem appear once this socked is being closed, as it destroys SSL by calling NativeCrypto.SSL_free(sslNativePointer); and SSL under hood destroys all elements it contains, and shared session as result.

This cause single object to be multiple times released, released memory is used as valid -- this causes logic errors as described above and SIGABRT crashes.

The "fix"

Properly fixing session sharing on Android 4.4.x code base is problematic as things are not implemented this way. In recent version of Libcore its handled completely different way. The way to prevent apps from crashing is to disable the feature. it will introduce longer TLS handshake.

RoboVMx experimental port is not affected by this issue.

guillerodriguez commented 2 months ago

The issue description says "making multiple request to same host/port", I assume this actually means multiple connections?

Does this affect all application code, or is it only triggered if this caching mechanism is explicitly enabled in some way?

Without this patch, is it possible to work around the issue from application code?

dkimitsa commented 2 months ago

@guillerodriguez yes its about opening multiple https/tls connections to same host/port. sadly it is happening unconditionally.

Tom-Ski commented 2 months ago

https://github.com/MobiVM/robovm/issues/601 https://github.com/MobiVM/robovm/issues/585 https://github.com/MobiVM/robovm/issues/557 https://github.com/MobiVM/robovm/issues/306 Related issues

dkimitsa commented 2 months ago

few cents about investigation https://dkimitsa.github.io/2024/05/08/fix-memory-corruption-due-http-requests/