DEV Community

Justin Joseph
Justin Joseph

Posted on • Originally published at clockhash.com

Secure your GitHub Actions: stop leaking secrets in workflow logs

GitHub Actions Secrets Are Still Leaking—Here's How to Stop It

Your CI/CD pipeline is printing credentials to stdout, and logs are public by default. Even "masked" secrets aren't bulletproof.

The Real Problem with Secret Masking

GitHub Actions' native secret masking is reactive. It redacts *** after the value has already been referenced in memory. If a secret is substring of a larger string, interpolated incorrectly, or passed through a command with special characters, it won't mask. Print a JSON object containing a secret? Logs will show it.

Real-world incident: A developer echoed an API key in a debug statement. The masking failed because the key was base64-encoded first. The log was public for 6 hours.

Use OIDC Instead of Long-Lived Tokens

Stop storing personal access tokens and static credentials as secrets. GitHub's OpenID Connect (OIDC) provider lets your workflows request short-lived, scoped tokens directly.

permissions:
  id-token: write
  contents: read

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Get OIDC Token
        run: |
          TOKEN=$(curl -s -H "Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" \
          "$ACTIONS_ID_TOKEN_REQUEST_URL" | jq -r '.token')
Enter fullscreen mode Exit fullscreen mode

No token in your repository. No static secrets to leak. OIDC tokens expire in minutes.

Environment Protection Rules + HashSecured Bridge

Enforce code review before production deployments. Set required reviewers on critical environments—GitHub won't execute the job until approval.

But here's the gap: someone still needs to review what's actually running. That's where HashSecured bridges the gap. It scans your workflow YAML, detects credential leaks, insecure patterns, and privilege escalation risks—before you merge.

HashSecured integrates directly into your PR checks, flagging dangerous patterns like secrets. in shell scripts, unsafe artifact retention, and missing environment guards in seconds.

TL;DR

  • OIDC tokens replace static secrets—use them for AWS, GCP, Azure auth
  • Environment protection rules require approval before prod jobs run
  • HashSecured catches credential leaks in workflow code before they execute

Combine these three and you've eliminated the most common attack vector in GitHub Actions. Start with OIDC today, layer in environment rules tomorrow, then validate your workflow hygiene with HashSecured.


Originally published on the ClockHash Engineering Blog.


ClockHash Technologies — DevOps · AI · Cloud · Built for Engineers

Products:
HashInfra · HashSecured · HashNodes · AlphaInterface

Free Tools:
AutoCI/CD · CloudAsh · DockHash

Services:
DevOps Consulting · AI/ML Development · App Development · Remote Tech Teams

Top comments (0)