Back to articles
CRITICAL9.8/10CVE-2010-3765NVD

CVE-2010-3765: When Firefox's Layout Engine Became a Drive-By Download Machine

In October 2010, attackers didn't need a phishing email, a malicious attachment, or any social engineering beyond "visit this website.

@0xrafasecFebruary 18, 2026cve-analysis

CVSS: 9.8/10 (CRITICAL)

Affected: cpe:2.3:a:mozilla:firefox:3.5:*:*:*:*:*:*:*; cpe:2.3:a:mozilla:firefox:3.5.1:*:*:*:*:*:*:*; cpe:2.3:a:mozilla:firefox:3.5.2:*:*:*:*:*:*:*; cpe:2.3:a:mozilla:firefox:3.5.3:*:*:*:*:*:*:*; cpe:2.3:a:mozilla:firefox:3.5.4:*:*:*:*:*:*:*; cpe:2.3:a:mozilla:firefox:3.5.5:*:*:*:*:*:*:*; cpe:2.3:a:mozilla:firefox:3.5.6:*:*:*:*:*:*:*; cpe:2.3:a:mozilla:firefox:3.5.7:*:*:*:*:*:*:*; cpe:2.3:a:mozilla:firefox:3.5.8:*:*:*:*:*:*:*; cpe:2.3:a:mozilla:firefox:3.5.9:*:*:*:*:*:*:*; cpe:2.3:a:mozilla:firefox:3.5.10:*:*:*:*:*:*:*; cpe:2.3:a:mozilla:firefox:3.5.11:*:*:*:*:*:*:*; cpe:2.3:a:mozilla:firefox:3.5.12:*:*:*:*:*:*:*; cpe:2.3:a:mozilla:firefox:3.5.13:*:*:*:*:*:*:*; cpe:2.3:a:mozilla:firefox:3.5.14:*:*:*:*:*:*:*

Available in Português

Share:

Legal & Ethical Disclaimer

This content is provided for EDUCATIONAL and AUTHORIZED SECURITY TESTING purposes only.

DO
  • Use these techniques on systems you own or have explicit written permission to test
  • Practice in authorized lab environments (VulnHub, HackTheBox, DVWA, etc.)
  • Follow responsible disclosure practices when finding vulnerabilities
  • Use knowledge for defensive security and authorized penetration testing
DO NOT
  • Access systems without explicit authorization
  • Use these techniques for malicious purposes
  • Deploy exploits against production systems you don't own
  • Share working exploits for unpatched vulnerabilities

Legal warning

Unauthorized access to computer systems is illegal in most jurisdictions (e.g. CFAA in the US, Computer Misuse Act in the UK). Violators may face criminal prosecution and civil liability. The author and publisher assume no liability for misuse of this information. By continuing, you agree to use this knowledge ethically and legally.

CVE-2010-3765: When Firefox's Layout Engine Became a Drive-By Download Machine

In October 2010, attackers didn't need a phishing email, a malicious attachment, or any social engineering beyond "visit this website." One page load in an unpatched Firefox was all it took to own a machine—and the Belmoo malware campaign proved this wasn't theoretical.


🎯 Impact: Remote code execution via memory corruption in Firefox's CSS frame constructor
🔓 Attack Vector: Network (drive-by download, zero user interaction beyond visiting a page)
💥 Exploitability: Moderate (requires JavaScript, heap spray typical—well within attacker capability)
🛡️ Fix Available: Yes (Firefox 3.5.15 / 3.6.12, Thunderbird 3.0.10 / 3.1.6, SeaMonkey 2.0.10)
⏱️ Patch Now: Irrelevant for most—these versions are decade-old EOL. If you're still running them, patching is the least of your problems.

What's Actually Happening

Here's the thing about browser vulnerabilities: the most dangerous ones don't live in obscure features. They live in the engine that runs every time you load a webpage. CVE-2010-3765 hits exactly that kind of core machinery—the CSS frame construction subsystem.

The root cause is an incorrect index tracking bug inside nsCSSFrameConstructor::ContentAppended, the Gecko layout engine function responsible for building the visual frame tree when new DOM nodes are added to a document. When JavaScript calls appendChild() to insert nodes into the DOM, ContentAppended needs to walk the existing frame list and calculate the correct insertion point. The vulnerability arises because under certain conditions involving multiple frame types being created simultaneously, the internal index used to track position in the frame tree gets corrupted.

