C++应用程序安全:初学者必知的十大漏洞

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

C++应用程序安全:初学者必知的十大漏洞

\n\n

C++语言赋予开发者对内存和性能的巨大控制权,但这种自由也伴随着巨大的责任。根据OWASP和CWE的数据,C++应用程序中的漏洞通常源于内存操作不当、缺乏边界检查以及指针使用上的疏忽。在本文中,我们将分析初学者最常遇到的10个漏洞。您将学习如何发现它们,更重要的是,如何避免它们。

\n\n

1. 缓冲区溢出 (Buffer Overflow)

\n

经典漏洞。当程序将数据写入已分配缓冲区边界之外时,就会发生此漏洞。攻击者可以覆盖相邻的内存区域,包括函数的返回地址,从而控制代码的执行。

\n\n
// 有漏洞的代码\nvoid vulnerable() {\n    char buffer[10];\n    std::cout << "请输入字符串: ";\n    std::cin >> buffer; // 没有长度检查!\n    std::cout << buffer << std::endl;\n}\n\n// 安全版本\nvoid safe() {\n    char buffer[10];\n    std::cout << "请输入字符串: ";\n    std::cin.getline(buffer, sizeof(buffer));\n    std::cout << buffer << std::endl;\n}
\n\n

如何防护:始终使用限制长度的函数(strncpy、snprintf、std::string)。避免使用gets()和strcpy()。

\n\n

2. 内存泄漏 (Memory Leaks)

\n

如果您通过new分配了内存,但忘记通过delete释放它,程序将逐渐“吞噬”RAM。对于服务器应用程序来说,这是一场灾难——运行几个小时后,服务将因std::bad_alloc错误而崩溃。

\n\n
// 内存泄漏示例\nvoid leak() {\n    int* ptr = new int(42);\n    // 忘记 delete ptr;\n}\n\n// 正确做法\nvoid noLeak() {\n    std::unique_ptr<int> ptr = std::make_unique<int>(42);\n    // 离开作用域时内存自动释放\n}
\n\n

如何防护:使用智能指针(std::unique_ptr、std::shared_ptr)。在极端情况下,使用RAII(资源获取即初始化)。

\n\n

3. 悬空指针 (Dangling Pointers)

\n

指针指向已释放的内存。解引用此类指针会导致未定义行为 (UB)。这可能导致程序崩溃,或者更糟,导致恶意代码执行。

\n\n
int* dangling() {\n    int x = 10;\n    return &x; // 错误:返回局部变量的地址!\n}\n\n// 正确做法——在堆上分配内存\nint* safe() {\n    int* ptr = new int(10);\n    return ptr;\n}
\n\n

如何防护:在delete之后始终将指针赋值为nullptr。使用智能指针。

\n\n

4. 整数溢出 (Integer Overflow)

\n

当算术运算的结果超出数据类型范围时,就会发生溢出。这可能导致意外后果,例如分配过小的缓冲区。

\n\n
void check_size(size_t user_size) {\n    // 漏洞:如果 user_size 非常大,user_size + 1 可能变得很小\n    char* buffer = new char[user_size + 1];\n    // ...\n}\n\n// 防护\nvoid safe_check(size_t user_size) {\n    if (user_size > std::numeric_limits<size_t>::max() - 1) {\n        throw std::overflow_error("尺寸过大");\n    }\n    char* buffer = new char[user_size + 1];\n}
\n\n

如何防护:在进行算术运算前检查边界。使用__builtin_add_overflow(GCC/Clang)或安全算术库。

\n\n

5. 空指针解引用 (Null Pointer Dereference)

\n

解引用空指针

博客

书籍推荐