← All hunts high TLP:CLEAR Part 1 of 2

Cisco SD-WAN Controller Service Tampering

An adversary has exploited a Cisco SD-WAN authentication bypass to establish persistence by modifying runit service scripts and remounting the root filesystem as executable to facilitate malware deployment.

Based on research by Cisco Talos 2026-10-29 11 steps · 3 queries T1036.004 T1037 T1190 T1543 T1574.006

Brief

Why now

  • Cisco Talos recently detailed historical activity from UAT-11473, a cluster using the KeyDrift framework to compromise Cisco SD-WAN controllers. These controllers, including vSmart, vManage, and vBond instances, serve as the trust anchor for enterprise networks. An adversary with persistence on a controller can intercept all control traffic and extract data-plane encryption keys, effectively voiding the confidentiality of the entire SD-WAN fabric. The attack often begins with an authentication bypass, such as CVE-2026-20127, allowing the actor to gain an initial foothold. This hunt provides a structured way to find these compromises by looking for the underlying OS modifications required to support the malware framework persistence and evasion techniques.

How the hunt flows

The hunt begins in the Linux audit logs (hb_linux_audit) by examining syscall history. It specifically searches for mount syscalls targeting the /rootfs.rw path with the exec option enabled. This is a critical lead because the controller underlying filesystem is normally mounted as non-executable to prevent unauthorized binary execution. The adversary must explicitly remount the filesystem as executable to run their staged payloads and persistence scripts.

If the hunt identifies suspicious remounting activity, it triggers a fan-out phase using file activity logs (hb_file_activity). The first branch of this phase looks for direct writes or modifications to known targets such as /etc/sv/sshd/run, /etc/sv/aaamgr/run, and PAM configuration files like /etc/pam.d/sshd. These locations are where KeyDrift typically embeds its logic to intercept credentials or maintain a persistent backdoor.

  • Simultaneously, the hunt performs a fleet-wide stacking analysis of all runit service script modifications. By gathering all modifications to files in the /etc/sv/ directory, the hunt calculates the prevalence of these changes across all controllers. Legitimate maintenance or firmware updates typically appear as identical changes across the entire fleet. In contrast, adversary tampering is usually unique to a small number of compromised controllers, which this query highlights by filtering for low host counts.

In the final triage phase, an automated agent synthesizes the evidence from the remount lead, the targeted file modifications, and the prevalence baseline. This agent determines if the sequence of events aligns with the UAT-11473 staging pattern. If the evidence is sufficient, the hunt prompts the analyst to isolate the controller via a manual action and initiate a forensic review of the modified scripts and the current patch level of the appliance.

What this hunt cannot see

This hunt has two primary blind spots that practitioners must address. First, the hunt relies entirely on auditd being configured to log the mount syscall. If the SD-WAN controller fleet does not audit syscalls, the initial lead will return zero results, and the hunt will close even if a compromise is active. Second, while the hunt identifies both the remount and the subsequent file writes, the relationship between these events in the logs is temporal rather than causal. An analyst must manually verify that a specific remount event was the prerequisite for the observed service tampering.

In this series

