Part 0 · Windows Vulnerability Research · NINJAS
Most people meet Windows security through Patch Tuesday. Researchers meet it earlier—at the moment an untrusted input crosses a privilege boundary and the code’s assumptions fail.
This series is written for that earlier moment. It is a practical field guide for discovering Windows vulnerabilities: how to map trust boundaries, choose surfaces worth your time, keep a lab that survives kernel crashes, and convert findings into reports that vendors can triage.
It is methodology and craft. It is not a weaponization manual.
What you should be able to do
After working through the series, you should be able to:
- Express any candidate issue as a boundary crossing (from layer A to layer B)
- Build a surface map before writing a harness
- Commit to a 90-day focus with explicit kill criteria
- Produce root-cause notes suitable for MSRC or other vendor programs
Why Windows still yields discoveries
Windows is not one binary. It is an ecosystem of parsers, elevation brokers, drivers, and identity protocols that expands faster than it can be fully re-audited. New features arrive with thin historical scrutiny. Legacy formats remain reachable from modern preview and shell paths. Privileged services still accept structured input from less-privileged callers.
| Layer | Examples | Why defects persist |
|---|---|---|
| Userland parsers | fonts, images, LNK, OLE, media | Complex state + untrusted input |
| RPC / COM / ALPC | SYSTEM services, elevation brokers | Authentication mistaken for authorization |
| Drivers / IOCTL | inbox and third-party | Length math, races, METHOD_NEITHER |
| Kernel core | ntoskrnl, win32k |
Object lifetimes, type confusion |
| Identity | Kerberos, NTLM, AD CS, Netlogon | Protocol logic meeting configuration |
| Hypervisor / VBS | Hyper-V VSP, Secure Kernel | Smaller surface, outsized impact |
Working rule: any interface that accepts attacker-influenced input and makes a security decision is a candidate—especially when it runs above the caller’s privilege.
How mitigations change where you should focus
On current Windows clients with VBS, HVCI, CET, and related controls, turning a raw memory-corruption primitive into reliable elevation is harder than it was a decade ago. That does not make research obsolete. It changes the portfolio.
| Higher relative ROI for many independents | Still valuable, but costlier |
|---|---|
| Logic and AuthZ bugs in SYSTEM RPC and COM | Inbox kernel memory corruption |
| Path canonicalization in elevation brokers | Fully chained win32k narratives |
| Third-party drivers with weak IOCTL validation | Hypervisor work without nested virt |
| Incomplete patches and sibling handlers | Famous parsers without a new angle |
| Identity and AD CS assumptions | Pre-auth remote RCE (rare, high reward) |
Memory corruption remains worth studying—for skill, and for components that still parse complex input on interesting boundaries. On modern mitigated hosts, though, logic bugs at privilege edges are often the shortest path from research hours to a reportable finding.
The discovery mindset
Zero-days are rarely found by “looking for bugs.” They are found by asking better questions:
- What crosses a trust boundary? — file, packet, handle, token, RPC stub, shared memory
- Who parses it, and at what privilege?
- What does the code assume was already validated? — failed assumptions are the bug
- If that assumption fails, which boundary breaks? — AppContainer→User, User→SYSTEM, User→Kernel, Guest→Host
If you cannot answer the fourth question, you have an interesting crash—not yet a finding.
Patterns that keep producing Windows findings
| Pattern | Why it works |
|---|---|
| Incomplete patches | One path is fixed; a sibling remains |
| New features (first 6–12 months) | Less historical scrutiny |
| Cross-component trust | A trusts B’s checks; B trusts A’s |
| Concurrency | Check/use windows under load |
| Legacy still reachable | Old formats on preview and auto-parse paths |
| Third-party kernel | AV, VPN, anti-cheat, utilities with weak probes |
| Elevation brokers | User talks to SYSTEM through “helpful” RPC/COM |
| Rare and error paths | Undocumented IOCTLs and failure handlers |
You rarely need a novel bug class. You need a neglected intersection of complexity and privilege.
How to use this series
| Parts | Purpose |
|---|---|
| 0–1 | Mental model and attack-surface map |
| 8–10 | Workflow, lab, and toolkit (read before deep dives) |
| 2–7 | Domain surfaces |
| 11 | Where to spend the next 90 days |
| 12–13 | Reporting, then a full practical case study |
Ground rules
Work only on systems you own or are authorized to test, inside isolated labs. Prefer root cause and minimal reproduction over exploit chains. Disclose through MSRC or the relevant vendor program.

