[VIM] Provable vendor ACK in csDoom

Steven M. Christey coley at mitre.org
Mon Mar 27 23:59:31 EST 2006


OK, so when Luigi Auriemma says an issue is vendor-acknowledged we all
have reasonable cause to believe him, but I went the extra mile to
prove it.

Ref: http://aluigi.altervista.org/adv/csdoombof-adv.txt

Claimed vendor acknowledgement and patch.

The vendor home page here:

  http://voxelsoft.com/csdoom/

has undated and uncredited statements under the "Features" section:

  Added:
    * Multiple buffer overflow fixes
    * Multiple string handling fixes

The "Latest Sources" section had source code updated 25/03/2006,
another correlator.

Still - historically, CVE has not treated discloser-claimed
acknowledgement as true vendor acknowledgement, even for reliable
researchers (though I'm reconsidering that policy 'cause sometimes it
means we spend a lot of time trying to prove what we're already 95%
confident about).  Anyway, I dug a bit further.

Grabbing the source code from the vendor site and grepping for "luigi"
gave me a mild surprise:

In ./server/c_console.cpp:

>int PrintString (int printlevel, char *outline)
>{
>        static bool last_string_terminated = true;
>        char szBuffer[9000]; // thanks to Luigi Auriemma for finding
>an overflow bug here

OK so the vendor doesn't make this sound exactly like a format string,
but the source code no longer has this piece of code, as quoted in
Auriemma's original advisory:

  printf (outline);

All sprintf/printf statements in PrintString() now have constant
format strings.

Similarly, in server/sv_main.cpp we now have:

>void STACK_ARGS SV_BroadcastPrintf (int level, const char *fmt, ...)
>{
>    va_list       argptr;
>    char          string[4096]; // thanks to Luigi Auriemma for finding an overflow bug here
>

but notice this change as well:

>void STACK_ARGS SV_BroadcastPrintfExcluding (int level, int client_nosend, const char *fmt, ...)
>{
>    va_list       argptr;
>    char          string[4096]; // thanks to Luigi Auriemma for finding an overflow bug here


Auriemma did not mention SV_BroadcastPrintfExcluding() in his
advisory.


While uncredited, there do appear to be relevant changes to
SV_SetupUserInfo() in sv_main.cpp:

>    strcpy(string, MSG_ReadString());// changed
>		if(/*!strlen(string) ||*/ strlen(string) > MAXPLAYERNAME || strstr(string, "%"))
>
>...
>
>	strcpy(p->userinfo.netname, string);

... which looks like a sanity check against string length for the
strcpy() function call.

Similarly, you have:

>    strcpy(string, MSG_ReadString());
>		if(strlen(string) > MAXPLAYERNAME || strstr(string, "%"))
>
>...
>		strcpy(p->userinfo.team, string); // changed

... which is also a sanity check.


Thus, as originally claimed by the researcher, the vendor has
acknowledged the issue via a vague changelog and explicit patches.

- Steve


More information about the VIM mailing list