Teams should use a runtime control that observes network connections, process execution, and file writes directly on the runner. That approach reduces blind spots created by platform differences and helps detect suspicious behaviour during CI/CD execution. Consistency matters because the same control should work across hosted and self-hosted runners without forcing separate workflow designs for each operating system.
Why This Matters for Security Teams
github actions runner are execution environments, not just build agents, which means they can touch source code, secrets, package registries, cloud credentials, and deployment targets in the same job. Monitoring has to catch what the workflow does at runtime, across Linux, Windows, and macOS, because the risk is not limited to one operating system or one runner type. NIST’s Security and Privacy Controls remain useful for control objectives, but they do not by themselves solve cross-platform runner visibility.
This is especially relevant in CI/CD because attackers often target build-time trust, not just production systems. NHIMG’s GitHub Action tj-actions Supply Chain Attack and Reviewdog GitHub Action supply chain attack both show why security teams need runtime telemetry rather than workflow-only review. The operational issue is simple: if monitoring depends on editing each workflow, detection arrives too late or never reaches the jobs that matter most. In practice, many security teams encounter runner abuse only after secrets have already been exposed or exfiltrated, rather than through intentional visibility during execution.
How It Works in Practice
The most reliable pattern is a host-level or runner-attached runtime sensor that records process execution, network connections, and file writes without changing workflow logic. That gives security teams a consistent view of what happens inside the job, regardless of whether the runner is hosted or self-hosted. For Linux, Windows, and macOS, the implementation details differ, but the monitoring goal stays the same: detect unexpected child processes, unusual outbound connections, and writes to sensitive paths.
This aligns with current guidance in NIST SP 800-53 Rev. 5 Security and Privacy Controls and with operational lessons from the CI/CD pipeline exploitation case study. In practice, teams usually pair the sensor with rules that flag behavior such as:
- shell spawning from package managers, test frameworks, or build tooling
- network egress to unfamiliar domains or direct IP destinations
- file creation in workspace, temp, credential, or artifact directories
- attempts to read secrets stores, environment exports, or token caches
- rapid command chaining that indicates script-based abuse or staging
For cross-platform coverage, use a normalization layer so alerts are comparable even when the underlying event sources differ. Linux may surface audit or eBPF-style telemetry, Windows may rely on process and script visibility, and macOS may require endpoint instrumentation with comparable process and network detail. The critical design choice is that detection logic should key on behavior, not on workflow YAML changes. These controls tend to break down on highly ephemeral, autoscaled runners with short job lifetimes because telemetry can disappear before collection and normalization complete.
Common Variations and Edge Cases
Tighter runtime monitoring often increases telemetry volume and operational overhead, requiring organisations to balance detection depth against runner performance and alert fatigue. That tradeoff matters most when teams run large test matrices, bursty ephemeral runners, or mixed hosted and self-hosted fleets. Best practice is evolving, but there is no universal standard for how much host telemetry is enough on every runner class.
Some environments also limit what can be observed. Privileged containers, nested virtualization, and heavily locked-down macOS runners can reduce sensor fidelity. In those cases, teams should layer runtime telemetry with repository protection, secret scanning, and artifact review rather than assuming one control will cover everything. NHIMG’s The State of Non-Human Identity Security is clear that inadequate monitoring and logging remains a common cause of NHI-related incidents, which is why runner visibility should be treated as a baseline control, not an advanced add-on. Where jobs depend on legitimate network access to many third-party services, allowlisting and behavioral baselining become necessary to separate normal build traffic from suspicious exfiltration.
Standards & Framework Alignment
This section maps relevant standards and security frameworks to the operational risks and controls described in this guidance.
OWASP Agentic AI Top 10, CSA MAESTRO and OWASP Non-Human Identity Top 10 address the attack and risk surface, while NIST AI RMF and NIST CSF 2.0 set the governance and control requirements practitioners need to meet.
| Framework | Control / Reference | Relevance |
|---|---|---|
| OWASP Agentic AI Top 10 | A03 | Runtime runner monitoring detects unsafe autonomous execution and tool abuse. |
| CSA MAESTRO | MA-03 | MAESTRO covers agent/workload observability across dynamic execution contexts. |
| NIST AI RMF | GOVERN | AI RMF governance supports accountability for automated workloads and their actions. |
| OWASP Non-Human Identity Top 10 | NHI-07 | Monitoring runner identity and secret use is core to NHI runtime protection. |
| NIST CSF 2.0 | DE.CM-1 | Continuous monitoring directly matches detection of anomalous runner activity. |
Instrument job execution and flag unexpected process, network, and file activity at runtime.
Related resources from NHI Mgmt Group
- How can teams decide whether to centralise developer machine security controls across Linux, macOS, and Windows?
- How should security teams implement GitHub Actions SHA pinning across a large repository estate?
- How do security teams compare model cost, latency, and output quality across providers without building a separate evaluation workflow?
- How should security teams enforce guardrails across AI gateways and agent actions without wiring each application separately?