Skip to content

Commit

Permalink
Multiple security/disclosure issues:
Browse files Browse the repository at this point in the history
- CVE-2019-8696 and CVE-2019-8675: Fixed SNMP buffer overflows (rdar://51685251)
- Fixed IPP buffer overflow (rdar://50035411)
- Fixed memory disclosure issue in the scheduler (rdar://51373853)
- Fixed DoS issues in the scheduler (rdar://51373929)
  • Loading branch information
michaelrsweet committed Aug 15, 2019
1 parent d784ca2 commit 2c030c7
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 21 deletions.
6 changes: 6 additions & 0 deletions CHANGES.md
Expand Up @@ -5,6 +5,7 @@ CHANGES - 2.3.0 - 2019-08-07
Changes in CUPS v2.3.0
----------------------

- CVE-2019-8696 and CVE-2019-8675: Fixed SNMP buffer overflows (rdar://51685251)
- Documentation updates (Issue #5604)
- Fixed a bug in the scheduler job cleanup code (Issue #5588)
- Fixed builds when there is no TLS library (Issue #5590)
Expand All @@ -28,6 +29,9 @@ Changes in CUPS v2.3.0
- Fixed some PPD parser issues (Issue #5623, Issue #5624)
- The IPP parser no longer allows invalid member attributes in collections
(Issue #5630)
- Fixed IPP buffer overflow (rdar://50035411)
- Fixed memory disclosure issue in the scheduler (rdar://51373853)
- Fixed DoS issues in the scheduler (rdar://51373929)
- Fixed an issue with unsupported "sides" values in the IPP backend
(rdar://51775322)
- The scheduler would restart continuously when idle and printers were not
Expand All @@ -37,6 +41,8 @@ Changes in CUPS v2.3.0
- Fixed a memory leak in `ppdOpen`.




Changes in CUPS v2.3rc1
-----------------------

Expand Down
9 changes: 7 additions & 2 deletions cups/http.c
Expand Up @@ -1860,7 +1860,7 @@ httpPrintf(http_t *http, /* I - HTTP connection */
...) /* I - Additional args as needed */
{
ssize_t bytes; /* Number of bytes to write */
char buf[16384]; /* Buffer for formatted string */
char buf[65536]; /* Buffer for formatted string */
va_list ap; /* Variable argument pointer */


Expand All @@ -1872,7 +1872,12 @@ httpPrintf(http_t *http, /* I - HTTP connection */

DEBUG_printf(("3httpPrintf: (" CUPS_LLFMT " bytes) %s", CUPS_LLCAST bytes, buf));

if (http->data_encoding == HTTP_ENCODING_FIELDS)
if (bytes > (ssize_t)(sizeof(buf) - 1))
{
http->error = ENOMEM;
return (-1);
}
else if (http->data_encoding == HTTP_ENCODING_FIELDS)
return ((int)httpWrite2(http, buf, (size_t)bytes));
else
{
Expand Down
9 changes: 2 additions & 7 deletions cups/ipp.c
Expand Up @@ -4550,20 +4550,15 @@ ippSetValueTag(
break;

case IPP_TAG_NAME :
if (temp_tag != IPP_TAG_KEYWORD && temp_tag != IPP_TAG_URI &&
temp_tag != IPP_TAG_URISCHEME && temp_tag != IPP_TAG_LANGUAGE &&
temp_tag != IPP_TAG_MIMETYPE)
if (temp_tag != IPP_TAG_KEYWORD)
return (0);

(*attr)->value_tag = (ipp_tag_t)(IPP_TAG_NAME | ((*attr)->value_tag & IPP_TAG_CUPS_CONST));
break;

case IPP_TAG_NAMELANG :
case IPP_TAG_TEXTLANG :
if (value_tag == IPP_TAG_NAMELANG &&
(temp_tag != IPP_TAG_NAME && temp_tag != IPP_TAG_KEYWORD &&
temp_tag != IPP_TAG_URI && temp_tag != IPP_TAG_URISCHEME &&
temp_tag != IPP_TAG_LANGUAGE && temp_tag != IPP_TAG_MIMETYPE))
if (value_tag == IPP_TAG_NAMELANG && (temp_tag != IPP_TAG_NAME && temp_tag != IPP_TAG_KEYWORD))
return (0);

if (value_tag == IPP_TAG_TEXTLANG && temp_tag != IPP_TAG_TEXT)
Expand Down
20 changes: 19 additions & 1 deletion cups/snmp.c
Expand Up @@ -1233,6 +1233,9 @@ asn1_get_integer(
int value; /* Integer value */


if (*buffer >= bufend)
return (0);

if (length > sizeof(int))
{
(*buffer) += length;
Expand All @@ -1259,6 +1262,9 @@ asn1_get_length(unsigned char **buffer, /* IO - Pointer in buffer */
unsigned length; /* Length */


if (*buffer >= bufend)
return (0);

length = **buffer;
(*buffer) ++;

Expand Down Expand Up @@ -1301,6 +1307,9 @@ asn1_get_oid(
int number; /* OID number */


if (*buffer >= bufend)
return (0);

valend = *buffer + length;
oidptr = oid;
oidend = oid + oidsize - 1;
Expand Down Expand Up @@ -1349,9 +1358,12 @@ asn1_get_packed(
int value; /* Value */


if (*buffer >= bufend)
return (0);

value = 0;

while ((**buffer & 128) && *buffer < bufend)
while (*buffer < bufend && (**buffer & 128))
{
value = (value << 7) | (**buffer & 127);
(*buffer) ++;
Expand Down Expand Up @@ -1379,6 +1391,9 @@ asn1_get_string(
char *string, /* I - String buffer */
size_t strsize) /* I - String buffer size */
{
if (*buffer >= bufend)
return (NULL);

if (length > (unsigned)(bufend - *buffer))
length = (unsigned)(bufend - *buffer);

Expand Down Expand Up @@ -1421,6 +1436,9 @@ asn1_get_type(unsigned char **buffer, /* IO - Pointer in buffer */
int type; /* Type */


if (*buffer >= bufend)
return (0);

type = **buffer;
(*buffer) ++;

Expand Down
23 changes: 12 additions & 11 deletions scheduler/client.c
Expand Up @@ -564,6 +564,17 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */

cupsdLogClient(con, CUPSD_LOG_DEBUG2, "cupsdReadClient: error=%d, used=%d, state=%s, data_encoding=HTTP_ENCODING_%s, data_remaining=" CUPS_LLFMT ", request=%p(%s), file=%d", httpError(con->http), (int)httpGetReady(con->http), httpStateString(httpGetState(con->http)), httpIsChunked(con->http) ? "CHUNKED" : "LENGTH", CUPS_LLCAST httpGetRemaining(con->http), con->request, con->request ? ippStateString(ippGetState(con->request)) : "", con->file);

if (httpError(con->http) == EPIPE && !httpGetReady(con->http) && recv(httpGetFd(con->http), buf, 1, MSG_PEEK) < 1)
{
/*
* Connection closed...
*/

cupsdLogClient(con, CUPSD_LOG_DEBUG, "Closing on EOF.");
cupsdCloseClient(con);
return;
}

if (httpGetState(con->http) == HTTP_STATE_GET_SEND ||
httpGetState(con->http) == HTTP_STATE_POST_SEND ||
httpGetState(con->http) == HTTP_STATE_STATUS)
Expand All @@ -573,17 +584,6 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
* connection and we need to shut it down...
*/

if (!httpGetReady(con->http) && recv(httpGetFd(con->http), buf, 1, MSG_PEEK) < 1)
{
/*
* Connection closed...
*/

cupsdLogClient(con, CUPSD_LOG_DEBUG, "Closing on EOF.");
cupsdCloseClient(con);
return;
}

cupsdLogClient(con, CUPSD_LOG_DEBUG, "Closing on unexpected HTTP read state %s.", httpStateString(httpGetState(con->http)));
cupsdCloseClient(con);
return;
Expand Down Expand Up @@ -1950,6 +1950,7 @@ cupsdSendError(cupsd_client_t *con, /* I - Connection */
strlcpy(location, httpGetField(con->http, HTTP_FIELD_LOCATION), sizeof(location));

httpClearFields(con->http);
httpClearCookie(con->http);

httpSetField(con->http, HTTP_FIELD_LOCATION, location);

Expand Down

0 comments on commit 2c030c7

Please sign in to comment.