Steps

  1. Remount rootfs as executable

    Query · scoping

    Identify the critical defense evasion step where /rootfs.rw is remounted as executable to allow malicious scripts to run.

    reads hb_linux_auditsql
    SELECT device_hostname, process_path, path_name, raw_record, time FROM hb_linux_audit WHERE record_type = 'SYSCALL' AND syscall = 'mount' AND (LOWER(raw_record) LIKE '%remount%' AND LOWER(raw_record) LIKE '%exec%' AND LOWER(raw_record) LIKE '%/rootfs.rw%') AND time >= datetime('now', '-{{lookback_days}} days')

    What a hit looks like. A mount syscall targeting /rootfs.rw with the 'exec' option. Silence indicates no such remounting was captured during the window.

  2. Read remount lead

    Agent triage

    Determine if the remount activity is consistent with the KeyDrift framework staging.

  3. Gate on remount verdict

    Decision

    Avoid expensive file activity queries across the whole fleet unless a suspicious remount is found.

  4. Runit script tampering

    Query · detection candidate

    Detect modifications to the specific runit service scripts and PAM configurations described in the KeyDrift staging.

    reads hb_file_activitysql
    SELECT device_hostname, process_name, file_path, activity_name, time FROM hb_file_activity WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND instr(',' || '{{target_paths}}' || ',', ',' || LOWER(file_path) || ',') > 0 AND activity_id IN (1, 3, 4, 5) AND time >= datetime('now', '-{{lookback_days}} days')

    What a hit looks like. File writes or modifications to runit run scripts or PAM configuration files. Silence suggests no tampering occurred on those paths.

  5. Rare runit script modifications

    Query · baseline

    Stack-count all runit script modifications to highlight those unique to a small number of hosts.

    reads hb_file_activitysql
    SELECT LOWER(file_path) AS script_path, COUNT(DISTINCT device_hostname) AS host_count, COUNT(*) AS write_events, MIN(time) AS first_seen FROM hb_file_activity WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND LOWER(file_path) LIKE '/etc/sv/%/run' AND activity_id IN (1, 3) AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY 1 HAVING host_count <= 3 ORDER BY host_count ASC

    What a hit looks like. Runit script paths modified on only one or two hosts. Fleet-wide changes are likely legitimate firmware updates.

  6. Triage compromised controller

    Agent triage

    Synthesize the defense evasion and persistence evidence to confirm an APT intrusion.

  7. Route on triage verdict

    Decision

    Direct the hunt to containment for confirmed malicious results.

  8. Isolate SD-WAN controller

    Response action

    Halt further collection and exfiltration from the compromised controller.

  9. Forensic review

    Analyst task

    Collect the modified service scripts for analysis and check for the CVE-2026-20127 vulnerability status.

  10. Close out

    Analyst task

    Finalize the hunt and record findings.

Coverage

Scenario coverage

StageCoveredHow, or why not
Cisco SD-WAN Authentication Bypass
T1190
Not visible The peering authentication bypass occurs within the proprietary SD-WAN control plane; it does not leave standard authentication logs on the listed surfaces.
Runit Service Launcher Modification
T1037 · T1543
Yes script-tampering, rare-scripts
Rootfs Executable Remounting
T1574.006
Yes lead-remount
Process Injection and PID Enumeration
T1055.008 · T1059.004 · T1036.004
Out of scope Belongs to another part of the 'Inside KeyDrift: Analyzing historical UAT-11473 activity on Cisco SD-WAN' series.
Control-Plane Interception Hooking
T1574.006
Out of scope Belongs to another part of the 'Inside KeyDrift: Analyzing historical UAT-11473 activity on Cisco SD-WAN' series.
Telemetry Staging and C2 Exfiltration
T1041
Out of scope Belongs to another part of the 'Inside KeyDrift: Analyzing historical UAT-11473 activity on Cisco SD-WAN' series.

Blind spots

  • Needs hb_linux_audit with SYSCALL:mount monitoring. If auditd is not configured to log the mount syscall, the lead query will return zero rows, and the gate will close even if the controller is compromised. It would answer whether the remount command was executed. Remediation: Enable syscall auditing for 'mount' across the SD-WAN controller fleet.
  • Needs Deep inspection of overlay filesystem changes. File activity logs might show the write, but the relationship between the remount and the write is temporal, not causal in the logs; an analyst must manually link them. It would answer what precise changes were made to the overlay when the remount occurred.

Parameters & data

Parameters

ParameterTypeDefaultWhat it is
lookback_daysnumber14Days of history to examine for process and file activity.
scope_hostslist[host]—Specific hostnames to focus on, typically those identified in the scoping lead.
target_pathslist[path]/etc/sv/sshd/run, /etc/sv/aaamgr/run, /etc/pam.d/sshd, /etc/pam.d/loginRunit service scripts and PAM configurations targeted for tampering.

Telemetry

SourceCategoryTelemetry
Endpoint telemetry (hb_ surfaces)endpointendpoint

Source

Download hunt.md Definition (JSON) An open hunt.md file; it runs anywhere that reads the format.
---
analysis: A static rule might fire on any write to /etc/sv, but this hunt provides
  the vital context of a specific filesystem remount (defense evasion) combined with
  fleet prevalence counting to distinguish targeted APT tampering from vendor firmware
  updates.
blind_spots:
- id: auditd-unconfigured
  owner: Cloud Infrastructure Team
  question: whether the remount command was executed
  remediation: Enable syscall auditing for 'mount' across the SD-WAN controller fleet.
  requires: hb_linux_audit with SYSCALL:mount monitoring
  risk: If auditd is not configured to log the mount syscall, the lead query will
    return zero rows, and the gate will close even if the controller is compromised.
  stage: defense-evasion-remount-rootfs