Windows is not a flat catalog of features—it is a stack of trust rings. Every high-value finding describes a controlled jump from an outer ring to an inner one, or a break in isolation between peers that should not trust each other. Before you pick tools or targets, map where you stand and where impact must land. That mental model turns scattered crashes into coherent vulnerability narratives.
Trust rings (working model)
| Ring (pedagogical) | Layer | High-signal research goals |
|---|---|---|
| Outer | Hypervisor | Guest-to-host / VSP issues |
| Secure Kernel (VTL1) | VBS boundary problems | |
| Kernel | Driver IOCTL, win32k, races | |
| SYSTEM services | RPC / COM / ALPC elevation | |
| User (Medium IL) | Parser RCE, LNK / OLE / shell bugs | |
| Inner | Sandbox / AppContainer | Sandbox escape, broker abuse |
Diagram numbering may run outside→inside or the reverse depending on the visual. Operationally, the from → to sentence matters—not label arithmetic.
The triage sentence every finding needs
This issue allows an attacker at [Layer A] to affect [Layer B] because of [root cause] in [component], under [preconditions].
Examples:
- Font out-of-bounds write inside AppContainer → sandbox-scoped impact until escape exists
- RPC logic bug with missing authorization → User→SYSTEM
- Third-party
METHOD_NEITHERIOCTL → User→Kernel - VSP shared-memory race → Guest→Host
Without this sentence, severity arguments collapse and reports lose triage momentum.
Where to focus discovery effort now
1) Privilege amplifiers
Prioritize surfaces where low privilege speaks to high privilege:
- SYSTEM RPC servers callable by normal users
- Auto-elevating or elevation-broker COM servers
- Kernel devices openable by
Everyone/Users - Sandbox brokers that proxy filesystem, registry, or device access
2) Auto-parse and “no click” paths
Input the OS consumes without an explicit “Open with…”:
- Explorer preview and thumbnail handlers
- Shell link resolution
- Clipboard format handlers
- Print and document conversion paths
- Identity material parsed on domain controllers
3) Failed cross-component assumptions
Bugs cluster where component A assumes B already checked lengths, SIDs, paths, or ACLs. Diff the trust: who actually enforces the check?
4) Patch shadows
After monthly updates, binary-diff changed modules. Incomplete fixes and copy-paste siblings remain one of the highest-ROI independent discovery pipelines on Windows.
5) Saturation awareness
Some historically rich targets (classic spooler paths, heavily fuzzed image codecs) still reward study only with a novel angle: new API entry, new host process/IL, new feature flag, or a patch-diff hypothesis. Repeating 2018 strategies without a hypothesis underperforms.
Practical scenario — Surface-map a privileged service
In 45–90 minutes, produce a table for one SYSTEM service (inbox or third-party agent):
| Surface | Entry | Privilege | Auth gate | Notes |
|---|---|---|---|---|
| RPC | UUID / opnum | SYSTEM | packet privacy? | interesting methods |
| Named pipe | \\.\pipe\... |
SYSTEM | SDDL | impersonation? |
| ALPC | port name | SYSTEM | ACL | message layout |
| File / registry | paths touched | SYSTEM | — | user-controlled? |
| Loaded parsers | DLLs | SYSTEM | — | image / font / OLE? |
Recon toolkit
sc.exe qc / sdshow
Process Explorer (integrity level, privileges, handles)
RpcView / OleViewDotNet
NtObjectManager
Procmon (CreateFile, Reg*, TCP)
Discovery filter: retain only rows where user-influenced data reaches code running above Medium IL.
Practical scenario — Choosing a layer for 30 days
| Goal | Start here | Rationale |
|---|---|---|
| Fast feedback | Userland parsers (Part 5) | Crashes teach minimize → root cause |
| High local impact | LPE / RPC–COM (Part 3) | Boundary stories triage cleanly |
| Kernel entry | Third-party IOCTL (Part 2) | Often weaker validation than inbox |
| Enterprise narrative | Identity (Part 7) | Logic + configuration interaction |
| Long-horizon prestige | Hyper-V / VTL1 | Hard; differentiate after tooling fluency |
Priority matrix: Part 11.
Drill
State from→to for each:
- Pre-auth memory corruption in
HTTP.sys - Use-after-free in an AppContainer image codec
- Writable service binary path leading to LocalSystem
- Guest write into host via a VSP
Key takeaways
- Map rings before tools
- Hunt privilege amplifiers, auto-parse paths, and patch siblings
- Write the boundary sentence early—everything else hangs from it
Next: Part 1 Soon