我刚刚在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版本。
提前致谢!
答案 0 :(得分:2)
从快速阅读中我认为作者在ngx_http_read_discarded_request_body
的本地size
和ctx->size
之间有点混淆。
输入的路径是:
ngx_http_parse_chunked:2011
:ctx->size
是签名输入。ngx_http_parse_chunked:2183
:根据ctx->length
设置签名ctx->size
。ngx_http_discard_request_body_filter:735
:签名r->headers_in.content_length_n
设置为ctx->length
。 ngx_http_read_discarded_request_body:649
:r->headers_in.content_length_n
将转换为size_t
并分配到size
(如果content_length_n < NGX_HTTP_DISCARD_BUFFER_SIZE
,如果0 > content_length_n
,则始终为r->connection->recv
)。ngx_http_read_discarded_request_body:652
:调用size
,其ngx_http_read_discarded_request_body
为要读取的字节数。size > sizeof (buffer)
:NGX_HTTP_DISCARD_BUFFER_SIZE
(array_map
)。因此,将发生堆栈溢出。我希望这是可以理解的。