Package: release.debian.org Severity: normal User: release.debian....@packages.debian.org Usertags: unblock
Hi release-team, please unblock package gpsd. The applied diff was discussed with the release team and we've decided its the best way to fix the json related fixes. Diff between 3.17-5 und 3.17-6 is attached to this mail. * [0a8e4e18] Pull json fixes from upstream to fix a stack-based buffer overflow, which may allow remote attackers to execute arbitrary code on embedded platforms via traffic on Port 2947/TCP or crafted JSON inputs. CVE-2018-17937 / Closes: #925327 The update also fixes several other json parser bugs. - ECMA-404 says JSON \u must have 4 hex digits - Allow for \u escapes with fewer than 4 digits. - Fail on bad escape string. unblock gpsd/3.17-6 Thanks, Bernd -- Bernd Zeimetz Debian GNU/Linux Developer http://bzed.de http://www.debian.org GPG Fingerprint: ECA1 E3F2 8E11 2432 D485 DD95 EB36 171A 6FF9 435F
diff --git a/debian/changelog b/debian/changelog index ebd29108b..16bb69795 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,19 @@ +gpsd (3.17-6) unstable; urgency=medium + + * [0a8e4e18] Pull json fixes from upstream to fix a stack-based + buffer overflow, which may allow remote attackers to execute + arbitrary code on embedded platforms via traffic on Port + 2947/TCP or crafted JSON inputs. + CVE-2018-17937 / Closes: #925327 + The update also fixes several other json parser bugs. + - ECMA-404 says JSON \u must have 4 hex digits + - Allow for \u escapes with fewer than 4 digits. + - Fail on bad escape string. + * [71020f4f] Update git-buildpackage config to build from the + buster branch. + + -- Bernd Zeimetz <b...@debian.org> Fri, 05 Apr 2019 23:31:30 +0200 + gpsd (3.17-5) unstable; urgency=medium * [fd1e83f9] Add pkg-config as Build-Dependency. diff --git a/debian/gbp.conf b/debian/gbp.conf index 1529a93db..151b02d6b 100644 --- a/debian/gbp.conf +++ b/debian/gbp.conf @@ -4,7 +4,7 @@ # the default branch for upstream sources: #upstream-branch = upstream # the default branch for the debian patch: -#debian-branch = master +debian-branch = buster # the default tag formats used: #upstream-tag = upstream/%(version)s #debian-tag = debian/%(version)s diff --git a/debian/patches/json-cve-fix b/debian/patches/json-cve-fix new file mode 100644 index 000000000..e81237bee --- /dev/null +++ b/debian/patches/json-cve-fix @@ -0,0 +1,170 @@ +--- a/json.c ++++ b/json.c +@@ -30,7 +30,7 @@ will match the right spec against the ac + recognize the JSON "null" value. Secondly, arrays may not have + character values as elements (this limitation could be easily removed + if required). Third, all elements of an array must be of the same +-type. ++type. Fourth, it can not handle NaN's in doubles (Issue 53150). + + There are separate entry points for beginning a parse of either + JSON object or a JSON array. JSON "float" quantities are actually +@@ -59,7 +59,7 @@ reusable module; search for "microjson". + + PERMISSIONS + This file is Copyright (c) 2010 by the GPSD project +- BSD terms apply: see the file COPYING in the distribution root for details. ++ SPDX-License-Identifier: BSD-2-clause + + ***************************************************************************/ + #include <stdio.h> +@@ -188,7 +188,7 @@ static int json_internal_read_object(con + char *lptr; + + if (end != NULL) +- *end = NULL; /* give it a well-defined value on parse failure */ ++ *end = NULL; /* give it a well-defined value on parse failure */ + + /* stuff fields with defaults in case they're omitted in the JSON input */ + for (cursor = attrs; cursor->attribute != NULL; cursor++) +@@ -294,7 +294,8 @@ static int json_internal_read_object(con + } + if (cursor->attribute == NULL) { + json_debug_trace((1, +- "Unknown attribute name '%s' (attributes begin with '%s').\n", ++ "Unknown attribute name '%s'" ++ " (attributes begin with '%s').\n", + attrbuf, attrs->attribute)); + /* don't update end here, leave at attribute start */ + return JSON_ERR_BADATTR; +@@ -374,6 +375,12 @@ static int json_internal_read_object(con + if (pval == NULL) + /* don't update end here, leave at value start */ + return JSON_ERR_NULLPTR; ++ else if (pval > valbuf + JSON_VAL_MAX - 1 ++ || pval > valbuf + maxlen) { ++ json_debug_trace((1, "String value too long.\n")); ++ /* don't update end here, leave at value start */ ++ return JSON_ERR_STRLONG; /* */ ++ } + switch (*cp) { + case 'b': + *pval++ = '\b'; +@@ -391,11 +398,16 @@ static int json_internal_read_object(con + *pval++ = '\t'; + break; + case 'u': +- for (n = 0; n < 4 && cp[n] != '\0'; n++) ++ cp++; /* skip the 'u' */ ++ for (n = 0; n < 4 && isxdigit(*cp); n++) + uescape[n] = *cp++; ++ uescape[n] = '\0'; /* terminate */ + --cp; +- (void)sscanf(uescape, "%04x", &u); +- *pval++ = (char)u; /* will truncate values above 0xff */ ++ /* ECMA-404 says JSON \u must have 4 hex digits */ ++ if ((4 != n) || (1 != sscanf(uescape, "%4x", &u))) { ++ return JSON_ERR_BADSTRING; ++ } ++ *pval++ = (unsigned char)u; /* truncate values above 0xff */ + break; + default: /* handles double quote and solidus */ + *pval++ = *cp; +@@ -432,7 +444,8 @@ static int json_internal_read_object(con + */ + for (;;) { + int seeking = cursor->type; +- if (value_quoted && (cursor->type == t_string || cursor->type == t_time)) ++ if (value_quoted && (cursor->type == t_string ++ || cursor->type == t_time)) + break; + if ((strcmp(valbuf, "true")==0 || strcmp(valbuf, "false")==0) + && seeking == t_boolean) +@@ -441,7 +454,8 @@ static int json_internal_read_object(con + bool decimal = strchr(valbuf, '.') != NULL; + if (decimal && seeking == t_real) + break; +- if (!decimal && (seeking == t_integer || seeking == t_uinteger)) ++ if (!decimal && (seeking == t_integer ++ || seeking == t_uinteger)) + break; + } + if (cursor[1].attribute==NULL) /* out of possiblities */ +@@ -454,15 +468,15 @@ static int json_internal_read_object(con + && (cursor->type != t_string && cursor->type != t_character + && cursor->type != t_check && cursor->type != t_time + && cursor->type != t_ignore && cursor->map == 0)) { +- json_debug_trace((1, +- "Saw quoted value when expecting non-string.\n")); ++ json_debug_trace((1, "Saw quoted value when expecting" ++ " non-string.\n")); + return JSON_ERR_QNONSTRING; + } + if (!value_quoted + && (cursor->type == t_string || cursor->type == t_check + || cursor->type == t_time || cursor->map != 0)) { +- json_debug_trace((1, +- "Didn't see quoted value when expecting string.\n")); ++ json_debug_trace((1, "Didn't see quoted value when expecting" ++ " string.\n")); + return JSON_ERR_NONQSTRING; + } + if (cursor->map != 0) { +@@ -542,14 +556,15 @@ static int json_internal_read_object(con + break; + case t_check: + if (strcmp(cursor->dflt.check, valbuf) != 0) { +- json_debug_trace((1, +- "Required attribute value %s not present.\n", ++ json_debug_trace((1, "Required attribute value %s" ++ " not present.\n", + cursor->dflt.check)); + /* don't update end here, leave at start of attribute */ + return JSON_ERR_CHECKFAIL; + } + break; + } ++ __attribute__ ((fallthrough)); + case post_array: + if (isspace((unsigned char) *cp)) + continue; +@@ -587,7 +602,7 @@ int json_read_array(const char *cp, cons + char *tp; + + if (end != NULL) +- *end = NULL; /* give it a well-defined value on parse failure */ ++ *end = NULL; /* give it a well-defined value on parse failure */ + + json_debug_trace((1, "Entered json_read_array()\n")); + +@@ -663,7 +678,8 @@ int json_read_array(const char *cp, cons + #endif /* JSON_MINIMAL */ + case t_uinteger: + #ifndef JSON_MINIMAL +- arr->arr.uintegers.store[offset] = (unsigned int)strtoul(cp, &ep, 0); ++ arr->arr.uintegers.store[offset] = (unsigned int)strtoul(cp, ++ &ep, 0); + if (ep == cp) + return JSON_ERR_BADNUM; + else +@@ -681,7 +697,8 @@ int json_read_array(const char *cp, cons + #endif /* JSON_MINIMAL */ + case t_ushort: + #ifndef JSON_MINIMAL +- arr->arr.ushorts.store[offset] = (unsigned short)strtoul(cp, &ep, 0); ++ arr->arr.ushorts.store[offset] = (unsigned short)strtoul(cp, ++ &ep, 0); + if (ep == cp) + return JSON_ERR_BADNUM; + else +--- a/json.h ++++ b/json.h +@@ -1,7 +1,7 @@ + /* Structures for JSON parsing using only fixed-extent memory + * + * This file is Copyright (c) 2010 by the GPSD project +- * BSD terms apply: see the file COPYING in the distribution root for details. ++ * SPDX-License-Identifier: BSD-2-clause + */ + + #include <stdbool.h> diff --git a/debian/patches/series b/debian/patches/series index 81b0806da..d0e0a4c91 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,3 +1,4 @@ full-systemd-support gpsd_hotplug_rules_disable_generic_serial_converters ed205512d_Fixes-SConstruct-for-SCons-3.0.0 +json-cve-fix