fcgi2 icon indicating copy to clipboard operation
fcgi2 copied to clipboard

Malformed requests when using more than 8192 bytes of parameters

Open arnecls opened this issue 6 years ago • 4 comments

The size of the parameter buffer is set fixed to 8KB, see https://github.com/FastCGI-Archives/fcgi2/blob/856ac8362affcc5e1aaafe587db9a56c89fc4c83/cgi-fcgi/cgi-fcgi.c#L814 Using more then ~8KB of parameters will cause malformed requests.

In our case we were sending around 8184 bytes (according to wireshark): broken

Here is the output of the same request with slightly less data, which is working: working

We could not really track it down far into the code, but I never saw the stream buffer size being reset somewhere. But as a second parameter set is sent (see wireshark protocol) it could also be an off-by-one error or similar.

arnecls avatar Dec 21 '18 12:12 arnecls

I sadly cannot send you the dumps, as they contain sensitive information, but I can look things up if you want to.

The error reported by wireshark is sadly not very informative.

[Malformed Packet: FCGI]
    [Expert Info (Error/Malformed): Malformed Packet (Exception occurred)]
        [Malformed Packet (Exception occurred)]
        [Severity level: Error]
        [Group: Malformed]

arnecls avatar Dec 21 '18 12:12 arnecls

your welcome to send pull request to fix it.

mcarbonneaux avatar Jan 07 '19 23:01 mcarbonneaux

you've tryed to change the 8192 size in FCGX_CreateWriter argument to see if simply this size that had been reached or more complex thing ?

mcarbonneaux avatar Jan 07 '19 23:01 mcarbonneaux

you've catched the exit status of the cgi-fcgi binary ?

because in the loop after the createwriter they exit hard if fail to putstr:

 for( ; *envp != NULL; envp++) {
        equalPtr = strchr(*envp, '=');
        if(equalPtr  == NULL) {
            exit(1000);
        }
        valueLen = strlen(equalPtr + 1);
        FCGIUtil_BuildNameValueHeader(
                equalPtr - *envp,
                valueLen,
                &headerBuff[0],
                &headerLen);
        if(FCGX_PutStr((char *) &headerBuff[0], headerLen, paramsStream) < 0
                || FCGX_PutStr(*envp, equalPtr - *envp, paramsStream) < 0
                || FCGX_PutStr(equalPtr + 1, valueLen, paramsStream) < 0) {
            exit(FCGX_GetError(paramsStream));
        }
    }

mcarbonneaux avatar Jan 07 '19 23:01 mcarbonneaux