Nginx签署了整数,CVE-2013-2028

时间:2016-09-06 06:46:21

标签: c++ security nginx

我刚刚在vnsecurity发现了几年前关于安全漏洞的特定分析帖子,CVE-2013-2028。

然而,第一点让我感兴趣,说这个bug本质上是由整数符号不匹配引起的。

  

它只是将分块大小输入解析为十六进制并将其转换为10的基数。由于ctx-> size是使用size_t(无符号类型)定义的,因此在转换为变量时,变量的值可能被误解为负数签名类型,我们稍后会看到。

由于我对此感到好奇,我去搜索了struct' ctx'我偶然发现了这个:

struct ngx_http_chunked_s {
ngx_uint_t           state;
off_t                size;
off_t                length;
};

据我所知,ctx-> size不是size_t而是off_t,这是一个有符号整数。所以,我可能知道我是错了还是错误地改写了。

可以在此repo中找到较旧的nginx版本。

提前致谢!

1 个答案:

答案 0 :(得分:2)

从快速阅读中我认为作者在ngx_http_read_discarded_request_body的本地sizectx->size之间有点混淆。

输入的路径是:

  1. ngx_http_parse_chunked:2011ctx->size是签名输入。
  2. ngx_http_parse_chunked:2183:根据ctx->length设置签名ctx->size
  3. ngx_http_discard_request_body_filter:735:签名r->headers_in.content_length_n设置为ctx->length
  4. ngx_http_read_discarded_request_body:649r->headers_in.content_length_n将转换为size_t并分配到size(如果content_length_n < NGX_HTTP_DISCARD_BUFFER_SIZE,如果0 > content_length_n,则始终为r->connection->recv )。
  5. ngx_http_read_discarded_request_body:652:调用size,其ngx_http_read_discarded_request_body为要读取的字节数。
  6. size > sizeof (buffer)NGX_HTTP_DISCARD_BUFFER_SIZEarray_map)。因此,将发生堆栈溢出。
  7. 我希望这是可以理解的。