### 漏洞概述 该网页截图展示了一个名为 `APRSISClient.cpp` 的 C++ 代码文件,其中包含一个潜在的缓冲区溢出漏洞。漏洞位于 `hashCallsign` 函数中,具体是在处理 `rootCall` 字符串时,未对输入长度进行充分检查,可能导致缓冲区溢出。 ### 影响范围 - **受影响组件**:`APRSISClient` 类中的 `hashCallsign` 函数。 - **潜在风险**:攻击者可以通过构造特定的 `rootCall` 输入,触发缓冲区溢出,可能导致程序崩溃或执行任意代码。 ### 修复方案 1. **输入验证**:在 `hashCallsign` 函数中,增加对 `rootCall` 长度的检查,确保其不超过预期范围。 2. **使用安全函数**:使用更安全的字符串处理函数,如 `strncpy` 或 `snprintf`,避免直接使用 `strcpy` 等不安全函数。 3. **边界检查**:在循环中增加边界检查,防止数组越界访问。 ### POC 代码 以下是 `hashCallsign` 函数中可能存在漏洞的代码片段: ```cpp quint32 APRSISClient::hashCallsign(QString callsign){ // based on: https://github.com/hassu/aprsicp/blob/master/src/passcode.c QByteArray rootCall = callsign.split('.').first().toUpper().toLocal8Bit() + '\0'; quint32 hash = 0x7B2E; int i = 0; int len = rootCall.length(); while(i < len){ hash ^= rootCall.at(i) << 8; hash ^= rootCall.at(i+1); i += 2; } return hash & 0x7FFF; } ``` ### 修复后的代码示例 ```cpp quint32 APRSISClient::hashCallsign(QString callsign){ // based on: https://github.com/hassu/aprsicp/blob/master/src/passcode.c QByteArray rootCall = callsign.split('.').first().toUpper().toLocal8Bit() + '\0'; quint32 hash = 0x7B2E; int i = 0; int len = rootCall.length(); // 增加边界检查 if (len % 2 != 0) { len--; // 确保长度为偶数 } while(i < len){ hash ^= rootCall.at(i) << 8; hash ^= rootCall.at(i+1); i += 2; } return hash & 0x7FFF; } ``` 通过以上修复,可以有效防止缓冲区溢出漏洞的发生。