Do not free a session before calling the remove_session_cb
authorMarcus Huewe <suse-tux@gmx.de>
Fri, 11 May 2018 10:24:56 +0000 (12:24 +0200)
committerMatt Caswell <matt@openssl.org>
Thu, 7 Jun 2018 12:12:39 +0000 (13:12 +0100)
commit6849421c7553337df64536893690478f99f053c9
tree2f89752f674561b2f1482f32bea52a8ad1a8dc72
parent853d2453620ff04fbe8afa89fabd77eff42f54db
Do not free a session before calling the remove_session_cb

If the remove_session_cb accesses the session's data (for instance,
via SSL_SESSION_get_protocol_version), a potential use after free
can occur. For this, consider the following scenario when adding
a new session via SSL_CTX_add_session:

- The session cache is full
  (SSL_CTX_sess_number(ctx) > SSL_CTX_sess_get_cache_size(ctx))
- Only the session cache has a reference to ctx->session_cache_tail
  (that is, ctx->session_cache_tail->references == 1)

Since the cache is full, remove_session_lock is called to remove
ctx->session_cache_tail from the cache. That is, it
SSL_SESSION_free()s the session, which free()s the data. Afterwards,
the free()d session is passed to the remove_session_cb. If the callback
accesses the session's data, we have a use after free.

The free before calling the callback behavior was introduced in
commit e4612d02c53cccd24fa97b08fc01250d1238cca1 ("Remove sessions
from external cache, even if internal cache not used.").

CLA: trivial

Reviewed-by: Rich Salz <rsalz@openssl.org>
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/6222)

(cherry picked from commit c0a58e034d3eff68ca5e0d36d7b4d147425b0599)
ssl/ssl_sess.c