Skip to content

http2: Safer invocation of populate_binsettings#12101

Closed
klyubin wants to merge 1 commit into
curl:masterfrom
klyubin:safer-populate_binsettings
Closed

http2: Safer invocation of populate_binsettings#12101
klyubin wants to merge 1 commit into
curl:masterfrom
klyubin:safer-populate_binsettings

Conversation

@klyubin

@klyubin klyubin commented Oct 12, 2023

Copy link
Copy Markdown
Contributor

populate_binsettings now returns a negative value on error, instead of a huge positive value. Both places which call this function have been updated to handle this change in its contract.

The way populate_binsettings had been used prior to this change the huge positive values -- due to signed->unsigned conversion of the potentially negative result of
nghttp2_pack_settings_payload which returns negative values on error -- are not possible. But only because http2.c currently always provides a large enough output buffer and provides H2 SETTINGS IVs which pass the verification logic inside nghttp2. If the verification logic were to change or if http2.c started passing in more IVs without increasing the output buffer size, the overflow could become reachable, and libcurl/curl might start leaking memory contents to servers/proxies...

populate_binsettings now returns a negative value on error,
instead of a huge positive value. Both places which call this
function have been updated to handle this change in its
contract.

The way populate_binsettings had been used prior to this change
the huge positive values -- due to signed->unsigned conversion
of the potentially negative result of
nghttp2_pack_settings_payload which returns negative values on
error -- are not possible. But only because http2.c currently
always provides a large enough output buffer and provides H2
SETTINGS IVs which pass the verification logic inside nghttp2.
If the verification logic were to change or if http2.c started
passing in more IVs without increasing the output buffer size,
the overflow could become reachable, and libcurl/curl might
start leaking memory contents to servers/proxies...
Comment thread lib/http2.c
ssize_t binlen; /* length of the binsettings data */

binlen = populate_binsettings(binsettings, data);
if(binlen <= 0) {

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The check is <= 0 instead of < 0 to be consistent with the pre-existing such check in Curl_http2_request_upgrade (below)

@bagder bagder left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

@bagder bagder closed this in 465f02b Oct 13, 2023
@bagder

bagder commented Oct 13, 2023

Copy link
Copy Markdown
Member

Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Development

Successfully merging this pull request may close these issues.

2 participants