<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/introducing-deny-list-egress-policies-for-harden-runner-xvzbaknun" -->

---
title: Introducing deny list egress policies for Harden-Runner
description: StepSecurity&#x27;s Harden-Runner GitHub Action v2.21.0 adds a denied-endpoints input, letting teams block specific destinations while leaving everything else...
canonical: https://daily.dev/posts/introducing-deny-list-egress-policies-for-harden-runner-xvzbaknun
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Introducing deny list egress policies for Harden-Runner | daily.dev
og:description: StepSecurity&#x27;s Harden-Runner GitHub Action v2.21.0 adds a denied-endpoints input, letting teams block specific destinations while leaving everything else...
og:url: https://daily.dev/posts/introducing-deny-list-egress-policies-for-harden-runner-xvzbaknun
og:image: https://api.daily.dev/og/posts/xVzbAKnun.png
og:image:alt: Introducing deny list egress policies for Harden-Runner
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Introducing deny list egress policies for Harden-Runner

**[StepSecurity](https://daily.dev/sources/stepsecurity)** · 7 min read · 0 upvotes · 0 comments

## Summary

StepSecurity's Harden-Runner GitHub Action v2.21.0 adds a denied-endpoints input, letting teams block specific destinations while leaving everything else reachable, unlike the existing allow-list mode that blocks everything except named endpoints. Deny lists are pitched as a faster-to-deploy complement to allow lists, useful for making package proxies like Secure Registry non-bypassable (by denying direct access to registry.npmjs.org, PyPI hosts, and Go module/checksum hosts) and for blocking destinations like paste sites or tunneling services that CI has no legitimate reason to reach. The Global Block List (SOC-maintained, covers known-malicious IPs/domains like the one used in the Megalodon campaign) remains separate from and always enforced alongside custom deny lists. The piece is explicit that deny lists cannot stop exfiltration to destinations you must allow, such as github.com, as exploited in the Sha1-Hulud campaign; only an allow list plus behavioral detection covers that case.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://www.stepsecurity.io/blog/introducing-deny-list-egress-policies-for-harden-runner>

## Questions this post answers

### How do I add a deny list of blocked network destinations to Harden-Runner in GitHub Actions?

Harden-Runner GitHub Action v2.21.0 adds a denied-endpoints input that blocks only the destinations you list, leaving everything else reachable. Set egress-policy to block and list domains or IPs under denied-endpoints, using wildcards like *.example.org for subdomains. Unlike allow lists, ports are stripped from deny list entries, so a denied domain is blocked on every port regardless of what port is specified.

_Track new CI security controls like Harden-Runner deny lists as they ship on daily.dev._

### Can a CI deny list stop npm install from bypassing a private package proxy like Secure Registry?

Yes, denying direct access to public registries like registry.npmjs.org forces installs through a configured proxy such as Secure Registry, because a deny list blocks named destinations while leaving proxied paths like registry.stepsecurity.io reachable. This closes bypass routes like a committed .npmrc, a --registry flag, or a Dockerfile that resets the registry, all of which would otherwise skip install-time controls silently.

_Teams hardening npm supply chains follow enforcement techniques like this via daily.dev._

### Why can't a network deny list stop credential exfiltration to github.com in a supply chain attack?

A deny list only blocks destinations you explicitly name, so it cannot stop exfiltration to a destination you are obliged to allow, like github.com. In the Sha1-Hulud: The Second Coming campaign, harvested credentials were written as JSON to newly created public GitHub repositories using the victim's own GitHub token, meaning only an unbypassable allow list plus behavior-based detection could have stopped it.

_Developers tracking npm supply chain attacks like Sha1-Hulud follow the details on daily.dev._

## Similar posts on daily.dev

- [Harden-Runner Block Mode Now Available for macOS and Windows GitHub-Hosted Runners](https://daily.dev/posts/harden-runner-block-mode-now-available-for-macos-and-windows-github-hosted-runners-ovmu1ywab) · StepSecurity · 0 upvotes · 0 comments

---

Tags: [#security](https://daily.dev/tags/security), [#cicd](https://daily.dev/tags/cicd), [#github-actions](https://daily.dev/tags/github-actions)

[View this post on daily.dev](https://daily.dev/posts/introducing-deny-list-egress-policies-for-harden-runner-xvzbaknun)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Introducing deny list egress policies for Harden-Runner","url":"https://daily.dev/posts/introducing-deny-list-egress-policies-for-harden-runner-xvzbaknun","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/introducing-deny-list-egress-policies-for-harden-runner-xvzbaknun"},"datePublished":"2026-09-01T00:31:02.828Z","dateModified":"2026-09-01T01:18:50.202Z","description":"StepSecurity's Harden-Runner GitHub Action v2.21.0 adds a denied-endpoints input, letting teams block specific destinations while leaving everything else...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/452789db3b8e579cbec84a78ae1468c5?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/452789db3b8e579cbec84a78ae1468c5?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"StepSecurity","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"StepSecurity","logo":"https://media.daily.dev/image/upload/s--vegWii-S--/f_auto,q_auto/v1774959924/logos/stepsecurity?_a=BAMAMiWQ0","url":"https://daily.dev/sources/stepsecurity"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/introducing-deny-list-egress-policies-for-harden-runner-xvzbaknun","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"security,cicd,github-actions","timeRequired":"PT7M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"StepSecurity","item":"https://daily.dev/sources/stepsecurity"},{"@type":"ListItem","position":3,"name":"Introducing deny list egress policies for Harden-Runner"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/introducing-deny-list-egress-policies-for-harden-runner-xvzbaknun#faq","mainEntity":[{"@type":"Question","name":"How do I add a deny list of blocked network destinations to Harden-Runner in GitHub Actions?","acceptedAnswer":{"@type":"Answer","text":"Harden-Runner GitHub Action v2.21.0 adds a denied-endpoints input that blocks only the destinations you list, leaving everything else reachable. Set egress-policy to block and list domains or IPs under denied-endpoints, using wildcards like *.example.org for subdomains. Unlike allow lists, ports are stripped from deny list entries, so a denied domain is blocked on every port regardless of what port is specified. Track new CI security controls like Harden-Runner deny lists as they ship on daily.dev."}},{"@type":"Question","name":"Can a CI deny list stop npm install from bypassing a private package proxy like Secure Registry?","acceptedAnswer":{"@type":"Answer","text":"Yes, denying direct access to public registries like registry.npmjs.org forces installs through a configured proxy such as Secure Registry, because a deny list blocks named destinations while leaving proxied paths like registry.stepsecurity.io reachable. This closes bypass routes like a committed .npmrc, a --registry flag, or a Dockerfile that resets the registry, all of which would otherwise skip install-time controls silently. Teams hardening npm supply chains follow enforcement techniques like this via daily.dev."}},{"@type":"Question","name":"Why can't a network deny list stop credential exfiltration to github.com in a supply chain attack?","acceptedAnswer":{"@type":"Answer","text":"A deny list only blocks destinations you explicitly name, so it cannot stop exfiltration to a destination you are obliged to allow, like github.com. In the Sha1-Hulud: The Second Coming campaign, harvested credentials were written as JSON to newly created public GitHub repositories using the victim's own GitHub token, meaning only an unbypassable allow list plus behavior-based detection could have stopped it. Developers tracking npm supply chain attacks like Sha1-Hulud follow the details on daily.dev."}}]}
```

