← All hunts high TLP:CLEAR

Exploitation of Core Services and Kernel Vulnerabilities

An attacker is exploiting vulnerabilities in Node.js HTTP/2 (CVE-2026-56848) or the Linux kernel rhashtable (CVE-2026-64563) to gain initial access or elevate privileges, as evidenced by service instability or specific kernel errors.

Based on research by Microsoft 2026-10-08 11 steps · 5 queries T1068 T1190

Brief

Why now

Microsoft FORGE Lab recently published 3 lessons from frontier AI vulnerability research, detailing vulnerabilities in core runtimes and kernel components. These flaws, including CVE-2026-56848 in Node.js and CVE-2026-64563 in the Linux kernel, provide reliable paths for initial access and privilege escalation. We designed this hunt to identify exploitation attempts across the estate by correlating vulnerable software versions with specific behavioral failures.

How the hunt flows

The hunt starts by scoping the environment for vulnerable software. It queries the software inventory for Node.js major versions 22, 24, and 26, as well as instances of curl and llama.cpp. This narrows the focus to hosts where the specific CVEs are most likely to reside.

Once the scope is set, the hunt runs four parallel queries to gather evidence. It first checks for existing vulnerability findings from security scanners to prioritize known risks. Simultaneously, it looks for server-side HTTP 500 errors on the scoped hosts, which often follow heap-use-after-free exploitation in Node.js. It also monitors outbound network connections from curl-related processes to identify session reuse exploitation or C2 communication.

Finally, the hunt searches system logs for kernel-level errors. It specifically looks for rhashtable walk errors or stale pointer dereferences indicative of kernel exploitation. An automated agent then weighs these signals. If a host shows both vulnerable software and matching behavioral anomalies, the agent issues a verdict for manual triage or automated isolation.

What the hunt cannot see

This hunt has two primary blind spots. First, it relies on syslog capturing the kernel facility. If a Linux host does not forward kernel logs to the central telemetry store, exploitation of the rhashtable vulnerability remains silent. Second, if a reverse proxy or WAF terminates TLS and masks back-end server errors, the hunt cannot see the 5xx status codes that signal Node.js instability.

Steps

  1. Scoping vulnerable Node.js and curl versions

    Query · scoping

    Identify hosts running Node.js versions 22.x, 24.x, or 26.x and libcurl to narrow the behavioral search.

    reads hb_software_inventorysql
    SELECT DISTINCT device_hostname, package_name, package_version FROM hb_software_inventory WHERE ( (LOWER(package_name) IN ('node', 'nodejs') AND (package_version LIKE '22.%' OR package_version LIKE '24.%' OR package_version LIKE '26.%')) OR (LOWER(package_name) IN ('curl', 'libcurl', 'llama.cpp')) )

    What a hit looks like. A list of hosts running vulnerable versions of Node.js or curl. Silence means no such software is inventoried.

  2. Existing vulnerability findings

    Query · enrichment

    Prioritize hosts where scanners have already flagged the specific CVEs named in the research.

    reads hb_vulnerability_findingsql
    SELECT device_uid, resource_uid, cve_uid, severity, first_seen FROM hb_vulnerability_finding WHERE instr(',' || '{{cve_ids}}' || ',', ',' || cve_uid || ',') > 0 AND status != 'suppressed'

    What a hit looks like. Confirmed findings for the target CVEs. This provides a high-confidence starting point for the behavioral triage.

  3. Node.js server-side errors

    Query · baseline

    Identify potential heap-use-after-free exploitation in Node.js causing application-level crashes (5xx errors).

    reads hb_http_activitysql
    SELECT device_hostname, url_path, status_code, user_agent, COUNT(*) AS error_count FROM hb_http_activity WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND status_code >= 500 AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY device_hostname, url_path, status_code, user_agent

    What a hit looks like. Spikes in 500 errors on systems identified as running vulnerable Node.js versions.

  4. Libcurl outbound anomalies

    Query · baseline

    Monitor for libcurl processes communicating with rare external hosts, potentially indicating session reuse exploitation.

    reads hb_network_connectionsql
    SELECT device_hostname, process_name, dst_endpoint_ip, dst_endpoint_port, COUNT(*) AS connection_count FROM hb_network_connection WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND (LOWER(process_name) LIKE '%curl%' OR LOWER(process_name) LIKE '%llama.cpp%') AND direction = 'outbound' AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY device_hostname, process_name, dst_endpoint_ip, dst_endpoint_port

    What a hit looks like. Outbound connections from curl-related processes to rare destination IPs not seen elsewhere in the fleet.

  5. Kernel rhashtable errors

    Query · detection candidate

    Find specific kernel error strings related to the rhashtable stale pointer dereference (CVE-2026-64563).

    reads hb_syslogsql
    SELECT device_hostname, syslog_tag, message, time FROM hb_syslog WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND (LOWER(message) LIKE '%rhashtable_walk_next%' OR LOWER(message) LIKE '%stale pointer%') AND time >= datetime('now', '-{{lookback_days}} days')

    What a hit looks like. Syslog entries capturing kernel crashes or errors mentioning rhashtable functions. Absence means no such errors were logged.

  6. Correlate exploitation signals

    Agent triage

    Synthesize the vulnerable software inventory, scanner findings, and log anomalies to determine exploitation.

  7. Route on triage verdict

    Decision

    Route to containment for malicious verdicts or further analyst review for suspicious findings.

  8. Isolate host and revoke credentials

    Response action

    Prevent lateral movement and further exploitation once compromise is identified.

  9. Analyst manual review

    Analyst task

    Verify suspicious findings and confirm the root cause of service instability.

  10. Close out hunt

    Analyst task

    Record results and update the patching queue for vulnerable assets.

