[web-devel] questions about ResponseEnumerator
Kazu Yamamoto ( 山本和彦 )
kazu at iij.ad.jp
Wed Oct 12 09:08:49 CEST 2011
Hello,
I confirmed that the following patch fixes this vulnerability. Just
FYI.
https://github.com/kazu-yamamoto/wai/commit/96311d8040b6499922934d6eca68f76ea18d1c0e
--Kazu
> Hello Michael,
>
> Sorry for this late response.
>
> I noticed that if an exception handler is set in a Haskell thread, it
> works even if the thread is killed. So, the settingsPauseForApp
> approach is enough to me. Michael has alread reverted it but I want it
> back.
>
> Before that, I would like to make sure two things:
>
> 1) Would you take a look at "cgiApp'" defined in the following?
> https://github.com/kazu-yamamoto/wai-app-file-cgi/blob/master/Network/Wai/Application/Classic/CGI.hs
>
> Since a sub-process is created, there are two iteratees: The
> original iteratee consumes HTTP request body and passes it to CGI.
> Another iteratee to consumes output from CGI is returned as
> ResponseEnumerator.
>
> Are the error handlings in "cgiApp'" reasonable from Michael's
> point of view?
>
> 2) I noticed that the commit of settingsPauseForApp[1] does not work.
>
> The timer is paused anyway in serveConnection. Suppose that a nasty
> client specifies Content-Length:, for exapmle, to 10 bytes and
> sends only 5 bytes only and stops. Since the timer is paused and
> there is no chance for an iteratee to resume the timer, the
> connection is not closed by time out.
>
> I'm sure that this happens in the case of ResponseEnumerator. I
> suspect this happens in the case of ResponseFile and
> ResponseBuilder, too. In other words, a bad guy can make massive
> connections to Warp, which will not be closed by time out.
>
> I guess pausing in serveConnection is not a good idea.
>
>
> [1] https://github.com/yesodweb/wai/commit/d2b6c66abef939bb1396d576e7541b711a6db67b
>
> --Kazu
>
>> On Thu, Oct 6, 2011 at 9:34 AM, Kazu Yamamoto <kazu at iij.ad.jp> wrote:
>>>>> Mighttpd executes a sub process and creates a pair of pipes for
>>>>> CGI. If timeout happens, it seems to me that there is no way to kill
>>>>> the sub process and close the pipes with this scheme.
>>>>>
>>>>> I would like to register a house-keeping action to Wrap's timer.
>>>>
>>>> So it sounds like instead of the solution we just put in, we should
>>>> just expose the ability to use Warp's timeout code directly. This
>>>> shouldn't be a problem:
>>>>
>>>> * Expose the Timeout module (maybe in its own package, could be useful
>>>> to others)
>>>> * Add an extra settingsTimeoutManager :: IO Manager. That way you can
>>>> create the manager in Mighttpd and then reuse it in Warp.
>>>>
>>>> Would this address the issue?
>>>
>>> I think so.
>>>
>>> --Kazu
>>>
>>
>> OK, that one's even easier to implement. Please check out the most
>> recent commit. I also realized that the Warp module already exports
>> all the functions (I think) you need to use the timeout module; let me
>> know if something's missing.
>>
>> Michael
>
> _______________________________________________
> web-devel mailing list
> web-devel at haskell.org
> http://www.haskell.org/mailman/listinfo/web-devel
More information about the web-devel
mailing list