Monday, January 7, 2019

[09] 缓冲区截断后长度信息未能正确同步

https://curl.haxx.se/docs/CVE-2017-1000100.html

在curl / libcurl进行TFTP传输时,会给出一个包含很长文件名(长度大约为515字节)的URL,文件名会被截断以适应缓冲区边界,但缓冲区大小仍然会被错误地更新以便使用未截断的长度。
然后在sendto()调用中使用这个过大的值,使curl尝试发送的数据多于实际放入缓冲区的数据。

@@ -489,10 +489,15 @@ static CURLcode tftp_send_first(tftp_state_data_t *state, tftp_event_t event)
     result = Curl_urldecode(data, &state->conn->data->state.path[1], 0,
                             &filename, NULL, FALSE);
     if(result)
       return result;
 
+    if(strlen(filename) > (state->blksize - strlen(mode) - 4)) {
+      failf(data, "TFTP file name too longn");
+      return CURLE_TFTP_ILLEGAL; /* too long file name field */
+    }
+