File 0178-ssl-Obfuscate-the-stateful-session-ticket-id-to-avoi.patch of Package erlang
From f788fc42422f0075923b76e9399075ce06fcd838 Mon Sep 17 00:00:00 2001
From: Ingela Anderton Andin <ingela@erlang.org>
Date: Wed, 8 Apr 2020 12:01:59 +0200
Subject: [PATCH] ssl: Obfuscate the stateful session ticket id to avoid DoS
attack possibilities
---
lib/ssl/src/tls_server_session_ticket.erl | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/lib/ssl/src/tls_server_session_ticket.erl b/lib/ssl/src/tls_server_session_ticket.erl
index a804f81eaa..9517cc5afd 100644
--- a/lib/ssl/src/tls_server_session_ticket.erl
+++ b/lib/ssl/src/tls_server_session_ticket.erl
@@ -81,8 +81,8 @@ init(Args) ->
handle_call({new_session_ticket, Prf, MasterSecret}, _From,
#state{nonce = Nonce,
lifetime = LifeTime,
- stateful = #{}} = State0) ->
- Id = stateful_psk_id(),
+ stateful = #{id_generator := IdGen}} = State0) ->
+ Id = stateful_psk_ticket_id(IdGen),
PSK = tls_v1:pre_shared_key(MasterSecret, ticket_nonce(Nonce), Prf),
SessionTicket = new_session_ticket(Id, Nonce, LifeTime),
State = stateful_ticket_store(Id, SessionTicket, Prf, PSK, State0),
@@ -166,7 +166,8 @@ inital_state([stateful, Lifetime, TicketStoreSize|_]) ->
nonce = 0,
stateful = #{db => stateful_store(),
max => TicketStoreSize,
- ref_index => #{}
+ ref_index => #{},
+ id_generator => crypto:strong_rand_bytes(16)
}
}.
@@ -295,8 +296,13 @@ stateful_living_ticket({TimeStamp,_},
Lived < LifeTime.
-stateful_psk_id() ->
- term_to_binary(make_ref()).
+stateful_psk_ticket_id(Key) ->
+ Unique = erlang:unique_integer(),
+ %% Obfuscate to avoid DoS attack possiblities
+ %% that could invalidate tickets and render them
+ %% unusable. This id should be unpredictable
+ %% and unique but have no other cryptographic requirements.
+ crypto:crypto_one_time(aes_128_ecb, Key, <<Unique:128>>, true).
%%%===================================================================
%%% Stateless ticket
--
2.16.4