eap-radius: Limit number of concurrently cached DAE responses
An attacker who knows the shared secret could send DAE requests from different IPs/ports to produce basically unlimited cached responses.
This commit is contained in:
@@ -28,6 +28,10 @@
|
|||||||
|
|
||||||
#define RADIUS_DAE_PORT 3799
|
#define RADIUS_DAE_PORT 3799
|
||||||
|
|
||||||
|
/* maximum number of cached responses for retransmits (= number of concurrent
|
||||||
|
* clients) */
|
||||||
|
#define DAE_RESPONSES_MAX 32
|
||||||
|
|
||||||
typedef struct private_eap_radius_dae_t private_eap_radius_dae_t;
|
typedef struct private_eap_radius_dae_t private_eap_radius_dae_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -105,7 +109,9 @@ static void save_retransmit(private_eap_radius_dae_t *this,
|
|||||||
while (enumerator->enumerate(enumerator, &entry))
|
while (enumerator->enumerate(enumerator, &entry))
|
||||||
{
|
{
|
||||||
if (client->equals(client, entry->client))
|
if (client->equals(client, entry->client))
|
||||||
{
|
{ /* move recently used entries to the front */
|
||||||
|
this->responses->remove_at(this->responses, enumerator);
|
||||||
|
this->responses->insert_first(this->responses, entry);
|
||||||
entry->response->destroy(entry->response);
|
entry->response->destroy(entry->response);
|
||||||
entry->response = response;
|
entry->response = response;
|
||||||
found = TRUE;
|
found = TRUE;
|
||||||
@@ -121,6 +127,13 @@ static void save_retransmit(private_eap_radius_dae_t *this,
|
|||||||
.client = client->clone(client),
|
.client = client->clone(client),
|
||||||
);
|
);
|
||||||
this->responses->insert_first(this->responses, entry);
|
this->responses->insert_first(this->responses, entry);
|
||||||
|
|
||||||
|
/* remove least recently used entry once we reach the maximum */
|
||||||
|
if (this->responses->get_count(this->responses) > DAE_RESPONSES_MAX &&
|
||||||
|
this->responses->remove_last(this->responses, (void**)&entry))
|
||||||
|
{
|
||||||
|
entry_destroy(entry);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user