Coverage

Scenario coverage

StageCoveredHow, or why not
Exploitation of Public-Facing Application
T1190
Yes vulnerable-software-scoping, scanner-confirmed-vulnerabilities, nodejs-http-instability, libcurl-network-anomalies
Linux Kernel Privilege Escalation
T1068
Yes vulnerable-software-scoping, scanner-confirmed-vulnerabilities, kernel-log-anomalies

Blind spots

  • Needs hb_syslog with kernel facility. A host that does not forward kernel logs will show silence even if exploited, leading to a false negative. It would answer Can we see rhashtable errors on all Linux hosts?. Remediation: Enable kernel logging and rsyslog forwarding for all production Kubernetes nodes.
  • Needs hb_http_activity with status codes. If the proxy handles errors or masks them, we lose the primary signal of heap-use-after-free exploitation. It would answer Does the reverse proxy log 5xx errors from the backend Node.js app?. Remediation: Ensure back-end server status codes are preserved in the proxy access logs.

Parameters & data

Parameters

ParameterTypeDefaultWhat it is
cve_idslist[string]CVE-2026-56848, CVE-2026-64563, CVE-2026-9545, CVE-2026-13608CVE identifiers associated with the research.
lookback_daysnumber14Days of history to examine for behavioral logs.
scope_hostslist[host]—List of hostnames to focus the hunt on, typically populated from the scoping result.

Telemetry

SourceCategoryTelemetry
Endpoint telemetry (hb_ surfaces)endpointendpoint
Network telemetrynetworknetwork
Web server / proxy logssiemnetwork

Source

Download hunt.md Definition (JSON) An open hunt.md file; it runs anywhere that reads the format.
---
analysis: This hunt pivots from software inventory to three distinct telemetry surfaces
  (HTTP, Network, Syslog), using stack-counting to identify rare behavioral anomalies
  that a single rule on a CVE finding or a generic kernel panic would miss.
blind_spots:
- id: no-kernel-log-visibility
  owner: Infrastructure Team
  question: Can we see rhashtable errors on all Linux hosts?
  remediation: Enable kernel logging and rsyslog forwarding for all production Kubernetes
    nodes.
  requires: hb_syslog with kernel facility
  risk: A host that does not forward kernel logs will show silence even if exploited,
    leading to a false negative.
  stage: privilege-escalation-linux-kernel-exploit
- id: tls-termination-blindness
  owner: WAF Team
  question: Does the reverse proxy log 5xx errors from the backend Node.js app?
  remediation: Ensure back-end server status codes are preserved in the proxy access
    logs.
  requires: hb_http_activity with status codes
  risk: If the proxy handles errors or masks them, we lose the primary signal of heap-use-after-free
    exploitation.
  stage: initial-access-exploit-public-application
