Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
48060c4
fix(ui): improve Resource Inventory cards light mode (#10757)
HugoPBrito Apr 22, 2026
1093f6c
fix(api): merge Attack Paths findings on short UIDs for AWS resources…
josema-xyz Apr 22, 2026
94ee240
refactor: unify filtering and sorting for finding (#10803)
jfagoagas Apr 22, 2026
c27cb28
chore(safety): define policy for high and critical (#10845)
jfagoagas Apr 22, 2026
927be17
feat(github): add check for dismissing stale PR approvals on default …
Mathisdjango Apr 22, 2026
dff5541
fix(ci): improve compliance check action (#10850)
pedrooot Apr 22, 2026
f4b0f8f
fix(ui): prevent rescheduling scans during credential update (#10851)
alejandrobailo Apr 23, 2026
db2f92e
chore: add prowler-openspec-opensource as git submodule (#10680)
pfe-nazaries Apr 23, 2026
e9731f5
chore(ui): reorganize changelog and open 1.24.4 section (#10866)
alejandrobailo Apr 23, 2026
6ae129f
chore: remove unused submodule (#10869)
pfe-nazaries Apr 23, 2026
2ca7410
chore(poetry): lock poetry with 2.3.4 and install git as required (#1…
jfagoagas Apr 23, 2026
2304bf0
feat(compliance): add CIS pdf reporting (#10650)
pedrooot Apr 23, 2026
d877bea
chore(ui): unify filter search and batch patterns (#10859)
alejandrobailo Apr 23, 2026
ffb1bb8
feat(ci): add official Prowler GitHub Action (#10872)
andoniaf Apr 23, 2026
d1fc482
feat(ui): improve Mutelist UX and mute modal (#10846)
alejandrobailo Apr 23, 2026
0df24ee
fix(api): make Neo4j connection acquisition timeout configurable and …
josema-xyz Apr 23, 2026
80d62f3
fix(alibabacloud): fix CS service SDK compatibility and harden Alibab…
danibarranqueroo Apr 24, 2026
3554859
fix(ui): load every Attack Paths scan before displaying the selector …
pfe-nazaries Apr 24, 2026
ce1cf51
fix(ci): allow github.com egress in backport workflow (#10876)
cesararroba Apr 24, 2026
6d3fcec
ci: bump docs version against master on patch releases (#10879)
cesararroba Apr 24, 2026
7a0e107
chore(api): changelog for v5.24.4 (#10882)
jfagoagas Apr 24, 2026
ca79300
fix(ci): poetry cache post-step failure on release workflows (#10881)
cesararroba Apr 24, 2026
b97d68f
fix(ci): also gate cache-dependency-path on enable-cache in setup-pyt…
cesararroba Apr 24, 2026
d4ece2b
feat(sdk): add multi-provider compliance framework JSONs (#10300)
pedrooot Apr 24, 2026
06bb382
chore(ui): add knip for dead code detection (#10654)
pfe-nazaries Apr 24, 2026
22a6cc9
fix(ui): align resources filters and resource drawer behavior (#10861)
alejandrobailo Apr 24, 2026
4788dca
fix(ui): polish shared table pagination and provider spacing (#10891)
alejandrobailo Apr 24, 2026
6b228ab
deps: bump boto3+botocore 1.40.61 -> 1.42.93/1.42.96 to unblock backe…
agoel111 Apr 26, 2026
ea8ea3e
Merge pull request #1 from CodeAnt-AI/fix/boto3-bump-1.42.93
agoel111 Apr 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions .github/actions/setup-python-poetry/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,10 @@ inputs:
description: 'Run `poetry lock` during setup. Only enable when a prior step mutates pyproject.toml (e.g. API `@master` VCS rewrite). Default: false.'
required: false
default: 'false'
enable-cache:
description: 'Whether to enable Poetry dependency caching via actions/setup-python'
required: false
default: 'true'

runs:
using: 'composite'
Expand Down Expand Up @@ -74,8 +78,10 @@ runs:
uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
with:
python-version: ${{ inputs.python-version }}
cache: 'poetry'
cache-dependency-path: ${{ inputs.working-directory }}/poetry.lock
# Disable cache when callers skip dependency install: Poetry 2.3.4 creates
# the venv in a path setup-python can't hash, breaking the post-step save-cache.
cache: ${{ inputs.enable-cache == 'true' && 'poetry' || '' }}
cache-dependency-path: ${{ inputs.enable-cache == 'true' && format('{0}/poetry.lock', inputs.working-directory) || '' }}

- name: Install Python dependencies
if: inputs.install-dependencies == 'true'
Expand Down
7 changes: 3 additions & 4 deletions .github/workflows/api-security.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ jobs:
files: |
api/**
.github/workflows/api-security.yml
.safety-policy.yml
files_ignore: |
api/docs/**
api/README.md
Expand All @@ -80,10 +81,8 @@ jobs:

- name: Safety
if: steps.check-changes.outputs.any_changed == 'true'
run: poetry run safety check --ignore 79023,79027,86217,71600
# TODO: 79023 & 79027 knack ReDoS until `azure-cli-core` (via `cartography`) allows `knack` >=0.13.0
# TODO: 86217 because `alibabacloud-tea-openapi == 0.4.3` don't let us upgrade `cryptography >= 46.0.0`
# TODO: 71600 CVE-2024-1135 false positive - fixed in gunicorn 22.0.0, project uses 23.0.0
# Accepted CVEs, severity threshold, and ignore expirations live in ../.safety-policy.yml
run: poetry run safety check --policy-file ../.safety-policy.yml

- name: Vulture
if: steps.check-changes.outputs.any_changed == 'true'
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/backport.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ jobs:
egress-policy: block
allowed-endpoints: >
api.github.com:443
github.com:443

- name: Check labels
id: label_check
Expand Down
58 changes: 49 additions & 9 deletions .github/workflows/docs-bump-version.yml
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ jobs:
with:
author: prowler-bot <179230569+prowler-bot@users.noreply.github.com>
token: ${{ secrets.PROWLER_BOT_ACCESS_TOKEN }}
base: master
base: ${{ env.BASE_BRANCH }}
commit-message: 'docs: Update version to v${{ env.PROWLER_VERSION }}'
branch: docs-version-update-to-v${{ env.PROWLER_VERSION }}
title: 'docs: Update version to v${{ env.PROWLER_VERSION }}'
Expand Down Expand Up @@ -221,11 +221,6 @@ jobs:
with:
egress-policy: audit

- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false

- name: Calculate next patch version
run: |
MAJOR_VERSION=${NEEDS_DETECT_RELEASE_TYPE_OUTPUTS_MAJOR_VERSION}
Expand All @@ -250,7 +245,13 @@ jobs:
NEEDS_DETECT_RELEASE_TYPE_OUTPUTS_PATCH_VERSION: ${{ needs.detect-release-type.outputs.patch_version }}
NEEDS_DETECT_RELEASE_TYPE_OUTPUTS_CURRENT_DOCS_VERSION: ${{ needs.detect-release-type.outputs.current_docs_version }}

- name: Bump versions in documentation for patch version
- name: Checkout master branch
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
ref: ${{ env.BASE_BRANCH }}
persist-credentials: false

- name: Bump versions in documentation for master
run: |
set -e

Expand All @@ -261,12 +262,12 @@ jobs:
echo "Files modified:"
git --no-pager diff

- name: Create PR for documentation update to version branch
- name: Create PR for documentation update to master
uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8.1.0
with:
author: prowler-bot <179230569+prowler-bot@users.noreply.github.com>
token: ${{ secrets.PROWLER_BOT_ACCESS_TOKEN }}
base: ${{ env.VERSION_BRANCH }}
base: ${{ env.BASE_BRANCH }}
commit-message: 'docs: Update version to v${{ env.PROWLER_VERSION }}'
branch: docs-version-update-to-v${{ env.PROWLER_VERSION }}
title: 'docs: Update version to v${{ env.PROWLER_VERSION }}'
Expand All @@ -282,3 +283,42 @@ jobs:
### License

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

- name: Checkout version branch
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
ref: ${{ env.VERSION_BRANCH }}
persist-credentials: false

- name: Bump versions in documentation for version branch
run: |
set -e

# Update prowler-app.mdx with current release version
sed -i "s|PROWLER_UI_VERSION=\"${CURRENT_DOCS_VERSION}\"|PROWLER_UI_VERSION=\"${PROWLER_VERSION}\"|" docs/getting-started/installation/prowler-app.mdx
sed -i "s|PROWLER_API_VERSION=\"${CURRENT_DOCS_VERSION}\"|PROWLER_API_VERSION=\"${PROWLER_VERSION}\"|" docs/getting-started/installation/prowler-app.mdx

echo "Files modified:"
git --no-pager diff

- name: Create PR for documentation update to version branch
uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8.1.0
with:
author: prowler-bot <179230569+prowler-bot@users.noreply.github.com>
token: ${{ secrets.PROWLER_BOT_ACCESS_TOKEN }}
base: ${{ env.VERSION_BRANCH }}
commit-message: 'docs: Update version to v${{ env.PROWLER_VERSION }}'
branch: docs-version-update-to-v${{ env.PROWLER_VERSION }}-branch
title: 'docs: Update version to v${{ env.PROWLER_VERSION }}'
labels: no-changelog,skip-sync
body: |
### Description

Update Prowler documentation version references to v${{ env.PROWLER_VERSION }} in version branch after releasing Prowler v${{ env.PROWLER_VERSION }}.

### Files Updated
- `docs/getting-started/installation/prowler-app.mdx`: `PROWLER_UI_VERSION` and `PROWLER_API_VERSION`

### License

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
8 changes: 7 additions & 1 deletion .github/workflows/pr-check-compliance-mapping.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,13 @@ permissions: {}

jobs:
check-compliance-mapping:
if: contains(github.event.pull_request.labels.*.name, 'no-compliance-check') == false
if: >-
github.event.pull_request.state == 'open' &&
contains(github.event.pull_request.labels.*.name, 'no-compliance-check') == false &&
(
(github.event.action != 'labeled' && github.event.action != 'unlabeled')
|| github.event.label.name == 'no-compliance-check'
)
runs-on: ubuntu-latest
timeout-minutes: 15
permissions:
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/prepare-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ jobs:
with:
python-version: '3.12'
install-dependencies: 'false'
enable-cache: 'false'

- name: Configure Git
run: |
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/sdk-container-build-push.yml
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ jobs:
with:
python-version: ${{ env.PYTHON_VERSION }}
install-dependencies: 'false'
enable-cache: 'false'

- name: Inject poetry-bumpversion plugin
run: pipx inject poetry poetry-bumpversion
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/sdk-pypi-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ jobs:
with:
python-version: ${{ env.PYTHON_VERSION }}
install-dependencies: 'false'
enable-cache: 'false'

- name: Build Prowler package
run: poetry build
Expand Down Expand Up @@ -116,6 +117,7 @@ jobs:
with:
python-version: ${{ env.PYTHON_VERSION }}
install-dependencies: 'false'
enable-cache: 'false'

- name: Install toml package
run: pip install toml
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/sdk-security.yml
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,8 @@ jobs:

- name: Security scan with Safety
if: steps.check-changes.outputs.any_changed == 'true'
run: poetry run safety check -r pyproject.toml
# Accepted CVEs, severity threshold, and ignore expirations live in .safety-policy.yml
run: poetry run safety check -r pyproject.toml --policy-file .safety-policy.yml

- name: Dead code detection with Vulture
if: steps.check-changes.outputs.any_changed == 'true'
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,8 @@ node_modules

# Persistent data
_data/
/openspec/
/.gitmodules

# AI Instructions (generated by skills/setup.sh from AGENTS.md)
CLAUDE.md
Expand Down
14 changes: 8 additions & 6 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -152,17 +152,19 @@ repos:
- id: safety
name: safety
description: "Safety is a tool that checks your installed dependencies for known security vulnerabilities"
# TODO: Botocore needs urllib3 1.X so we need to ignore these vulnerabilities 77744,77745. Remove this once we upgrade to urllib3 2.X
# TODO: 79023 & 79027 knack ReDoS until `azure-cli-core` (via `cartography`) allows `knack` >=0.13.0
# TODO: 86217 because `alibabacloud-tea-openapi == 0.4.3` don't let us upgrade `cryptography >= 46.0.0`
# TODO: 71600 CVE-2024-1135 false positive - fixed in gunicorn 22.0.0, project uses 23.0.0
entry: safety check --ignore 70612,66963,74429,76352,76353,77744,77745,79023,79027,86217,71600
# Accepted CVEs, severity threshold, and ignore expirations live in .safety-policy.yml
entry: safety check --policy-file .safety-policy.yml
language: system
pass_filenames: false
files:
{
glob:
["**/pyproject.toml", "**/poetry.lock", "**/requirements*.txt"],
[
"**/pyproject.toml",
"**/poetry.lock",
"**/requirements*.txt",
".safety-policy.yml",
],
}

- id: vulture
Expand Down
58 changes: 58 additions & 0 deletions .safety-policy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# Safety policy for `safety check` (Safety CLI 3.x, v2 schema).
# Applied in: .pre-commit-config.yaml, .github/workflows/api-security.yml,
# .github/workflows/sdk-security.yml via `--policy-file`.
#
# Validate: poetry run safety validate policy_file --path .safety-policy.yml

security:
# Scan unpinned requirements too. Prowler pins via poetry.lock, so this is
# defensive against accidental unpinned entries.
ignore-unpinned-requirements: False

# CVSS severity filter. 7 = report only HIGH (7.0–8.9) and CRITICAL (9.0–10.0).
# Reference: 9=CRITICAL only, 7=CRITICAL+HIGH, 4=CRITICAL+HIGH+MEDIUM.
ignore-cvss-severity-below: 7

# Unknown severity is unrated, not safe. Keep False so unrated CVEs still fail
# the build and get a human eye. Flip to True only if noise is unmanageable.
ignore-cvss-unknown-severity: False

# Fail the build when a non-ignored vulnerability is found.
continue-on-vulnerability-error: False

# Explicit accepted vulnerabilities. Each entry MUST have a reason and an
# expiry. Expired entries fail the scan, forcing re-audit.
ignore-vulnerabilities:
77744:
reason: "Botocore requires urllib3 1.X. Remove once upgraded to urllib3 2.X."
expires: '2026-10-22'
77745:
reason: "Botocore requires urllib3 1.X. Remove once upgraded to urllib3 2.X."
expires: '2026-10-22'
79023:
reason: "knack ReDoS; blocked until azure-cli-core (via cartography) allows knack >=0.13.0."
expires: '2026-10-22'
79027:
reason: "knack ReDoS; blocked until azure-cli-core (via cartography) allows knack >=0.13.0."
expires: '2026-10-22'
86217:
reason: "alibabacloud-tea-openapi==0.4.3 blocks upgrade to cryptography >=46.0.0."
expires: '2026-10-22'
71600:
reason: "CVE-2024-1135 false positive. Fixed in gunicorn 22.0.0; project uses 23.0.0."
expires: '2026-10-22'
70612:
reason: "TBD - audit required. Reason not documented in prior --ignore list."
expires: '2026-07-22'
66963:
reason: "TBD - audit required. Reason not documented in prior --ignore list."
expires: '2026-07-22'
74429:
reason: "TBD - audit required. Reason not documented in prior --ignore list."
expires: '2026-07-22'
76352:
reason: "TBD - audit required. Reason not documented in prior --ignore list."
expires: '2026-07-22'
76353:
reason: "TBD - audit required. Reason not documented in prior --ignore list."
expires: '2026-07-22'
30 changes: 30 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,36 @@ python prowler-cli.py -v
> If your Poetry version is below v2.0.0, continue using `poetry shell` to activate your environment.
> For further guidance, refer to the Poetry Environment Activation Guide https://python-poetry.org/docs/managing-environments/#activating-the-environment.

# 🛡️ GitHub Action

The official **Prowler GitHub Action** runs Prowler scans in your GitHub workflows using the official [`prowlercloud/prowler`](https://hub.docker.com/r/prowlercloud/prowler) Docker image. Scans run on any [supported provider](https://docs.prowler.com/user-guide/providers/), with optional [`--push-to-cloud`](https://docs.prowler.com/user-guide/tutorials/prowler-app-import-findings) to send findings to Prowler Cloud and optional SARIF upload so findings show up in the repo's **Security → Code scanning** tab and as inline PR annotations.

```yaml
name: Prowler IaC Scan
on:
pull_request:

permissions:
contents: read
security-events: write
actions: read

jobs:
prowler:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: prowler-cloud/prowler@5.25
with:
provider: iac
output-formats: sarif json-ocsf
upload-sarif: true
flags: --severity critical high
```

Full configuration, per-provider authentication, and SARIF examples: [Prowler GitHub Action tutorial](docs/user-guide/tutorials/prowler-app-github-action.mdx). Marketplace listing: [Prowler Security Scan](https://github.com/marketplace/actions/prowler-security-scan).

# ✏️ High level architecture

## Prowler App
Expand Down
Loading
Loading