Securitylab•July 31, 2026•🇷🇺Translated from Russian

Dangerous C++ Traps: Memory Safety Issues, Undefined Behavior, and Code That Betrays Developers

Around 70% of vulnerabilities assigned CVE numbers by Microsoft each year are linked to memory safety errors. The Chromium project reported nearly identical statistics for serious Chrome bugs: roughly 70% arose from unsafe memory handling, with half of those defects involving use-after-free. Decades after widespread adoption of C and C++, the industry continues to encounter the same pitfalls, now embedded in browsers, servers, and firmware updates.

Undefined Behavior: When the Program Promises Nothing

Undefined behavior (UB) means the language imposes no requirements on program results once rules are violated. Compilers need not warn, processes need not crash, and output may be expected values, garbage, leaked secrets, or entirely different control flow after optimization. A classic example shows how an optimizer can assume signed overflow never occurs:

bool grows_after_increment(int value) {
    return value + 1 > value;
    // UB at INT_MAX allows optimizer to return true always
}

Use-After-Free: Address Exists, Object Does Not

Memory and objects are distinct in C++. Returning memory to the allocator while retaining a pointer creates use-after-free (CWE-416). std::unique_ptr reduces risk by expressing unique ownership, yet extracting a raw pointer via get() can still produce dangling references after the owner is destroyed.

Heartbleed: How a Separate Length Field Leaked Server Memory

In April 2014, Heartbleed (CVE-2014-0160) in OpenSSL demonstrated the cost of trusting a client-supplied length. The vulnerable heartbeat handler copied up to 64 KB without verifying the actual payload size, exposing session secrets, passwords, and private keys. The flaw was a read beyond bounds that often left the server running while silently leaking memory.

Buffer Overflows, Integer Overflows, and Dangling Views

Simple off-by-one errors using <= instead of < write past array ends. Integer overflow before allocation can produce a tiny buffer followed by a large memcpy. std::string_view and std::span store pointers and lengths without ownership; when the original string or vector is destroyed or reallocated, the view becomes dangling. C++20 and C++23 std::span lack an at() method; bounds-checked access arrived only in the technically complete C++26 via proposal P2821R5.

Data Races, Move Semantics, and Uninitialized Values

Concurrent unsynchronized writes to non-atomic objects produce data races classified as UB. After std::move, standard-library objects remain valid but hold unspecified values; relying on any particular state is a logic error. C++26 proposal P2795R5 introduces “erroneous behavior” for some reads of uninitialized automatic variables, giving compilers better diagnostic options without full UB freedom.

Dynamic Analysis Tools and Compiler Warnings

Recommended instrumented builds include:

  • AddressSanitizer (ASan) — detects out-of-bounds access and use-after-free (roughly 2× slowdown)
  • UndefinedBehaviorSanitizer (UBSan) — catches signed overflow and alignment issues
  • MemorySanitizer (MSan) — finds reads of uninitialized data
  • ThreadSanitizer (TSan) — identifies data races (5–15× slowdown)

Strict warning sets with -Wall -Wextra -Wpedantic -Wconversion -Wshadow plus -Wreturn-stack-address (Clang) or -fanalyzer (GCC) catch many issues at compile time. New projects should treat warnings as errors; legacy codebases benefit from freezing existing debt and enforcing clean modules for untrusted input.

Migration Advice and When to Choose Another Language

Teams should begin at trust boundaries: network packet handlers, file parsers, and decoders. Ownership should move to containers or std::unique_ptr following the rule of zero. For new services handling untrusted data without legacy constraints, memory-safe languages such as Rust eliminate entire classes of lifetime and ownership defects before compilation.

Related articles

Habr•Vulnerabilities & Exploits

Security Week 2644: Active Exploitation of PHP2Shell Vulnerabilities Confirmed

PHP developers released patches for two critical vulnerabilities collectively known as PHP2Shell on October 20, affecting PHP 8.2 through 8.5 as well as older branches. The flaws allow unauthenticated remote code execution on affected servers, which power approximately 70 percent of websites. Despite expectations of immediate exploitation, confirmed attacks with working exploits only began on October 25. CrowdStrike noted technical difficulties in weaponizing the issues in real-world environments. Only one-fifth of top Russian websites had applied the fixes by October 25. Additional incidents included compromised eMudhra certificates, a critical GitLab flaw, and a 16-year-old Broadcom router vulnerability.

AntiMalware•Vulnerabilities & Exploits

Positive Technologies Offers Up to 500,000 Rubles for Bypassing PT Application Firewall

Positive Technologies has expanded its Standoff Bug Bounty program to include rewards for bypassing its web application firewalls. Researchers can earn between 150,000 and 500,000 rubles for demonstrating practical bypasses against PT Application Firewall PRO and PT Application Firewall Cloud. The program targets the core protective mechanisms, including traffic filtering, attack detection rules, and the management layer used by administrators. Submissions must include reproducible attack scenarios that show how malicious requests can pass through undetected, rather than relying on scanner reports or theoretical findings. Reward amounts vary by severity and confirmed business impact, with critical issues in the PRO version paying up to 500,000 rubles. The company plans to use validated findings to strengthen detection rules and improve overall product resilience.

AntiMalware•Vulnerabilities & Exploits

Tailscale SSH Vulnerability Allows Root Access via Unix Socket Redirection

A researcher identified flaws in Tailscale that let an attacker with existing SSH access on one node escalate to root privileges and move laterally across the network. Erica Windisch of Cyberdione Labs demonstrated the issues in lab conditions against Tailscale 1.104.2 and Headscale 0.29.5. The core problem stems from privileged operations performed by the tailscaled process when handling Unix socket redirection, granting an ordinary SSH session access to root-only resources. The researcher used the technique to interact with Docker and run elevated commands, and showed that broad access policies allow automated lateral movement in under a second. Additional issues include denial-of-service conditions and bypasses of certain restrictions. Recommendations include reviewing SSH policies and disabling unnecessary socket redirection, noting that Headscale 0.29.5 lacks an independent way to turn the feature off.

Security NEXT•Vulnerabilities & Exploits

Critical CVE-2026-111497 Out-of-Bounds Write Flaw in Google Brotli Decoder Impacts Broad Range of Environments

A severe vulnerability has been identified in the Google-developed Brotli decoder used for decompressing data in web communications and other applications. The flaw, tracked as CVE-2026-111497, allows out-of-bounds writes when processing specially crafted compressed data, potentially enabling arbitrary code execution, information disclosure, or denial of service. It carries a CVSS v4.0 base score of 9.2 and is rated Critical. Google has released patched versions 1.2.1, 1.1.1, and 1.0.10 of the library. Node.js incorporated the fix in its updates, while Microsoft issued an out-of-band patch for .NET on October 25, 2026, to address the issue. The vulnerability affects any environment relying on the Brotli C implementation for data decompression.