Apache是一款开放源代码流行的Web服务程序。 Apache ap_escape_html内存分配存在问题,远程攻击者可以利用这个漏洞对Apache服务程序进行拒绝服务攻击。 问题存在于server/protocol.c ap_get_mime_headers_core: ------ if (last_field != NULL) { if ((len > 0) && ((*field == \'\'\t\'\') || *field == \'\' \'\')) { ... fold_buf = (char *)apr_palloc(r->pool, alloc_len); ----- 如果头字段以TAB或SPACE开始,Apache就会分配内存给它。 而在ap_escape_html(r->pool, last_field)函数中,last_field字段可以任意长,根据如下代码: ---- int i, j; for (i = 0, j = 0; s[i] != \'\'\0\'\'; i++) if (s[i] == \'\'<\'\' || s[i] == \'\'>\'\') j += 3; else if (s[i] == \'\'&\'\') j += 4; if (j == 0) return apr_pstrmemdup(p, s, i); x = apr_palloc(p, i + j + 1); ---- (i + j + 1)也可以是任意长度,导致分配任意内存,可消耗大量资源。在linux x86_64上证实发送820MB数据可以溢出(i+j+1),导致memcpy崩溃而引起拒绝服务。
Apache是一款开放源代码流行的Web服务程序。 Apache ap_escape_html内存分配存在问题,远程攻击者可以利用这个漏洞对Apache服务程序进行拒绝服务攻击。 问题存在于server/protocol.c ap_get_mime_headers_core: ------ if (last_field != NULL) { if ((len > 0) && ((*field == \'\'\t\'\') || *field == \'\' \'\')) { ... fold_buf = (char *)apr_palloc(r->pool, alloc_len); ----- 如果头字段以TAB或SPACE开始,Apache就会分配内存给它。 而在ap_escape_html(r->pool, last_field)函数中,last_field字段可以任意长,根据如下代码: ---- int i, j; for (i = 0, j = 0; s[i] != \'\'\0\'\'; i++) if (s[i] == \'\'<\'\' || s[i] == \'\'>\'\') j += 3; else if (s[i] == \'\'&\'\') j += 4; if (j == 0) return apr_pstrmemdup(p, s, i); x = apr_palloc(p, i + j + 1); ---- (i + j + 1)也可以是任意长度,导致分配任意内存,可消耗大量资源。在linux x86_64上证实发送820MB数据可以溢出(i+j+1),导致memcpy崩溃而引起拒绝服务。