= GitHub Actions PwnRequest Vulnerability Scanner
A toolkit for detecting GitHub Actions workflows vulnerable to the https://securitylab.github.com/research/github-actions-preventing-pwn-requests/[PwnRequest] attack pattern — where `pull_request_target` workflows check out and execute untrusted PR code, allowing secret exfiltration.
CAUTION: Use findings responsibly and follow responsible disclosure practices.
== Installation
[source,bash]
----
uv tool install git+https://github.com/SecKatie/actions-scanner.git
----
== Usage
[source,bash]
----
# Scan an org, repo URL, local directory, or list file (default format: csv)
actions-scanner scan your-org -o results.csv
# Validate findings with AI-assisted confirmation (accepts csv or json)
actions-scanner validate results.csv
# Export to markdown
actions-scanner report results.csv -o report.md --format markdown
----
== What It Detects
The scanner flags workflows where all three conditions exist in the same job:
1. **Trigger:** `pull_request_target` (runs with write permissions and secrets)
2. **Checkout:** Untrusted PR ref (`head.sha`, `head.ref`, `merge_commit_sha`, `github.head_ref`)
3. **Execution:** Build commands (`npm install`, `make`, `pip install`, `docker build`, etc.) or local actions (`./action`)
== Development
**Prerequisites:** Python 3.11+, https://github.com/astral-sh/uv[uv], `gh` CLI (authenticated), `git`
[source,bash]
----
git clone https://github.com/SecKatie/actions-scanner.git && cd actions-scanner
uv sync
uv run pytest tests/ -v
----
=== Environment Variables
[cols="1,2"]
|===
|Variable |Description
|`GITHUB_TOKEN`
|GitHub personal access token (required for org scanning)
|===
== References
* https://securitylab.github.com/research/github-actions-preventing-pwn-requests/[GitHub Security Lab: Preventing pwn requests]
* https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions[GitHub Docs: Security hardening for GitHub Actions]
== License
Internal use only.
Release files for actions-scanner 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| actions_scanner-1.0.0.tar.gz | 74.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| actions_scanner-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 144.5 kB
Release files / actions_scanner-1.0.0.tar.gz
| Download URL | actions_scanner-1.0.0.tar.gz |
|---|---|
| Size | 74.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
92eab9943f837f7348e8f7c5206ca9ab4e5332019e40777a2cad0a177df3bae4
|
|
BLAKE2b-256 checksum How to use checksums |
d2518cea8b72b09fcee21eb5ae4b80e7aa5dbd88141341d0aeace7c91ab1471c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Mar 4, 2026.
Transparency logRelease files / actions_scanner-1.0.0-py3-none-any.whl
| Download URL | actions_scanner-1.0.0-py3-none-any.whl |
|---|---|
| Size | 70.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c59d125063fed971f5f5d88bf0872b74737605ade9057f8e7bdd8af74bc5724e
|
|
BLAKE2b-256 checksum How to use checksums |
b9982d62a8c850f33f8465759316b3e5ae1be53d343842845bd3a454cd9a0c32
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Mar 4, 2026.
Transparency log