coverage:
- stage: initial-access-exploit-public-application
  status: covered
  steps:
  - vulnerable-software-scoping
  - scanner-confirmed-vulnerabilities
  - nodejs-http-instability
  - libcurl-network-anomalies
- stage: privilege-escalation-linux-kernel-exploit
  status: covered
  steps:
  - vulnerable-software-scoping
  - scanner-confirmed-vulnerabilities
  - kernel-log-anomalies
guardrails:
  claims: no_unsupported
  evidence: citation_required
  missing_data: not_benign
  telemetry: untrusted
hunt:
  applicability: campaign-specific
  handoff: promote-to-detection
  justification: Exploitation of core runtimes like Node.js and kernel-level vulnerabilities
    represents a high-impact risk for initial access and privilege escalation; a negative
    result over the estate confirms security baseline integrity.
  methodology: model-assisted
  trigger: intel-report
hypothesis: An attacker is exploiting vulnerabilities in Node.js HTTP/2 (CVE-2026-56848)
  or the Linux kernel rhashtable (CVE-2026-64563) to gain initial access or elevate
  privileges, as evidenced by service instability or specific kernel errors.
labels:
- hunt
- attack.t1190
- attack.t1068
- initial access
- privilege escalation
name: Exploitation of Core Services and Kernel Vulnerabilities
parameters:
  cve_ids:
    default:
    - CVE-2026-56848
    - CVE-2026-64563
    - CVE-2026-9545
    - CVE-2026-13608
    description: CVE identifiers associated with the research.
    from:
      kind: article
      observed: '2026-10-07'
      ref: msrc-blog-2026-10-07
    type: list[string]
  lookback_days:
    default: '14'
    description: Days of history to examine for behavioral logs.
    type: number
  scope_hosts:
    default: []
    description: List of hostnames to focus the hunt on, typically populated from
      the scoping result.
    type: list[host]
provenance:
  authors:
  - name: Huntbase hunt generation
    org: huntbase.io
  generated:
    by: huntbase-hunt-generation
    from: https://www.microsoft.com/en-us/security/blog/2026/10/07/3-lessons-from-frontier-ai-vulnerability-research/
    gates:
    - dry-run
    - lint
    model: hb_google/gemini-3-flash-preview
rationale: Focus on internet-facing Linux servers and application clusters where Node.js
  is the primary runtime. Developer workstations running llama.cpp or heavy curl automation
  should also be included in the scope.
references:
- name: 'Microsoft Security Blog: 3 lessons from frontier AI vulnerability research'
  url: https://www.microsoft.com/en-us/security/blog/2026/10/07/3-lessons-from-frontier-ai-vulnerability-research/
related:
- hunt: container-escape-via-kernel-vulnerability
  reason: While this hunt looks for kernel rhashtable errors, a dedicated escape hunt
    would focus on process activity crossing namespace boundaries.
  relation: out-of-scope-alternative
scenario:
  stages:
  - name: Exploitation of Public-Facing Application
    observables:
    - CVE-2026-56848 (Node.js heap-use-after-free via HTTP/2)
    - CVE-2026-9545 (curl SSL session reuse with impostor host)
    - CVE-2026-13608 (curl)
    - Node.js versions 22.x, 24.x, and 26.x
    - curl
    - llama.cpp
    - vLLM
    - HTTP/2 traffic triggering nghttp2_session_mem_send re-entrancy
    slug: initial-access-exploit-public-application
    tactic: initial-access
    techniques:
    - T1190
  - name: Linux Kernel Privilege Escalation
    observables:
    - CVE-2026-64563 (Linux kernel rhashtable stale pointer dereference)
    - rhashtable_walk_start_check restart path
    - rhashtable_walk_next stale pointer dereference
    - Linux kernel panic or rhashtable error messages
    slug: privilege-escalation-linux-kernel-exploit
    tactic: privilege-escalation
    techniques:
    - T1068
  summary: Microsoft's FORGE Lab identified and helped remediate multiple critical
    vulnerabilities in the Linux kernel and open-source runtimes like Node.js and
    curl using AI-driven agentic discovery. These flaws, including a heap-use-after-free
    in Node.js (CVE-2026-56848) and a stale pointer dereference in the Linux kernel
    (CVE-2026-64563), allow for initial access via web exploitation and subsequent
    local privilege escalation.