Think of it this way: Gecko's frame constructor maintains a list of "frames" (internal layout objects, not <frame> HTML elements) that correspond to DOM nodes. When you append a child node, the engine calculates where in the frame list to insert the new frame. If you manipulate the DOM in a way that forces the constructor to create multiple frames for what it expected to be a simpler insertion—certain CSS properties, anonymous box generation, or table-related frame splitting can all trigger this—the running index counter drifts out of sync with the actual frame list state.

The vulnerable pattern conceptually looks like this:

javascript
// Conceptual representation of the triggering pattern
// NOT a working exploit

// 1. Set up a container with specific CSS properties that 
//    force multi-frame generation on append
let container = document.createElement('div');
container.style.display = 'table'; // or similar frame-splitting property
document.body.appendChild(container);

// 2. Trigger ContentAppended with a node that causes 
//    the frame constructor to create more frames than expected
for (let i = 0; i < N; i++) {
    let child = document.createElement('span');
    container.appendChild(child);  // Each call drifts the internal index
}

// 3. The index mismatch eventually causes a write 
//    to an incorrect memory location → heap corruption

The real danger is what this corruption enables: arbitrary write primitives. Once you control what gets written where in the heap, classic heap spray techniques let you pre-populate memory with shellcode and redirect execution into it. This was 2010—pre-ASLR enforcement on most Windows XP systems, pre-reliable SLFH (Segment Heap), and before Firefox had meaningful exploit mitigations. The exploit surface was wide open.

This belongs squarely in CWE-119 (Improper Restriction of Operations within the Bounds of a Memory Buffer)—but the interesting nuance is that this isn't a simple buffer overflow. It's a logical indexing error that produces a memory safety violation. The distinction matters when you're hunting for similar bugs: you can't grep for strcpy and find this one.


Exploitation Path

