New GitHub Self Hosted Action Runner

Last updated a month ago on 2026-10-07
Created a year ago on 2025-11-28

About

This rule detects the registration of a self-hosted GitHub Actions runner by a user and source ASN (autonomous system) pair not seen in the last 5 days. The source IP is resolved to its ASN at query time, so address churn inside the same ISP or cloud provider does not produce new alerts. Adversaries may abuse self-hosted runners to execute workflow jobs on customer infrastructure.
Tags
Domain: CloudUse Case: Threat DetectionTactic: Initial AccessData Source: GithubData Source: GitHub Audit LogsNoise: LowPerformance: FastProfile: RecommendedThreat: Supply ChainRule Type: ES|QLPlatform: GitHubDomain: SaaSLanguage: esql
Severity
medium
Risk Score
47
MITRE ATT&CK™

Initial Access (TA0001)(external, opens in a new tab or window)

False Positive Examples
Authorized self-hosted GitHub actions runner.
License
Elastic License v2(external, opens in a new tab or window)

Definition

Integration Pack
Prebuilt Security Detection Rules
Related Integrations

github(external, opens in a new tab or window)

Query
text code block:
FROM logs-github.audit-* | WHERE event.dataset == "github.audit" AND event.category == "configuration" AND event.action IN ("repo.register_self_hosted_runner", "org.register_self_hosted_runner", "enterprise.register_self_hosted_runner") AND user.name IS NOT NULL AND github.actor_ip IS NOT NULL | IP_LOCATION asn = github.actor_ip WITH { "database_file": "GeoLite2-ASN.mmdb", "properties": ["asn", "organization_name"] } | IP_LOCATION geo = github.actor_ip WITH { "properties": ["country_iso_code"] } | WHERE asn.asn IS NOT NULL | STATS Esql.event_count = COUNT(*), Esql.first_seen = MIN(@timestamp), Esql.last_seen = MAX(@timestamp), Esql.ip_values = VALUES(github.actor_ip), Esql.event_action_values = VALUES(event.action), Esql.repo_values = VALUES(github.repo), Esql.org_values = VALUES(github.org), Esql.country_values = VALUES(geo.country_iso_code), Esql.user_agent_values = VALUES(github.user_agent) BY user.name, asn.asn, asn.organization_name // The 5-day history is the rule look-back (from = now-7205m). A user/ASN pair is new when its first // event falls inside the current interval; the 10m bound allows for the 5m interval plus scheduling drift. | WHERE DATE_DIFF("minute", Esql.first_seen, NOW()) <= 10 | EVAL Esql.source_as_number = asn.asn, Esql.source_as_organization_name = asn.organization_name | KEEP user.name, Esql.*

Install detection rules in Elastic Security

Detect New GitHub Self Hosted Action Runner in the Elastic Security detection engine by installing this rule into your Elastic Stack.

To setup this rule, check out the installation guide for Prebuilt Security Detection Rules(external, opens in a new tab or window).