hs-v2: Remove any expiring intro from the retry list

TROVE-2017-13. Severity: High.

In the unlikely case that a hidden service could be missing intro circuit(s),
that it didn't have enough directory information to open new circuits and that
an intro point was about to expire, a use-after-free is possible because of
the intro point object being both in the retry list and expiring list at the
same time.

The intro object would get freed after the circuit failed to open and then
access a second time when cleaned up from the expiring list.

Fixes #24313
This commit is contained in:
David Goulet
2017-11-21 10:16:08 -05:00
committed by Nick Mathewson
parent 25c90230be
commit 3030741b5d
2 changed files with 9 additions and 0 deletions
+4
View File
@@ -3444,6 +3444,10 @@ remove_invalid_intro_points(rend_service_t *service,
log_info(LD_REND, "Expiring %s as intro point for %s.",
safe_str_client(extend_info_describe(intro->extend_info)),
safe_str_client(service->service_id));
/* We might have put it in the retry list if so, undo. */
if (retry_nodes) {
smartlist_remove(retry_nodes, intro);
}
smartlist_add(service->expiring_nodes, intro);
SMARTLIST_DEL_CURRENT(service->intro_nodes, intro);
/* Intro point is expired, we need a new one thus don't consider it