Skip to content

Commit f7a04b4

Browse files
committed
BUG/MEDIUM: server: Duplicate healthcheck's alpn inherited from default server
When "check-alpn" parameter is inherited from the default server, the value is not duplicated, the pointer of the default server is used. However, when this parameter is overridden, the old value is released. So the "check-alpn" value of the default server is released. So it is possible to have a UAF if if another server inherit from the same the default server. To fix the issue, the "check-alpn" parameter must be handled the same way the "alpn" is. The default value is duplicated. So it could be safely released if it is forced on the server line. This patch should fix the issue #3096. It must be backported to all stable versions.
1 parent 6ea50ba commit f7a04b4

2 files changed

Lines changed: 10 additions & 3 deletions

File tree

src/check.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1574,7 +1574,7 @@ void free_check(struct check *check)
15741574
}
15751575

15761576
ha_free(&check->pool_conn_name);
1577-
1577+
ha_free(&check->alpn_str);
15781578
task_destroy(check->task);
15791579

15801580
check_release_buf(check, &check->bi);

src/server.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2901,8 +2901,15 @@ void srv_settings_cpy(struct server *srv, const struct server *src, int srv_tmpl
29012901
srv->check.use_ssl = src->check.use_ssl;
29022902
srv->check.port = src->check.port;
29032903
srv->check.sni = src->check.sni;
2904-
srv->check.alpn_str = src->check.alpn_str;
2905-
srv->check.alpn_len = src->check.alpn_len;
2904+
if (src->check.alpn_str) {
2905+
srv->check.alpn_str = malloc(src->check.alpn_len);
2906+
if (srv->check.alpn_str) {
2907+
memcpy(srv->check.alpn_str, src->check.alpn_str,
2908+
src->check.alpn_len);
2909+
srv->check.alpn_len = src->check.alpn_len;
2910+
}
2911+
}
2912+
29062913
if (!(srv->flags & SRV_F_RHTTP))
29072914
srv->check.reuse_pool = src->check.reuse_pool;
29082915
if (src->check.pool_conn_name)

0 commit comments

Comments
 (0)