aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Kadianakis <desnacked@riseup.net>2021-05-18 17:06:57 +0300
committerNick Mathewson <nickm@torproject.org>2021-06-10 12:11:10 -0400
commitf57b5c48e0aa01acd84a194fe4657a0d1cee04cf (patch)
treef6a7d1fd08a131fef7bda34e919982635916c21b
parentadb248b6d6e0779719e6b873ee12a1e22fa390f4 (diff)
downloadtor-f57b5c48e0aa01acd84a194fe4657a0d1cee04cf.tar.gz
tor-f57b5c48e0aa01acd84a194fe4657a0d1cee04cf.zip
Fix TROVE-2021-006: Out-of-bounds read on v3 desc parsing
-rw-r--r--changes/bug403924
-rw-r--r--src/feature/hs/hs_descriptor.c3
2 files changed, 6 insertions, 1 deletions
diff --git a/changes/bug40392 b/changes/bug40392
new file mode 100644
index 0000000000..4dffa50bb2
--- /dev/null
+++ b/changes/bug40392
@@ -0,0 +1,4 @@
+ o Major bugfixes (security, denial of service, onion services):
+ - Fix an out-of-bounds memory access in v3 descriptor parsing. Fixes bug
+ 40392; bugfix on 0.3.0.1-alpha. This issue is also tracked as
+ TROVE-2021-006. Reported by Sergei Glazunov from Google's Project Zero. \ No newline at end of file
diff --git a/src/feature/hs/hs_descriptor.c b/src/feature/hs/hs_descriptor.c
index b6abf14a11..f74bb97ee2 100644
--- a/src/feature/hs/hs_descriptor.c
+++ b/src/feature/hs/hs_descriptor.c
@@ -135,7 +135,7 @@ static token_rule_t hs_desc_superencrypted_v3_token_table[] = {
/* Descriptor ruleset for the encrypted section. */
static token_rule_t hs_desc_encrypted_v3_token_table[] = {
T1_START(str_create2_formats, R3_CREATE2_FORMATS, CONCAT_ARGS, NO_OBJ),
- T01(str_intro_auth_required, R3_INTRO_AUTH_REQUIRED, ARGS, NO_OBJ),
+ T01(str_intro_auth_required, R3_INTRO_AUTH_REQUIRED, GE(1), NO_OBJ),
T01(str_single_onion, R3_SINGLE_ONION_SERVICE, ARGS, NO_OBJ),
END_OF_TABLE
};
@@ -2312,6 +2312,7 @@ desc_decode_encrypted_v3(const hs_descriptor_t *desc,
/* Authentication type. It's optional but only once. */
tok = find_opt_by_keyword(tokens, R3_INTRO_AUTH_REQUIRED);
if (tok) {
+ tor_assert(tok->n_args >= 1);
if (!decode_auth_type(desc_encrypted_out, tok->args[0])) {
log_warn(LD_REND, "Service descriptor authentication type has "
"invalid entry(ies).");