SILC(Secure Internet Live Conferencing)是安全的互联网会议讨论系统,可以发送任何类型的信息,包括多媒体信息,如视频、音频、图像等。 SILC处理畸形的数据交换时存在漏洞,远程攻击者可能利用此漏洞控制服务器。 如果要初始连接到SILC服务器,对等端(客户端、路由器和服务器)之间要执行相互认证并执行密钥协商协议以获得之后用于加密通讯的共享密钥。对等端之间的加密数据是通过以PKCS#1 1.5标准编码的报文交换的。 SILC的PKCS1编码功能是在silcpkcs1.c文件的silccrypt库中实现的,用于解码PKCS#1报文的代码在silc_pkcs1_decode函数中实现,如下所示: /----------- SilcBool silc_pkcs1_decode(SilcPkcs1BlockType bt, const unsigned char *data, SilcUInt32 data_len, unsigned char *dest_data, SilcUInt32 dest_data_size, SilcUInt32 *dest_len) { int i = 0; SILC_LOG_DEBUG((\"PKCS#1 decoding, bt \\%d\", bt)); /* Sanity checks */ if (!data || !dest_data || dest_data_size < 3 || data[0] != 0x00 || data[1] != (unsigned char)bt) { SILC_LOG_DEBUG((\"Malformed block\")); return FALSE; } /* Decode according to block type */ switch (bt) { case SILC_PKCS1_BT_PRV0: /* Do nothing */ break; case SILC_PKCS1_BT_PRV1: /* Verification */ (1) for (i = 2; i < data_len; i++) if (data[i] != 0xff) break; break; case SILC_PKCS1_BT_PUB: /* Decryption */...
SILC(Secure Internet Live Conferencing)是安全的互联网会议讨论系统,可以发送任何类型的信息,包括多媒体信息,如视频、音频、图像等。 SILC处理畸形的数据交换时存在漏洞,远程攻击者可能利用此漏洞控制服务器。 如果要初始连接到SILC服务器,对等端(客户端、路由器和服务器)之间要执行相互认证并执行密钥协商协议以获得之后用于加密通讯的共享密钥。对等端之间的加密数据是通过以PKCS#1 1.5标准编码的报文交换的。 SILC的PKCS1编码功能是在silcpkcs1.c文件的silccrypt库中实现的,用于解码PKCS#1报文的代码在silc_pkcs1_decode函数中实现,如下所示: /----------- SilcBool silc_pkcs1_decode(SilcPkcs1BlockType bt, const unsigned char *data, SilcUInt32 data_len, unsigned char *dest_data, SilcUInt32 dest_data_size, SilcUInt32 *dest_len) { int i = 0; SILC_LOG_DEBUG((\"PKCS#1 decoding, bt \\%d\", bt)); /* Sanity checks */ if (!data || !dest_data || dest_data_size < 3 || data[0] != 0x00 || data[1] != (unsigned char)bt) { SILC_LOG_DEBUG((\"Malformed block\")); return FALSE; } /* Decode according to block type */ switch (bt) { case SILC_PKCS1_BT_PRV0: /* Do nothing */ break; case SILC_PKCS1_BT_PRV1: /* Verification */ (1) for (i = 2; i < data_len; i++) if (data[i] != 0xff) break; break; case SILC_PKCS1_BT_PUB: /* Decryption */ (2) for (i = 2; i < data_len; i++) if (data[i] == 0x00) break; break; } /* Sanity checks */ (3) if (data[i++] != 0x00) { SILC_LOG_DEBUG((\"Malformed block\")); return FALSE; } if (i - 1 < SILC_PKCS1_MIN_PADDING) { SILC_LOG_DEBUG((\"Malformed block\")); return FALSE; } if (dest_data_size < data_len - i) { SILC_LOG_DEBUG((\"Destination buffer too small\")); return FALSE; } /* Copy the data */ (4) memcpy(dest_data, data + i, data_len - i); /* Return data length */ if (dest_len) *dest_len = data_len - i; return TRUE; } - -----------/ 在上面的代码中,如果在传输私有(BT_PRIV1)或公开(BT_PUB)密钥材料时有效PKCS#1编码的恶意伪造报文所有位分别设置为0xff或非0x00的话,就会导致执行流在(1)和(2)退出循环,无符整数变量i设置为data_len,然后在(3)同一变量i以1递增,因此设置为data_len+1。在(3)传送过滤检查的特制报文最终会由于在(4)处memcpy()函数中传送的第三个参数中的整数溢出而导致内存破坏。由于i设置为了datalen+1,用于计算第三个参数值的data_len - i表达式会为-1,导致由于符号转换错误而覆盖进程内存。成功利用这个漏洞会导致程序拒绝服务,或以SILC程序的权限执行任意指令。