severity: high
targets:
  analyst:
    name: Tier-2 analyst
    role: analyst
  endpoint:
    category: endpoint
    name: Endpoint telemetry (hb_ surfaces)
    telemetry:
    - endpoint
  hunter:
    agent: true
    name: Hunt agent
  network:
    category: network
    name: Network telemetry
    telemetry:
    - network
  web:
    category: siem
    name: Web server / proxy logs
    telemetry:
    - network
tlp: clear
type: investigation
---


# Exploitation of Core Services and Kernel Vulnerabilities

This hunt targets critical vulnerabilities discovered by Microsoft FORGE Lab affecting core application runtimes and the Linux kernel. The flow identifies hosts running vulnerable versions of Node.js (specifically major versions 22, 24, and 26) and curl, then corroborates this inventory against known vulnerability findings, server-side HTTP instability, client-side network anomalies from libcurl, and specific kernel log patterns indicative of exploitation. An agent weighs these independent signals to identify confirmed compromises.

## vulnerable-software-scoping
<!-- Scoping vulnerable Node.js and curl versions -->
Identify hosts running Node.js versions 22.x, 24.x, or 26.x and libcurl to narrow the behavioral search.

```sqlite target=endpoint role=scoping
~~~yaml
expected: A list of hosts running vulnerable versions of Node.js or curl. Silence
  means no such software is inventoried.
reads:
- device_hostname
- package_name
- package_version
silence: not_evidence_of_absence
source: hb_software_inventory
verified: dry-run
verified_at: '2026-10-08'
~~~
SELECT DISTINCT device_hostname, package_name, package_version FROM hb_software_inventory WHERE ( (LOWER(package_name) IN ('node', 'nodejs') AND (package_version LIKE '22.%' OR package_version LIKE '24.%' OR package_version LIKE '26.%')) OR (LOWER(package_name) IN ('curl', 'libcurl', 'llama.cpp')) )
```

## fan-out-corroboration
<!-- Corroborate with findings and behavior -->
parallel:
- → scanner-confirmed-vulnerabilities
- → nodejs-http-instability
- → libcurl-network-anomalies
- → kernel-log-anomalies
join: → triage-evidence

## scanner-confirmed-vulnerabilities
<!-- Existing vulnerability findings -->
Prioritize hosts where scanners have already flagged the specific CVEs named in the research.

```sqlite target=endpoint role=enrichment params=(cve_ids=cve_ids)
~~~yaml
expected: Confirmed findings for the target CVEs. This provides a high-confidence
  starting point for the behavioral triage.
reads:
- device_uid
- resource_uid
- cve_uid
- severity
- first_seen
silence: not_evidence_of_absence
source: hb_vulnerability_finding
verified: dry-run
verified_at: '2026-10-08'
~~~
SELECT device_uid, resource_uid, cve_uid, severity, first_seen FROM hb_vulnerability_finding WHERE instr(',' || '{{cve_ids}}' || ',', ',' || cve_uid || ',') > 0 AND status != 'suppressed'
```

## nodejs-http-instability
<!-- Node.js server-side errors -->
Identify potential heap-use-after-free exploitation in Node.js causing application-level crashes (5xx errors).

```sqlite target=web role=baseline params=(lookback_days=lookback_days, scope_hosts=scope_hosts)
~~~yaml
baseline:
  compare: first_seen
  window: '{{lookback_days}}d'
expected: Spikes in 500 errors on systems identified as running vulnerable Node.js
  versions.
prevalence:
  by: device_hostname
  key:
  - url_path
  - status_code
  rare_below: 3
reads:
- device_hostname
- url_path
- status_code
- user_agent
- time
silence: not_evidence_of_absence
source: hb_http_activity
verified: dry-run
verified_at: '2026-10-08'
~~~
SELECT device_hostname, url_path, status_code, user_agent, COUNT(*) AS error_count FROM hb_http_activity WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND status_code >= 500 AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY device_hostname, url_path, status_code, user_agent
```

