{"id":48855236,"url":"https://github.com/tracebit-com/tracebit-community-action","last_synced_at":"2026-04-15T12:02:21.668Z","repository":{"id":348314357,"uuid":"1196084425","full_name":"tracebit-com/tracebit-community-action","owner":"tracebit-com","description":"The Tracebit Community GitHub Action helps developers detect intrusions and supply-chain attacks across their GitHub workflows and pipelines by deploying canary credentials.","archived":false,"fork":false,"pushed_at":"2026-03-31T16:07:49.000Z","size":698,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-31T18:13:33.501Z","etag":null,"topics":["actions","canaries","deception","security","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tracebit-com.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-03-30T11:02:29.000Z","updated_at":"2026-03-31T16:07:54.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/tracebit-com/tracebit-community-action","commit_stats":null,"previous_names":["tracebit-com/tracebit-community-action"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/tracebit-com/tracebit-community-action","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tracebit-com%2Ftracebit-community-action","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tracebit-com%2Ftracebit-community-action/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tracebit-com%2Ftracebit-community-action/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tracebit-com%2Ftracebit-community-action/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tracebit-com","download_url":"https://codeload.github.com/tracebit-com/tracebit-community-action/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tracebit-com%2Ftracebit-community-action/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31840113,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-15T11:29:19.690Z","status":"ssl_error","status_checked_at":"2026-04-15T11:29:19.171Z","response_time":63,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["actions","canaries","deception","security","typescript"],"created_at":"2026-04-15T12:02:19.487Z","updated_at":"2026-04-15T12:02:21.645Z","avatar_url":"https://github.com/tracebit-com.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Tracebit GitHub Action\n\nThis Action safely and automatically injects AWS canary credentials and SSH canary keys (honeytokens) into your build pipelines to detect supply chain attacks. Using [Tracebit](https://tracebit.com) you can quickly pinpoint the exact workflow involved in the credential compromise.\n\n## Why use this action?\n\nCI/CD pipelines are a high-value target. Attackers who compromise a workflow - through a malicious dependency, a poisoned runner, or a stolen repository secret - will look for credentials they can exfiltrate and use elsewhere.\n\nThis action plants AWS canary credentials and SSH canary keys directly into every workflow run. The credentials are real AWS and SSH keys and any attempt to use them triggers an alert in Tracebit. You get immediate, high-confidence signal that something has gone wrong - no tuning, no false positives.\n\n## What attacks does it catch?\n\n- **Supply chain attacks**:\n  - **Compromised packages**: a malicious npm/pip/etc. package that exfiltrates environment variables, AWS credentials or SSH key files during `npm install` or a build step\n  - **Compromised GitHub Actions** - a third-party action in your workflow that leaks credentials it finds on the runner\n- **CI/CD secret theft** - an attacker who has obtained your runner's environment and is probing for usable credentials\n  \n- **Credential exfiltration via log injection** - credentials that leak into build logs and are harvested\n- **Insider threats** - a developer or bot token that copies CI/CD secrets for use outside the pipeline\n\nBecause the canary credentials are unique per run and tagged with the repo, workflow, job, SHA, and run ID, Tracebit can tell you exactly which pipeline run was compromised and when.\n\n## Real-world attacks this would have caught\n\n| Attack | Date | Vector | How credentials were stolen | How Tracebit canaries would have detected it |\n|--------|------|--------|----------------------------|----------------------------------------------|\n| **tj-actions/changed-files** (CVE-2025-30066) | Mar 2025 | Compromised GitHub Action; all version tags re-pointed to malicious commit | Dumped runner memory to harvest GitHub secrets, printed base64-encoded secrets to workflow logs | Canary AWS creds in runner memory would be captured by the memory dump. Any attempt to use the exfiltrated canary keys triggers an immediate Tracebit alert, even if they were only dumped to logs and later harvested. |\n| **Trivy + trivy-action + setup-trivy** (TeamPCP) | Mar 19, 2026 | Compromised Aqua `aqua-bot` service account; 75+ action tags force-pushed to malicious versions | Three-stage payload: read `/proc/\u003cpid\u003e/mem` for secrets, swept `~/.aws/` and 50+ credential file paths, exfiltrated encrypted bundle to typosquatted C2 domain | On GitHub-hosted Linux runners, the payload scraped `Runner.Worker` process memory via `/proc/\u003cpid\u003e/mem` for GitHub secrets. On all other environments, it targeted `~/.aws/credentials` and 50+ credential file paths on. Tracebit canary keys would be collected in either case. |\n| **Checkmarx KICS GitHub Action** (TeamPCP) | Mar 23, 2026 | Compromised `cx-plugins-releases` service account; all 35 action tags re-pointed | Harvested env vars, SSH keys, cloud creds; dumped `Runner.Worker` process memory via `/proc/\u003cpid\u003e/mem`; queried AWS IMDS for cloud credentials | Same credential harvesting as Trivy attack: canary AWS keys in `~/.aws/credentials` and process memory would all be collected. |\n| **LiteLLM PyPI package** (TeamPCP) | Mar 24, 2026 | Trojanized PyPI versions 1.82.7 \u0026 1.82.8; triggered on import or via `.pth` file on every Python invocation | Swept `~/.aws/`, env vars, Kubernetes configs; **actively called AWS Secrets Manager and SSM Parameter Store** using harvested creds; exfiltrated to `models.litellm.cloud` | The malware didn't just steal credentials, it **actively called AWS APIs** (ListSecrets, GetSecretValue, DescribeParameters) with any AWS keys it found. Tracebit canary keys in `~/.aws/credentials` or env vars would be used in these API calls, generating an high-confidence alert the moment the malware attempts to authenticate. |\n\n1. https://www.wiz.io/blog/trivy-compromised-teampcp-supply-chain-attack\n2. https://www.wiz.io/blog/teampcp-attack-kics-github-action\n3. https://www.stepsecurity.io/blog/litellm-credential-stealer-hidden-in-pypi-wheel\n4. https://www.stepsecurity.io/blog/harden-runner-detection-tj-actions-changed-files-action-is-compromised\n\n## How it works\n\n1. At the start of your workflow, the action calls the Tracebit API to issue a short-lived set of canary AWS credentials and SSH keys.\n2. The AWS credentials are written to `~/.aws/credentials`, exported as environment variables, and held in the runner process' memory - covering every common exfiltration surface: credential files, environment variable dumps, and process memory scraping.\n3. The SSH keys are written to `~/.ssh/` and held in the runner process' memory to cover the observed SSH scraping patterns.\n4. Tracebit monitors for any use of those credentials. If they are used, you get an alert with full context.\n5. At the end of the workflow run, the action confirms to Tracebit that the run completed normally. This closes the expected activity window and means any future use of those credentials is immediately flagged as suspicious.\n\nThe action runs blocking by default. Use (`async: true`) if you have strict latency requirements for your pipelines.\n\n## Prerequisites: Tracebit Community Edition\n\nYou need a Tracebit account to use this action. Sign up for **Tracebit Community Edition** (free forever) - to get your `api-token`:\n\n**[Register for Tracebit Community Edition →](https://community.tracebit.com/join)**\n\nOnce registered, the Tracebit dashboard shows you:\n- Which repositories and workflows have canary coverage\n- A real-time alert feed if any canary credential is used\n- The full context of each alert: repo, workflow, job, commit SHA, and run ID\n\n## Quickstart\n\n### 1. Store your credentials as GitHub secrets\n\nAfter registering, add the following to your repository or organization:\n\n| Type | Name | Value |\n|------|------|-------|\n| Secret | `SECURITY_API_TOKEN` | Your Tracebit API token |\n\n### 2. Add the action to your workflow\n\nInsert the action **before** any step that runs untrusted code (dependency installs, build scripts, test runners):\n\n```yaml\n- name: Configure credentials\n  uses: tracebit-com/tracebit-community-action@d0a68cb29196eafce908de76ec596a7e9ca049da\n  with:\n    api-token: ${{ secrets.SECURITY_API_TOKEN }}\n    profile: administrator\n    profile-region: us-east-1\n    async: true\n```\n\nOptionally use `continue-on-error: true` to ensure a Tracebit outage never blocks your pipeline but should not be necessary as if configured correctly the action will warn and not error.\n\n### Full workflow example\n\n```yaml\nname: CI\n\non:\n  push:\n  pull_request:\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n\n      - name: Configure credentials\n        uses: tracebit-com/tracebit-community-action@d0a68cb29196eafce908de76ec596a7e9ca049da\n        with:\n          api-token: ${{ secrets.SECURITY_API_TOKEN }}\n          profile: administrator\n          profile-region: us-east-1\n          async: true\n\n      # Your normal build steps follow - the canary credentials are now live\n      - run: npm ci\n      - run: npm test\n```\n\n## Enabling across your GitHub organization\n\nTo roll out canary coverage to every repository in your organization without updating each workflow individually, you can use the Tracebit Community Edition's GitHub integration which lets you monitor your coverage and open Pull Requests across all of your repositories, that would add this action at the appropriate place.\n\nTo configure the credentials once for the whole organization:\n\n1. Go to your organization's **Settings → Secrets and variables → Actions**.\n2. Add `SECURITY_API_TOKEN` as an **organization secret**, scoped to the repositories you want to protect.\n\n## Inputs\n\n| Input | Required | Default | Description |\n|-------|----------|---------|-------------|\n| `customer-id` | No | `community` | Your Tracebit customer ID |\n| `api-token` | Yes | - | Your Tracebit API token |\n| `profile` | Yes | - | AWS profile name to write to `~/.aws/credentials` |\n| `profile-region` | Yes | - | AWS region to configure for the profile |\n| `async` | No | `false` | Run the credential issuance in the background so subsequent steps are not delayed. Recommended. |\n\n## Outputs\n\n| Output | Description |\n|--------|-------------|\n| `aws-access-key-id` | The canary access key ID |\n| `aws-secret-access-key` | The canary secret access key |\n| `aws-session-token` | The canary session token |\n| `profile-name` | The AWS profile name that was written |\n\n## Dependencies\n\nThis action is intentionally minimal. The runtime `dependencies` (bundled into `dist/`) are all official GitHub Actions toolkit packages maintained by GitHub:\n\n| Package | Version | Purpose |\n|---------|---------|---------|\n| `@actions/core` | 1.11.1 | Reads action inputs, sets outputs, masks secrets, and controls workflow annotations |\n| `@actions/exec` | 1.1.1 | Runs subprocesses (used to write the AWS credentials file) |\n| `@actions/github` | 6.0.1 | GitHub context (repo, workflow, run ID) passed to the Tracebit API |\n| `@actions/http-client` | 2.2.3 | Makes HTTP requests to the Tracebit API |\n\nNo third-party runtime dependencies. The `devDependencies` (`typescript`, `vitest`, `@types/*`) are only used locally during development and are never present in the runner environment.\n\n## Contributing\n\n### Build\n\nYou need [Bun](https://bun.sh) 1.3.8:\n\n```bash\ncurl -fsSL https://bun.sh/install | bash -s \"bun-v1.3.8\"\n```\n\nBuild the bundle:\n\n```bash\nbun run build\n# commit src/index.ts + dist/index.js together\n```\n\n### Local run\n\nCreate a `.env` file at the repo root:\n\n```bash\nINPUT_API_TOKEN=your-api-token\nINPUT_PROFILE=administrator\nINPUT_PROFILE_REGION=us-east-1\nINPUT_ASYNC=true\n```\n\nThen run:\n\n```bash\nnpm run run:local\n```\n\nRequires Node 24+.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftracebit-com%2Ftracebit-community-action","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftracebit-com%2Ftracebit-community-action","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftracebit-com%2Ftracebit-community-action/lists"}