Firebird SQL是Firebird基金会的一套开源跨平台的提供多个ANSI SQL-92功能的SQL数据库管理系统。 Firebird SQL数据库默认监听于TCP 3050端口的数据库服务fbserver.exe中存在缓冲区溢出漏洞,远程攻击者可能利用此漏洞控制服务器。 该服务在处理connect请求(0x1)时以如下方式拆分: typedef struct p_cnct { P_OP p_cnct_operation; /* OP_CREATE or OP_OPEN */ USHORT p_cnct_cversion; /* Version of connect protocol */ P_ARCH p_cnct_client; /* Architecture of client */ CSTRING p_cnct_file; /* File name */ USHORT p_cnct_count; /* Protocol versions understood */ CSTRING p_cnct_user_id; /* User identification stuff */ struct p_cnct_repeat { USHORT p_cnct_version; /* Protocol version number */ P_ARCH p_cnct_architecture; /* Architecture of client */ USHORT p_cnct_min_type; /* Minimum type */ USHORT p_cnct_max_type; /* Maximum type */ USHORT p_cnct_weight; /* Preference weight */ } p_cnct_versions[10]; } P_CNCT; 如果为p_cnct_count指定了超大值的话,就会在报文的XDR处理中出现未经检查的循环,导致覆盖本地rem_port结构及其vtable。具体来说,在XDR处理的下一次迭代中会调用rem_port->receive函数指针。有漏洞的代码如下: protocol.cpp:318 for (i = 0, tail = connect->p_cnct_versions; i <...
Firebird SQL是Firebird基金会的一套开源跨平台的提供多个ANSI SQL-92功能的SQL数据库管理系统。 Firebird SQL数据库默认监听于TCP 3050端口的数据库服务fbserver.exe中存在缓冲区溢出漏洞,远程攻击者可能利用此漏洞控制服务器。 该服务在处理connect请求(0x1)时以如下方式拆分: typedef struct p_cnct { P_OP p_cnct_operation; /* OP_CREATE or OP_OPEN */ USHORT p_cnct_cversion; /* Version of connect protocol */ P_ARCH p_cnct_client; /* Architecture of client */ CSTRING p_cnct_file; /* File name */ USHORT p_cnct_count; /* Protocol versions understood */ CSTRING p_cnct_user_id; /* User identification stuff */ struct p_cnct_repeat { USHORT p_cnct_version; /* Protocol version number */ P_ARCH p_cnct_architecture; /* Architecture of client */ USHORT p_cnct_min_type; /* Minimum type */ USHORT p_cnct_max_type; /* Maximum type */ USHORT p_cnct_weight; /* Preference weight */ } p_cnct_versions[10]; } P_CNCT; 如果为p_cnct_count指定了超大值的话,就会在报文的XDR处理中出现未经检查的循环,导致覆盖本地rem_port结构及其vtable。具体来说,在XDR处理的下一次迭代中会调用rem_port->receive函数指针。有漏洞的代码如下: protocol.cpp:318 for (i = 0, tail = connect->p_cnct_versions; i < connect->p_cnct_count; i++, tail++) { MAP(xdr_short, reinterpret_cast(tail->p_cnct_version)); MAP(xdr_enum, reinterpret_cast(tail->p_cnct_architecture)); MAP(xdr_u_short, tail->p_cnct_min_type); MAP(xdr_u_short, tail->p_cnct_max_type); MAP(xdr_short, reinterpret_cast(tail->p_cnct_weight)); } 在循环操作中应检查tail的大小。