## libcurl-network-anomalies
<!-- Libcurl outbound anomalies -->
Monitor for libcurl processes communicating with rare external hosts, potentially indicating session reuse exploitation.

```sqlite target=network role=baseline params=(lookback_days=lookback_days, scope_hosts=scope_hosts)
~~~yaml
baseline:
  compare: new_this_window
  window: '{{lookback_days}}d'
expected: Outbound connections from curl-related processes to rare destination IPs
  not seen elsewhere in the fleet.
prevalence:
  by: device_hostname
  key:
  - dst_endpoint_ip
  rare_below: 2
reads:
- device_hostname
- process_name
- dst_endpoint_ip
- dst_endpoint_port
- time
silence: not_evidence_of_absence
source: hb_network_connection
verified: dry-run
verified_at: '2026-10-08'
~~~
SELECT device_hostname, process_name, dst_endpoint_ip, dst_endpoint_port, COUNT(*) AS connection_count FROM hb_network_connection WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND (LOWER(process_name) LIKE '%curl%' OR LOWER(process_name) LIKE '%llama.cpp%') AND direction = 'outbound' AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY device_hostname, process_name, dst_endpoint_ip, dst_endpoint_port
```

## kernel-log-anomalies
<!-- Kernel rhashtable errors -->
Find specific kernel error strings related to the rhashtable stale pointer dereference (CVE-2026-64563).

```sqlite target=endpoint role=detection-candidate params=(lookback_days=lookback_days, scope_hosts=scope_hosts)
~~~yaml
expected: Syslog entries capturing kernel crashes or errors mentioning rhashtable
  functions. Absence means no such errors were logged.
reads:
- device_hostname
- syslog_tag
- message
- time
silence: not_evidence_of_absence
source: hb_syslog
verified: dry-run
verified_at: '2026-10-08'
~~~
SELECT device_hostname, syslog_tag, message, time FROM hb_syslog WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND (LOWER(message) LIKE '%rhashtable_walk_next%' OR LOWER(message) LIKE '%stale pointer%') AND time >= datetime('now', '-{{lookback_days}} days')
```

## triage-evidence
<!-- Correlate exploitation signals -->
```agent target=hunter
cite: required
context:
- vulnerable-software-scoping
- scanner-confirmed-vulnerabilities
- nodejs-http-instability
- libcurl-network-anomalies
- kernel-log-anomalies
max_iterations: 6
objective: Determine if any host shows evidence of active exploitation of the Node.js
  or Linux kernel vulnerabilities based on the correlated evidence.
success_criteria: A per-host verdict of malicious, suspicious, or benign citing specific
  log rows and software versions.
tools:
- endpoint
- network
- web
```

## routing-decision
<!-- Route on triage verdict -->
if~: "The triage-evidence verdict is malicious for at least one host" (confidence: high, judge=hunter)
then: → contain-and-isolate
indeterminate: → analyst-manual-review
unavailable: → analyst-manual-review (blind_spot: no-kernel-log-visibility)
else: → close-out-benign

## contain-and-isolate
<!-- Isolate host and revoke credentials -->
```action target=endpoint
~~~yaml
approval: required
~~~
Isolate the identified host from the network and revoke any application-level API tokens used by the vulnerable service.
```
→ analyst-manual-review

## analyst-manual-review
<!-- Analyst manual review -->
```manual target=analyst
Review the hb_syslog and hb_http_activity rows; for Node.js findings, check for repetitive patterns in the url_path that might indicate an exploit payload.
```
→ close-out-benign

## close-out-benign
<!-- Close out hunt -->
```manual target=analyst
Document any identified vulnerable systems that were not compromised and ensure they are prioritized for patching Node.js and the Linux kernel.
```
→ end

Run it

Take this hunt into your environment.

Open it in Huntbase to run every step against your own connections, with Scout weighing the evidence and your analysts in command. Or take the open hunt.md file anywhere that reads the format.

Machine-drafted by huntbase-hunt-generation using hb_google/gemini-3-flash-preview, gated by dry-run, lint, then reviewed by a person.