其他
看我如何发现 VNC 开源系统中的37个 CVE 漏洞
准备工作
系统说明
可能的攻击向量
研究对象
LibVNC:一款用于创建基于 RFB 协议的自定义应用程序的开源跨平台库。LibVNC 的服务器组件用于在 VirtualBox 中通过 VNC 提供对虚拟机的访问权限。 UltraVNC:一款专门为 Windows 开发的热门开源 VNC 实现。很多工业自动化公司推荐该实现通过 RFB 协议连接远程 HMI 接口。 TightVNC:RFB 协议的更为流行的实现。很多工业自动化系统供应商推荐通过 *nix 机器连接到 HMI 接口。 TurboVNC:一款开源的 VNC 实现。使用 libjpeg-turbo 库压缩 JPEG 图像,加快图像传输速度。
此前的研究工作
研究结果
typedef struct {
uint8_t type; /* always rfbClientCutText */
uint8_t pad1;
uint16_t pad2;
uint32_t length;
/* followed by char text[length] */
} rfbClientCutTextMsg;
ReadFullData(socket, ((char *)&msg) + 1, sz_rfbServerSomeMessageType – 1);
char *text = malloc(msg.length + 1);
ReadFullData(socket, text, msg.length);
text[msg.length] = 0;
rfbClientCutTextMsg cct;
cct.type = rfbClientCutText;
cct.length = length;
WriteToRFBServer(socket, &cct, sz_rfbClientCutTextMsg);
WriteToRFBServer(socket, str, len);
#ifndef HandleCoRRE8
#define BPP 32
#include ”corre.h”
#undef BPP
#endif
char data[64];
READ(((char *)&msg) + 1, sz_rfbFenceMsg – 1)
READ(data, msg.f.length)
if (msg.f.length > sizeof(data))
rfbLog("Ignoring fence. Payload of %d bytes is too large.\n",
msg.f.length);
else
HandleFence(cl, flags, msg.f.length, data);
return;
void ClientConnection::ReadServerInit()
{
ReadExact((char *)&m_si, sz_rfbServerInitMsg);
m_si.framebufferWidth = Swap16IfLE(m_si.framebufferWidth);
m_si.framebufferHeight = Swap16IfLE(m_si.framebufferHeight);
m_si.format.redMax = Swap16IfLE(m_si.format.redMax);
m_si.format.greenMax = Swap16IfLE(m_si.format.greenMax);
m_si.format.blueMax = Swap16IfLE(m_si.format.blueMax);
m_si.nameLength = Swap32IfLE(m_si.nameLength);
m_desktopName = new TCHAR[m_si.nameLength + 4 + 256];
m_desktopName_viewonly = new TCHAR[m_si.nameLength + 4 + 256+16];
ReadString(m_desktopName, m_si.nameLength);
. . .
}
void ClientConnection::ReadString(char *buf, int length)
{
if (length > 0)
ReadExact(buf, length);
buf[length] = '\0';
}
int decompress(const unsigned char *in, size_t in_len, unsigned char *out, size_t *out_len)
void ClientConnection::ReadUltraRect(rfbFramebufferUpdateRectHeader *pfburh) {
UINT numpixels = pfburh->r.w * pfburh->r.h;
UINT numRawBytes = numpixels * m_minPixelBytes;
UINT numCompBytes;
lzo_uint new_len;
rfbZlibHeader hdr;
// Read in the rfbZlibHeader
omni_mutex_lock l(m_bitmapdcMutex);
ReadExact((char *)&hdr, sz_rfbZlibHeader);
numCompBytes = Swap32IfLE(hdr.nBytes);
CheckBufferSize(numCompBytes);
ReadExact(m_netbuf, numCompBytes);
CheckZlibBufferSize(numRawBytes);
lzo1x_decompress((BYTE*)m_netbuf,numCompBytes,(BYTE*)m_zlibbuf,&new_len,NULL);
. . .
}
结论
在所有使用的第三方 VNC 项目中设置漏洞追踪机制并例行更新代码版本。 增加编译选项,使攻击者更难以利用可能存在的代码漏洞。即使研究人员无法检测出项目中的任何漏洞问题,但应该尽量使它们更难以被利用。
在所有项目架构上进行模糊测试。某些漏洞由于自身具体特征的原因仅在其中一种平台上出现。 确保在模糊测试和测试阶段使用清洁程序。例如,内存清洁器必定会识别出某类漏洞如使用 if 未初始化值。
CVE-2018-6307
CVE-2018-15126
CVE-2018-15127
CVE-2018-20019
CVE-2018-20020
CVE-2018-20021
CVE-2018-20022
CVE-2018-20023
CVE-2018-20024
CVE-2019-15681
2、TightVNCCVE-2019-8287
CVE-2019-15678
CVE-2019-15679
CVE-2019-15680
3、TurboVNCCVE-2019-15683
4、UltraVNCCVE-2018-15361
CVE-2019-8258
CVE-2019-8259
CVE-2019-8260
CVE-2019-8261
CVE-2019-8262
CVE-2019-8263
CVE-2019-8264
CVE-2019-8265
CVE-2019-8266
CVE-2019-8267
CVE-2019-8268
CVE-2019-8269
CVE-2019-8270
CVE-2019-8271
CVE-2019-8272
CVE-2019-8273
CVE-2019-8274
CVE-2019-8275
CVE-2019-8276
CVE-2019-8277
CVE-2019-8280
奇安信代码卫士 (codesafe)
国内首个专注于软件开发安全的产品线。