本页内容

Qt Serial Port 安全注意事项

本页重点介绍了使用该模块时可能出现的潜在安全问题,并提供了相应的防范建议。

验证端口名称

QSerialPort 会将端口名作为普通字符串接受,并在尝试将其作为串行设备打开之前不进行任何验证。

因此,攻击者控制的名称可能会导致应用程序打开任意文件、设备节点,甚至远程 SMB 共享。 在前两种情况下,当 `QSerialPort ` 检测到该文件不是串行设备后,会立即关闭该文件。SMB 情况则有所不同:在打开文件时,身份验证信息会被发送至远程服务器,因此即使打开尝试最终失败,这些信息仍可能泄露。

为防止此情况,请勿使用将端口名称作为QString 参数的API,而应优先使用那些采用QSerialPortInfo 参数的API:

限制输入和输出缓冲区

默认情况下,QSerialPort 不会限制输入和输出缓冲区的大小。不受限制的缓冲区可能会耗尽可用内存,这在内存受限的嵌入式设备上尤为棘手。

如果远程设备发送数据的速度快于应用程序处理数据的速度,读取缓冲区可能会无限增长。请使用QSerialPort::setReadBufferSize() 对其进行限制。一旦达到限制,QSerialPort 将停止从设备读取数据,直到应用程序消耗完缓冲的数据;因此,如果在此期间驱动程序自身的缓冲区发生溢出,则传入的数据可能会丢失。

同样地,如果应用程序写入数据的速度超过驱动程序发送数据的速度,写入缓冲区可能会无限增长。请使用QSerialPort::setWriteBufferSize() 对其进行限制。在这种情况下,应用程序必须检查QSerialPort::write() 调用的返回结果,以确定实际接收了多少数据,并稍后写入剩余部分。

注意锁文件

注意:本节 仅适用于类 Unix 系统。

QSerialPort 在尝试打开端口之前,会使用锁文件来确定该端口是否已被其他进程占用。这是 Unix 系统上的常见做法,因此锁文件的格式和位置众所周知,且存放这些文件的目录通常对所有用户都是可写的。

QSerialPort 系统会检测并清除过期的锁文件,但本地攻击者可以启动一个长期运行的进程,并创建一个指向该进程的精心构造的锁文件。这样的锁永远不会过期,从而无限期地阻止应用程序访问串行端口。攻击者完全无需接触串行设备本身。

防范此攻击的唯一方法是确保没有任何恶意行为者能够访问该系统。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.