- id: overlay-fs-complexity
  question: what precise changes were made to the overlay when the remount occurred
  requires: Deep inspection of overlay filesystem changes
  risk: File activity logs might show the write, but the relationship between the
    remount and the write is temporal, not causal in the logs; an analyst must manually
    link them.
  stage: persistence-runit-service-tampering
coverage:
- reason: The peering authentication bypass occurs within the proprietary SD-WAN control
    plane; it does not leave standard authentication logs on the listed surfaces.
  stage: initial-access-cisco-auth-bypass
  status: not_visible
- stage: persistence-runit-service-tampering
  status: covered
  steps:
  - script-tampering
  - rare-scripts
- stage: defense-evasion-remount-rootfs
  status: covered
  steps:
  - lead-remount
- reason: 'Belongs to another part of the ''Inside KeyDrift: Analyzing historical
    UAT-11473 activity on Cisco SD-WAN'' series.'
  stage: execution-injection-ptrace
  status: out_of_scope
- reason: 'Belongs to another part of the ''Inside KeyDrift: Analyzing historical
    UAT-11473 activity on Cisco SD-WAN'' series.'
  stage: collection-in-process-hooking
  status: out_of_scope
- reason: 'Belongs to another part of the ''Inside KeyDrift: Analyzing historical
    UAT-11473 activity on Cisco SD-WAN'' series.'
  stage: exfiltration-in-band-c2
  status: out_of_scope
guardrails:
  claims: no_unsupported
  evidence: citation_required
  missing_data: not_benign
  telemetry: untrusted
hunt:
  applicability: campaign-specific
  handoff: promote-to-detection
  justification: Cisco SD-WAN controllers are the trust anchor of the enterprise network.
    A compromise here allows an adversary to intercept all control traffic and extract
    data-plane encryption keys, rendering the network's confidentiality void.
  methodology: model-assisted
  trigger: intel-report
hypothesis: An adversary has exploited a Cisco SD-WAN authentication bypass to establish
  persistence by modifying runit service scripts and remounting the root filesystem
  as executable to facilitate malware deployment.
labels:
- hunt
- attack.t1190
- attack.t1037
- attack.t1543
- attack.t1574.006
- attack.t1036.004
- collection
- defense evasion
- execution
- exfiltration
- initial access
- persistence
name: Cisco SD-WAN Controller Service Tampering
parameters:
  lookback_days:
    default: '14'
    description: Days of history to examine for process and file activity.
    type: number
  scope_hosts:
    default: []
    description: Specific hostnames to focus on, typically those identified in the
      scoping lead.
    type: list[host]
  target_paths:
    default:
    - /etc/sv/sshd/run
    - /etc/sv/aaamgr/run
    - /etc/pam.d/sshd
    - /etc/pam.d/login
    description: Runit service scripts and PAM configurations targeted for tampering.
    from:
      kind: article
      observed: '2026-10-28'
      ref: uat-11473-keydrift
    type: list[path]
provenance:
  authors:
  - name: Huntbase hunt generation
    org: huntbase.io
  generated:
    by: huntbase-hunt-generation
    from: https://blog.talosintelligence.com/uat-11473-keydrift/
    gates:
    - dry-run
    - lint
    - critic
    model: hb_google/gemini-3-flash-preview
rationale: Focus on Cisco Catalyst SD-WAN Controller instances (vSmart, vManage, vBond).
  These typically run a specific Linux-based firmware. Remounting /rootfs.rw as executable
  is a rare administrative action.
references:
- name: 'Inside KeyDrift: Analyzing historical UAT-11473 activity on Cisco SD-WAN'
  url: https://blog.talosintelligence.com/uat-11473-keydrift/
related:
- hunt: keydrift-ptrace-injection
  reason: Once persistence is established via service tampering, the malware framework
    typically proceeds to inject into vdaemon using ptrace.
  relation: follows