The beauty (from an attacker's perspective) of this vulnerability is how clean the exploitation chain is. No authentication. No account. No installed software. Just a browser.

Prerequisites: JavaScript enabled (default), Firefox 3.5.x–3.6.x or Thunderbird/SeaMonkey equivalents, victim visits attacker-controlled page. That's it.

The Attack Chain:

  1. Lure — Attacker hosts malicious HTML/JS on a web server, or injects it into a compromised legitimate site. Malvertising networks were particularly effective here.

  2. Trigger the bug — JavaScript executes appendChild calls in the specific pattern that corrupts the frame constructor's internal index. The browser doesn't crash immediately; it continues executing with a corrupted heap state.

  3. Heap spray — Before or after triggering the corruption, the attacker's JS pre-fills the heap with NOP sleds and shellcode using large typed arrays or string allocations. On Windows XP without ASLR, predictable heap addresses make this reliable.

  4. Redirect execution — The corrupted index results in a write to a controlled memory location—typically overwriting a function pointer, vtable entry, or return address. When that code path is next executed, control transfers into the spray.

  5. Payload delivery — The Belmoo campaign used this for classic dropper behavior: download and execute a secondary payload. Game over.

What the attacker gets at step 5: SYSTEM-level code execution if the browser is running elevated (common on XP), or at minimum user-level execution with access to the victim's files, credentials, and network position.


Who's Actually At Risk

In 2010? Everyone running Firefox on Windows. Market share numbers from that period put Firefox around 25-30% globally. The Belmoo campaign specifically targeted Windows users and was observed in the wild before Mozilla even had a patch ready—meaning this was a zero-day exploitation event, not an n-day attack.

The industries hit hardest in the Belmoo campaign appeared to be broad consumer targeting rather than spear-phishing, but any organization where employees could browse arbitrary websites was exposed.

Today? If you somehow have Firefox 3.5 or 3.6 running in your environment in 2024, you have much larger problems than this CVE. We're talking end-of-life software from 14 years ago. The realistic risk today is:

  • Legacy embedded systems where browsers are frozen at ancient versions (kiosks, industrial HMIs, some healthcare equipment)
  • Abandoned VM images that get spun up without update cycles
  • Forensic relevance—understanding this vuln helps you analyze malware from this era

Detection & Hunting

For historical forensic analysis or environments where ancient Firefox versions are genuinely running:

What exploitation looks like in logs:

  • Sudden child process spawning from firefox.exe with unusual command-line arguments
  • Network connections initiated by firefox.exe to unexpected external IPs immediately after page load
  • Heap spray artifacts: large allocations of identical memory blocks visible in crash dumps

Conceptual detection logic:

yaml
# Sigma-style rule (conceptual, not production-validated)
title: Suspicious Firefox Child Process Spawning
status: historical
logsource:
    category: process_creation
    product: windows
detection:
    selection:
        ParentImage|endswith: '\firefox.exe'
        Image|endswith:
            - '\cmd.exe'
            - '\powershell.exe'
            - '\wscript.exe'
            - '\cscript.exe'
    filter:
        CommandLine|contains: 'extension'  # Reduce FP for addon installers
    condition: selection and not filter
falsepositives:
    - Firefox update mechanisms (validate against known-good update paths)
level: high
tags:
    - attack.execution
    - attack.t1203  # Exploitation for Client Execution

Belmoo-era IOCs are largely burned at this point (14-year-old C2 infrastructure), but the behavioral signature—browser spawning a downloader process shortly after visiting a site—remains the canonical indicator for this class of drive-by exploit.


Mitigation Playbook

  1. Immediate: Update to Firefox 3.5.15, 3.6.12 (or ideally, a current supported release—Firefox 3.x hasn't received security updates since 2012). Same for Thunderbird 3.0.10/3.1.6 and SeaMonkey 2.0.10.

  2. If you cannot patch (embedded/legacy systems): Disable JavaScript in the browser preferences. This completely eliminates the attack vector since JS is required to trigger appendChild in the exploitable pattern. Not practical for general browsing but appropriate for locked-down kiosk scenarios.

  3. Network-level: Web proxies with content inspection can block pages containing the triggering JS patterns, though signature evasion was trivial in 2010 and remains so.

  4. Long-term: If you have any system running Firefox < 50 in your environment, it should be treated as fully compromised until upgraded. Enumerate via SCCM/Ansible/endpoint management—you may be surprised what lurks in your fleet.

  5. Verify you're protected: firefox --version from the command line. Anything below 3.5.15 in the 3.5.x series or 3.6.12 in the 3.6.x series is vulnerable. In practice, if you're not on Firefox 120+, you have dozens of critical unpatched CVEs regardless.


My Take

The 9.8 CVSS is accurate—and if anything, slightly undersells the real-world impact at the time. CVSS doesn't account for exploitation maturity or the ecosystem context. In October 2010, Windows XP was the dominant OS, ASLR wasn't consistently enforced, and heap sprays were near-deterministic. The practical exploitability was closer to "script kiddie territory" once the initial exploit code circulated, not "sophisticated attacker required."

What makes CVE-2010-3765 historically significant is what it represents about the drive-by download era. This wasn't the first browser exploit, and it wasn't the most sophisticated. But it's a textbook example of how logic errors in layout engines—not memory management primitives like malloc or free—can produce exploitable memory corruption. The bug isn't in memory handling code. It's in index arithmetic. That's the insight that matters: you can audit every allocation and deallocation in a codebase and still miss this class of bug entirely.

Mozilla's response was actually reasonably fast given the era—roughly a week from exploitation-in-the-wild to patch. But the lesson the industry should have taken is that shipping a patch isn't enough. Patch adoption rates for browser vulnerabilities in 2010 were abysmal. Users and organizations running browsers months behind current versions was the norm, not the exception. The real systemic fix came later with silent background auto-update mechanisms that Firefox, Chrome, and others eventually implemented. CVE-2010-3765 is part of the story that justified removing the user from the update decision entirely.


Timeline

DateEvent
~2010-10-01Vulnerability first exploited in the wild by Belmoo malware campaign
2010-10-19Mozilla acknowledges active exploitation, begins emergency patch development
2010-10-27Firefox 3.5.15 and 3.6.12 released with fix; Thunderbird and SeaMonkey patches follow
2010-10-28CVE-2010-3765 assigned and public disclosure formalized
2010-11Belmoo campaign continues targeting unpatched users post-disclosure

References

Found this article interesting? Follow me on X and LinkedIn.