curl can be fooled into writing a zero byte out of bounds.
This bug can trigger when curl is told to work on an FTP URL, with the setting
to only issue a single CWD command (--ftp-method singlecwd
or the libcurl
alternative CURLOPT_FTP_FILEMETHOD
).
curl then URL-decodes the given path, calls strlen() on the result and deducts the length of the filename part to find the end of the directory within the buffer. It then writes a zero byte on that index, in a buffer allocated on the heap.
If the directory part of the URL contains a "%00" sequence, the directory
length might end up shorter than the filename path, making the calculation
size_t index = directory_len - filepart_len
end up with a huge index
variable for where the zero byte gets stored: heap_buffer[index] = 0
. On
several architectures that huge index wraps and works as a negative value,
thus overwriting memory before the intended heap buffer.
By using different file part lengths and putting %00 in different places in the URL, an attacker that can control what paths a curl-using application uses can write that zero byte on different indexes.