scenario:
  stages:
  - name: Cisco SD-WAN Authentication Bypass
    observables:
    - CVE-2026-20127
    - Cisco SD-WAN Catalyst Controller
    slug: initial-access-cisco-auth-bypass
    tactic: initial-access
    techniques:
    - T1190
  - name: Runit Service Launcher Modification
    observables:
    - /etc/sv/sshd/run
    - /etc/sv/aaamgr/run
    - deletion of writable-overlay PAM configurations
    - invocation of malicious run scripts before legitimate service start
    slug: persistence-runit-service-tampering
    tactic: persistence
    techniques:
    - T1037
    - T1543
  - name: Rootfs Executable Remounting
    observables:
    - remount /rootfs.rw as executable
    - mount -o remount,exec /rootfs.rw
    slug: defense-evasion-remount-rootfs
    tactic: defense-evasion
    techniques:
    - T1574.006
  - name: Process Injection and PID Enumeration
    observables:
    - conf_sshd script execution
    - rsshd injector execution
    - aaamgrd packed loader execution
    - ptrace system calls against vdaemon processes
    - /tmp/system-vdaemon
    - enumeration of vdaemon PIDs
    slug: execution-injection-ptrace
    tactic: execution
    techniques:
    - T1055.008
    - T1059.004
    - T1036.004
  - name: Control-Plane Interception Hooking
    observables:
    - libdssl.so (PolyFlame)
    - libcommon.so (LittleFilch)
    - hooking of SSL_read inside vdaemon
    - hooking of recvfrom, sendto, and dlopen in vdaemon
    - interposition of runtime-linker behavior
    slug: collection-in-process-hooking
    tactic: collection
    techniques:
    - T1574.006
  - name: Telemetry Staging and C2 Exfiltration
    observables:
    - /var/tmp/vdaemon.bin (RSA-encrypted telemetry)
    - /var/tmp/vdaemon.conf (Endpoint configuration)
    - UDP exfiltration in DTLS 1.2 style records
    - TinyShell command codes 0x100, 0x200, 0x300
    slug: exfiltration-in-band-c2
    tactic: exfiltration
    techniques:
    - T1041
  summary: UAT-11473 exploited an authentication bypass vulnerability (CVE-2026-20127)
    in Cisco SD-WAN Catalyst Controllers to gain unauthorized administrative access.
    The threat actor established persistence by modifying runit service scripts to
    launch the KeyDrift framework, which uses ptrace injection and runtime hooking
    to intercept sensitive control-plane keying material and exfiltrate it over UDP.
series:
  index: 1
  slug: inside-keydrift-analyzing-historical-uat-11473-activity-on-cisco-sd-wan
  title: 'Inside KeyDrift: Analyzing historical UAT-11473 activity on Cisco SD-WAN'
  total: 2
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
tlp: clear
type: investigation
---


# Cisco SD-WAN Controller Service Tampering

The adversary exploits a Cisco SD-WAN authentication bypass to modify runit service scripts and remount the root filesystem as executable. This hunt identifies the initial remounting of the /rootfs.rw filesystem, a mandatory step for the attacker to write to the underlying OS. If suspicious remounting is identified, the hunt fans out to examine modifications to runit service launchers and stack-counts these changes across the fleet to highlight rare, malicious patterns that deviate from standard Cisco firmware behavior. An agent weighs the combined evidence to identify compromised controllers before an analyst initiates containment.

## lead-remount
<!-- Remount rootfs as executable -->
Identify the critical defense evasion step where /rootfs.rw is remounted as executable to allow malicious scripts to run.

```sqlite target=endpoint role=scoping params=(lookback_days=lookback_days)
~~~yaml
expected: A mount syscall targeting /rootfs.rw with the 'exec' option. Silence indicates
  no such remounting was captured during the window.
reads:
- device_hostname
- process_path
- path_name
- raw_record
- time
- record_type
- syscall
silence: not_evidence_of_absence
source: hb_linux_audit
verified: dry-run
verified_at: '2026-10-29'
~~~
SELECT device_hostname, process_path, path_name, raw_record, time FROM hb_linux_audit WHERE record_type = 'SYSCALL' AND syscall = 'mount' AND (LOWER(raw_record) LIKE '%remount%' AND LOWER(raw_record) LIKE '%exec%' AND LOWER(raw_record) LIKE '%/rootfs.rw%') AND time >= datetime('now', '-{{lookback_days}} days')
```

## gate-agent
<!-- Read remount lead -->
```agent target=hunter
cite: required
context:
- lead-remount
max_iterations: 3
objective: Evaluate the context of the mount syscall; determine if /rootfs.rw was
  remounted specifically with executable flags outside of a standard update window.
success_criteria: A verdict of suspicious or benign for every host found in the lead.
tools:
- endpoint
```

