{"id":20686659,"url":"https://github.com/ericcornelissen/ades","last_synced_at":"2026-03-08T13:01:44.075Z","repository":{"id":188862024,"uuid":"679565015","full_name":"ericcornelissen/ades","owner":"ericcornelissen","description":"Find dangerous uses of GitHub Actions Workflow expressions.","archived":false,"fork":false,"pushed_at":"2024-04-13T12:16:40.000Z","size":371,"stargazers_count":0,"open_issues_count":9,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-04-14T10:43:44.501Z","etag":null,"topics":["gha","scanner","security"],"latest_commit_sha":null,"homepage":"https://ericcornelissen.github.io/ades/","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ericcornelissen.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"COPYING.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2023-08-17T06:07:04.000Z","updated_at":"2024-04-16T06:37:17.616Z","dependencies_parsed_at":"2023-08-17T07:31:01.277Z","dependency_job_id":"a764f9be-9275-4dcd-aa87-a05828f126d9","html_url":"https://github.com/ericcornelissen/ades","commit_stats":{"total_commits":190,"total_committers":2,"mean_commits":95.0,"dds":0.2947368421052632,"last_synced_commit":"f0cefa31084c0722f146cd384b7065d7f05254e4"},"previous_names":["ericcornelissen/ades"],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericcornelissen%2Fades","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericcornelissen%2Fades/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericcornelissen%2Fades/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericcornelissen%2Fades/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ericcornelissen","download_url":"https://codeload.github.com/ericcornelissen/ades/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242940015,"owners_count":20209883,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["gha","scanner","security"],"created_at":"2024-11-16T22:36:19.335Z","updated_at":"2026-03-08T13:01:44.049Z","avatar_url":"https://github.com/ericcornelissen.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!-- SPDX-License-Identifier: GFDL-1.3-or-later --\u003e\n\n# Actions Dangerous Expressions Scanner\n\nA simple tool to find dangerous uses of [GitHub Actions Expression]s.\n\nExpressions in GitHub Actions, e.g. `${{ \u003cexpression\u003e }}`, may appear in a GitHub Actions workflow\nor manifest and are filled in at runtime. If the value is controlled by an attacker it could be used\nto hijack the continuous integration pipeline of a repository. A more detailed description of the\nproblem is given by GitHub in \"[Understanding the risk of script injections]\". GitHub also covered\nthis problem on their blog in [2023][blog-2023] and [2025][blog-2025].\n\n`ades` helps you **find** and **resolve** dangerous uses of GitHub Actions Expressions in workflows\nand manifests.\n\n[github actions expression]: https://docs.github.com/en/actions/learn-github-actions/expressions\n[understanding the risk of script injections]: https://docs.github.com/en/actions/concepts/security/script-injections#understanding-the-risk-of-script-injections\n[blog-2023]: https://github.blog/security/supply-chain-security/four-tips-to-keep-your-github-actions-workflows-secure/#1-dont-use-syntax-in-the-run-section-to-avoid-unexpected-substitution-behavior\n[blog-2025]: https://github.blog/security/vulnerability-research/how-to-catch-github-actions-workflow-injections-before-attackers-do#h-explaining-actions-workflow-injections\n\n## Overview\n\n- [Getting Started](#getting-started)\n  - [Installation](#installation)\n    - [Binary](#binary)\n    - [Docker / Podman](#docker--podman)\n    - [Go](#go)\n  - [Usage](#usage)\n- [Features](#features)\n  - [Rules](#rules)\n  - [JSON Output](#json-output)\n- [Philosophy](#philosophy)\n- [Related Work](#related-work)\n- [License](#license)\n\n## Getting Started\n\n### Installation\n\n#### Binary\n\nDownload the binary for your platform manually from the [latest release] or using the CLI, for\nexample using the [`gh` CLI]:\n\n```shell\ngh release download --repo ericcornelissen/ades --pattern ades_linux_amd64.tar.gz\n```\n\nValidate the provenance of the release you downloaded:\n\n```shell\ngh attestation verify --owner ericcornelissen ades_linux_amd64.tar.gz\n```\n\nUnpack the archive to get the binary out:\n\n```shell\ntar -xf ades_linux_amd64.tar.gz\n```\n\nThen add it to your `PATH` and run it:\n\n```shell\nades -version\n```\n\nOr, without adding it to your `PATH`:\n\n```shell\n./ades -version\n```\n\n[`gh` cli]: https://cli.github.com/\n[latest release]: https://github.com/ericcornelissen/ades/releases\n\n#### Docker / Podman\n\nInstall the `ades` container by pulling it:\n\n```shell\ndocker pull docker.io/ericornelissen/ades:latest\n```\n\nValidate the provenance of the container using [cosign]:\n\n```shell\ncosign verify \\\n  --certificate-identity-regexp 'https://github.com/ericcornelissen/ades/.+' \\\n  --certificate-oidc-issuer 'https://token.actions.githubusercontent.com' \\\n  docker.io/ericornelissen/ades:latest\n```\n\nThen run it using:\n\n```shell\ndocker run --rm --volume $PWD:/src docker.io/ericornelissen/ades -version\n```\n\nYou can set up an alias for convenience:\n\n```shell\nalias ades='docker run --rm --volume $PWD:/src docker.io/ericornelissen/ades'\n```\n\n\u003e **NOTE:** To use [Podman] instead of [Docker] you can replace `docker` by `podman`.\n\n[cosign]: https://github.com/sigstore/cosign\n[docker]: https://www.docker.com/\n[podman]: https://podman.io/\n\n#### Go\n\nFetch and run `ades` from source using the [Go] CLI:\n\n```shell\ngo run github.com/ericcornelissen/ades/cmd/ades@latest -version\n```\n\nOr fetch and install `ades` from source using the [Go] CLI, after which it can be run directly:\n\n```shell\ngo install github.com/ericcornelissen/ades/cmd/ades@latest\nades -version\n```\n\nOr integrate `ades` into a Go project as a tool, after which it can be run without `@latest`:\n\n```shell\ngo get -tool github.com/ericcornelissen/ades\ngo run github.com/ericcornelissen/ades/cmd/ades -version\n```\n\n[go]: https://go.dev/\n\n### Usage\n\nRun `ades` from the root of a GitHub repository and it will report all dangerous uses of GitHub\nActions Expressions for the project:\n\n```shell\nades\n```\n\nAlternatively, specify any number of projects to scan, and it well report for each:\n\n```shell\nades project-a project-b\n```\n\nIf you need more information, ask for help:\n\n```shell\nades -help\n```\n\n## Features\n\n- Scans workflow files and action manifests.\n- Reports dangerous uses of expressions in [`run:`] directives, [`actions/github-script`] scripts,\n  and known problematic action inputs.\n- Report dangerous uses of expressions in known vulnerable actions.\n- Provides suggested fixes and _(experimental)_ fully automated fixes.\n- Configurable sensitivity.\n- Machine \u0026 human readable output formats.\n\n[`actions/github-script`]: https://github.com/actions/github-script\n[`run:`]: https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun\n\n### Rules\n\nSee [RULES.md].\n\n[rules.md]: ./docs/RULES.md\n\n### JSON output\n\nThe `-json` flag can be used to get the scan results in JSON format. This can be used by machines to\nparse the results to process them for other purposes. The schema is defined in [`schema.json`] and\nit is intended to be stable from one version to the next for longer periods of time.\n\n[`schema.json`]: ./schema.json\n\n## Philosophy\n\nThis project aims to provide a tool aimed at helping developers avoid the problem of injection\nthrough expressions altogether. Instead of reporting on known problematic uses of expressions,\n`ades` reports on all potentially dangerous uses of expressions, nudging developers to use safe\nalternatives from the get-go.\n\nThe motivation behind this is twofold. First, it makes the tool much simpler and faster. Second, it\nacknowledges that software development is a dynamic process and that future changes can make an\nexpression that is safe today unsafe. Moreover, fixing a workflow while creating it is easier now\nthan it is later.\n\n## Related Work\n\n### [ARGUS: A Framework for Staged Static Taint Analysis of GitHub Workflows and Actions]\n\nA research tool aimed at finding problematic expression in GitHub Action Workflows and Actions. It\nperforms taint analysis to track known problematic expressions across workflows, steps, and jobs and\ninto and out of JavaScript Actions. Because of the taint analysis it will report fewer expressions\nthan `ades` (fewer _false positives_), but it might also miss some problematic expressions (more\n_false negatives_).\n\n### [Automatic Security Assessment of GitHub Actions Workflows]\n\nA research tool aimed at finding misconfigurations in GitHub Action Workflows (not Actions). It\nincludes looking for problematic expression in `run:` scripts. It only reports on the use of known\nproblematic expression in `run:` scripts. Because it considers fewer expressions problematic it will\nreport fewer expressions overall (fewer _false positives_), but it might also miss other problematic\nexpressions in `run:` scripts and will completely miss others, for example expressions in\n`actions/github-script` scripts.\n\n### [Ghast]\n\nA tool to find misconfigurations in GitHub Actions Workflows (not Actions). Among other checks it\nlooks for a couple known problematic uses of expressions involving the `github` context. It also\nsteers users away from using inline scripts, recommending local Actions instead. As a result it will\nreport fewer expressions overall (fewer _false positives_) but miss some (more _false negatives_).\n\n### [`poutine`]\n\nA tool that aims to find misconfigurations in CI/CD pipeline configurations including GitHub Actions\nWorkflows. Among other checks it looks for a couple known problematic uses of expressions involving\nthe `github` context. As a result it will report fewer expressions overall (fewer _false positives_)\nbut also miss some (more _false negatives_).\n\n### [Raven]\n\nA tool aimed at finding misconfigurations in GitHub Actions Workflows (not Actions). Among other\nchecks it looks for a couple known problematic uses of expressions involving the `github` context.\nAs a result it will report fewer expressions overall (fewer _false positives_) but miss some (more\n_false negatives_).\n\n### [`zizmor`]\n\nA tool that aims to find security issues in GitHub Actions CI/CD setups. It reports various kinds of\npotential security problems including dangerous uses of expressions (\"template injection\"). Similar\nto `ades`, it will report on most uses of expressions but only in `run:` and `actions/github-script`\nscripts except for a small allowlist of known safe expressions. It does distinguish between\nexpressions known to be attacker controlled and only potentially attacker controlled with different\nseverities.\n\n[argus: a framework for staged static taint analysis of github workflows and actions]: https://www.usenix.org/conference/usenixsecurity23/presentation/muralee\n[automatic security assessment of github actions workflows]: https://dl.acm.org/doi/abs/10.1145/3560835.3564554\n[ghast]: https://github.com/bin3xish477/ghast\n[`poutine`]: https://github.com/boostsecurityio/poutine\n[raven]: https://github.com/CycodeLabs/raven\n[`zizmor`]: https://github.com/woodruffw/zizmor\n\n### Others\n\nThere is other work being done in the scope of GitHub Actions security that does not focus on GitHub\nActions Expression but is still worth mentioning:\n\n#### Tooling\n\n- [`actionlint`]: General purpose linter for GitHub Actions.\n- [`aeisenberg/codeql-actions-queries`]: A CodeQl query pack for writing reusable GitHub Actions.\n- [BOLT]: Egress-filter and runtime security tool for GitHub Actions pipelines.\n- [Bullfrog]: Control the outbound network connections of GitHub Actions pipelines.\n- [Cimon]: Runtime security to stop software supply-chain attacks on GitHub Actions pipelines.\n- [COSSETER]: Determine minimum GitHub Action job permissions statically.\n- [CodeQL support for GitHub Actions]: CodeQL queries for GitHub Actions workflows.\n- [OpenSSF Scorecard]: Assess repository configs, including GitHub Action workflows.\n- [Soteria]: Security misconfiguration detector for GitHub Actions.\n- [StepSecurity]: Runtime protection for GitHub Actions pipelines.\n\n[`actionlint`]: https://github.com/rhysd/actionlint\n[`aeisenberg/codeql-actions-queries`]: https://github.com/aeisenberg/codeql-actions-queries\n[bolt]: https://github.com/koalalab-inc/bolt\n[bullfrog]: https://github.com/bullfrogsec/bullfrog\n[cimon]: https://github.com/CycodeLabs/cimon-action\n[cosseter]: https://github.com/s3c2/cosseter\n[codeql support for github actions]: https://docs.github.com/en/code-security/code-scanning/managing-your-code-scanning-configuration/actions-built-in-queries\n[openssf scorecard]: https://scorecard.dev/\n[soteria]: https://github.com/aegis-forge/soteria\n[stepsecurity]: https://www.stepsecurity.io/\n\n#### Research\n\n- [Ambush From All Sides: Understanding Security Threats in Open-Source Software CI/CD Pipelines](https://ieeexplore.ieee.org/abstract/document/10061526)\n- [A Preliminary Study of GitHub Actions Dependencies](https://ceur-ws.org/Vol-3483/paper7.pdf)\n- [Cacheract: GitHub Actions Cache Native Malware](https://github.com/AdnaneKhan/Cacheract)\n- [Catching Smells in the Act: A GitHub Actions Workflow Investigation](https://ieeexplore.ieee.org/abstract/document/10795325)\n- [Characterizing the Security of Github CI Workflows](https://www.usenix.org/conference/usenixsecurity22/presentation/koishybayev)\n- [Continuous Intrusion: Characterizing the Security of Continuous Integration Services](https://ieeexplore.ieee.org/abstract/document/10179471)\n- [GitHub Actions Attack Diagram](https://github.com/jstawinski/GitHub-Actions-Attack-Diagram)\n- [Granite: Granular Runtime Enforcement for GitHub Actions Permissions](https://arxiv.org/abs/2512.11602)\n- [Living Off the Pipeline](https://boostsecurityio.github.io/lotp/#github-actions)\n- [Mitigating Security Issues in GitHub Actions](https://dl.acm.org/doi/abs/10.1145/3643662.3643961)\n- [On the outdatedness of workflows in the GitHub Actions ecosystem](https://www.sciencedirect.com/science/article/pii/S0164121223002224)\n- [Pipelines Under Pressure: An Empirical Study of Security Misconfigurations of GitHub Workflows](https://link.springer.com/chapter/10.1007/978-3-032-12089-2_14)\n- [Quantifying Security Issues in Reusable JavaScript Actions in GitHub Workflows](https://dl.acm.org/doi/abs/10.1145/3643991.3644899)\n\n## License\n\nThe software is available under the `GPL-3.0-or-later` license, see [COPYING.txt] for the full\nlicense text. The documentation is available under the `GFDL-1.3-or-later` license, see [GNU Free\nDocumentation License v1.3] for the full license text.\n\n[copying.txt]: ./COPYING.txt\n[gnu free documentation license v1.3]: https://www.gnu.org/licenses/fdl-1.3.en.html\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fericcornelissen%2Fades","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fericcornelissen%2Fades","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fericcornelissen%2Fades/lists"}