## gate-decision
<!-- Gate on remount verdict -->
if~: "the gate-agent verdict is suspicious or malicious for at least one host" (confidence: high, judge=hunter)
then: → fan-out-tampering
indeterminate: → forensic-task
unavailable: → forensic-task (blind_spot: auditd-unconfigured)
else: → close-out-task

## fan-out-tampering
<!-- Corroborate service tampering -->
parallel:
- → script-tampering
- → rare-scripts
join: → triage-agent

## script-tampering
<!-- Runit script tampering -->
Detect modifications to the specific runit service scripts and PAM configurations described in the KeyDrift staging.

```sqlite target=endpoint role=detection-candidate params=(lookback_days=lookback_days, scope_hosts=scope_hosts, target_paths=target_paths)
~~~yaml
expected: File writes or modifications to runit run scripts or PAM configuration files.
  Silence suggests no tampering occurred on those paths.
reads:
- device_hostname
- process_name
- file_path
- activity_name
- time
- activity_id
silence: not_evidence_of_absence
source: hb_file_activity
verified: dry-run
verified_at: '2026-10-29'
~~~
SELECT device_hostname, process_name, file_path, activity_name, time FROM hb_file_activity WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND instr(',' || '{{target_paths}}' || ',', ',' || LOWER(file_path) || ',') > 0 AND activity_id IN (1, 3, 4, 5) AND time >= datetime('now', '-{{lookback_days}} days')
```

## rare-scripts
<!-- Rare runit script modifications -->
Stack-count all runit script modifications to highlight those unique to a small number of hosts.

```sqlite target=endpoint role=baseline params=(lookback_days=lookback_days, scope_hosts=scope_hosts)
~~~yaml
baseline:
  compare: first_seen
  window: '{{lookback_days}}d'
expected: Runit script paths modified on only one or two hosts. Fleet-wide changes
  are likely legitimate firmware updates.
prevalence:
  by: device_hostname
  key:
  - script_path
  rare_below: 3
reads:
- file_path
- device_hostname
- activity_id
- time
silence: not_evidence_of_absence
source: hb_file_activity
verified: dry-run
verified_at: '2026-10-29'
~~~
SELECT LOWER(file_path) AS script_path, COUNT(DISTINCT device_hostname) AS host_count, COUNT(*) AS write_events, MIN(time) AS first_seen FROM hb_file_activity WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND LOWER(file_path) LIKE '/etc/sv/%/run' AND activity_id IN (1, 3) AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY 1 HAVING host_count <= 3 ORDER BY host_count ASC
```

## triage-agent
<!-- Triage compromised controller -->
```agent target=hunter
cite: required
context:
- gate-agent
- script-tampering
- rare-scripts
max_iterations: 5
objective: Determine if the sequence of remounting /rootfs.rw followed by modifications
  to service scripts indicates a KeyDrift infection. Use prevalence data to rule out
  legitimate maintenance.
success_criteria: A final verdict citing the alignment between the observed behavior
  and the UAT-11473 staging pattern.
tools:
- endpoint
```

## route-decision
<!-- Route on triage verdict -->
if~: "the triage-agent verdict is malicious for at least one host" (confidence: high, judge=hunter)
then: → isolate-action
indeterminate: → forensic-task
unavailable: → forensic-task
else: → close-out-task

## isolate-action
<!-- Isolate SD-WAN controller -->
```action target=endpoint
~~~yaml
approval: required
~~~
Isolate the controller and initiate incident response. Revoke any control-plane certificates associated with this instance and prepare for a re-image.
```
→ forensic-task

## forensic-task
<!-- Forensic review -->
```manual target=analyst
Retrieve the content of the modified scripts found in /etc/sv/. Verify if the host is vulnerable to CVE-2026-20127 by checking patch levels or hb_vulnerability_finding for the CVE ID.
```
→ close-out-task

## close-out-task
<!-- Close out -->
```manual target=analyst
Record the hosts examined and whether any evidence of service tampering was identified. Ensure tuning notes are added if legitimate maintenance caused noise.
```
→ 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, critic, then reviewed by a person.

Locked pack

Sign up to unlock

Pack contents are available to Huntbase users.