Pandaward assessment report

acme-shop

asmt_0001_20261028T204903Z · COMPLETE · profile local-passive · revision 5e17870a6457947826be30aa316c027412ea5492 · 2026-10-28T20:49:03Z to 2026-10-28T20:49:03Z

Automated technical security assessment. Not a certification, attestation, legal opinion or independently signed penetration test, and not a guarantee that no vulnerabilities exist. Only the controls listed as PASS were decisively checked, and only for the stated scope, method and point in time.

Summary

Confirmed, open20
Suspected, needs review11
Decisive coverage40%21 of 52 applicable controls
Not decided31controls, never read as secure
Cross-domain edges150 verified · 5 failed · 10 open

Coverage counts decisively tested controls (PASS/FAIL) over applicable controls. It is not a percentage of vulnerabilities found. BLOCKED, UNSUPPORTED, SUSPECTED, INCONCLUSIVE, ERROR and STALE never count as secure.

Confirmed observations (20)

PW-0022 · pull_request_target checks out untrusted PR code

critical CONFIRMED OPEN
Location
.github/workflows/ci.yml:8
Control
N-003 pull_request_target workflows do not check out untrusted PR code
CWE
CWE-829
Why
pull_request_target runs with repository secrets and a write token; checking out the PR head lets any fork author run code with them.
Fix
Use pull_request for building untrusted code, or split into an unprivileged build and a privileged workflow_run that only consumes artifacts.
Retest
Apply the fix, then run `pandaward retest`; the finding becomes REMEDIATED only when builtin-cicd completes and no longer observes it.
Evidence
ev_4a7f9c2c4be3bcdb via builtin-cicd

PW-0004 · Hardcoded GitHub token

high CONFIRMED OPEN
Location
app.py:8
Control
E-001 No high-confidence secret patterns in repository files
CWE
CWE-798
Why
A value matching the GitHub token format is stored in the repository. The value is masked in all Pandaward output.
Fix
Revoke and rotate the credential at the provider first, then remove it from the code and git history; load it from a secret manager or environment at runtime.
Retest
Re-run `pandaward scan`; also verify with the provider that the old credential is revoked.
Evidence
ev_4fc7c8c69e031156 via builtin-secrets

PW-0005 · Hardcoded Stripe live secret key

high CONFIRMED OPEN
Location
src/server.js:2
Control
E-001 No high-confidence secret patterns in repository files
CWE
CWE-798
Why
A value matching the Stripe live secret key format is stored in the repository. The value is masked in all Pandaward output.
Fix
Revoke and rotate the credential at the provider first, then remove it from the code and git history; load it from a secret manager or environment at runtime.
Retest
Re-run `pandaward scan`; also verify with the provider that the old credential is revoked.
Evidence
ev_17b39394ce37dd0a via builtin-secrets

PW-0006 · Credential or environment file tracked in git

high CONFIRMED OPEN
Location
.env
Control
E-002 Environment and credential files are not tracked in git
CWE
CWE-538
Why
This file type usually holds credentials and is committed to git. Pandaward did not read its content.
Fix
Rotate any credentials it contains, `git rm --cached` it, add it to .gitignore, and purge it from history if the repository is shared.
Retest
Re-run `pandaward scan`; the file must no longer be tracked.
Evidence
ev_2b3c5175a0b4065c via builtin-secrets

PW-0008 · TLS certificate verification disabled

high CONFIRMED OPEN
Location
app.py:5
Control
E-003 TLS certificate verification is not disabled in code
CWE
CWE-295
Why
Certificate verification is turned off, so any network attacker can impersonate the server.
Fix
Remove the override; trust a specific CA bundle if a private CA is needed.
Retest
Apply the fix, then run `pandaward retest`; the finding becomes REMEDIATED only when builtin-code completes and no longer observes it.
Evidence
ev_e8d11c07675dc9ab via builtin-code

PW-0009 · Shell command execution

high CONFIRMED OPEN
Location
app.py:6
Control
D-002 No shell command construction through a shell interpreter
CWE
CWE-78
Why
Command runs through a shell interpreter.
Fix
Use subprocess.run([...], shell=False) with an argument list.
Retest
Apply the fix, then run `pandaward retest`; the finding becomes REMEDIATED only when builtin-code completes and no longer observes it.
Evidence
ev_94913aefcc6346ee via builtin-code

PW-0010 · Dynamic code evaluation

high CONFIRMED OPEN
Location
app.py:7
Control
D-001 No dynamic code evaluation (eval/new Function/exec of strings)
CWE
CWE-95
Why
eval/exec evaluates strings as Python code.
Fix
Use ast.literal_eval for literals or explicit parsing; never eval input.
Retest
Apply the fix, then run `pandaward retest`; the finding becomes REMEDIATED only when builtin-code completes and no longer observes it.
Evidence
ev_a9c4d034c668acc8 via builtin-code

PW-0014 · Dynamic code evaluation

high CONFIRMED OPEN
Location
src/server.js:8
Control
D-001 No dynamic code evaluation (eval/new Function/exec of strings)
CWE
CWE-95
Why
Strings are evaluated as code. If any part of the string can be influenced by a user, this is code injection.
Fix
Replace eval/new Function with explicit parsing or a lookup table; never evaluate strings.
Retest
Apply the fix, then run `pandaward retest`; the finding becomes REMEDIATED only when builtin-code completes and no longer observes it.
Evidence
ev_7eb1da32ab0560fe via builtin-code

PW-0017 · CORS allows any origin with credentials

high STRONGLY_SUPPORTED OPEN
Location
src/server.js:4
Control
H-002 CORS is not configured as wildcard together with credentials
CWE
CWE-942
Why
Any origin (or a reflected origin) is allowed together with credentials, so other sites can make authenticated reads.
Fix
Use an explicit allowlist of trusted origins when credentials are enabled.
Retest
Apply the fix, then run `pandaward retest`; the finding becomes REMEDIATED only when builtin-code completes and no longer observes it.
Evidence
ev_8f75c59732ca936d via builtin-code

PW-0021 · Untrusted event data interpolated into a run script

high CONFIRMED OPEN
Location
.github/workflows/ci.yml:11
Control
N-002 No untrusted event data interpolated into run: scripts
CWE
CWE-78
Why
Attacker-controlled text (titles, bodies, branch names) is expanded into the shell script before it runs, allowing command injection in CI.
Fix
Pass the value through an environment variable (env: TITLE: ${{ ... }}) and reference "$TITLE" in the script.
Retest
Apply the fix, then run `pandaward retest`; the finding becomes REMEDIATED only when builtin-cicd completes and no longer observes it.
Evidence
ev_d4c0b7d0aaff8778 via builtin-cicd

PW-0026 · Public storage or database exposure

high CONFIRMED OPEN
Location
infra/main.tf:1
Control
J-004 IaC does not expose public storage or world-open admin ports
CWE
CWE-284
Why
The resource is configured for public access.
Fix
Keep storage and databases private; serve public files through a CDN with explicit, read-only policy.
Retest
Apply the fix, then run `pandaward retest`; the finding becomes REMEDIATED only when builtin-infra completes and no longer observes it.
Evidence
ev_4f9bf0d255e934f1 via builtin-infra

PW-0027 · Administrative or database port open to the internet

high STRONGLY_SUPPORTED OPEN
Location
infra/main.tf:6
Control
J-004 IaC does not expose public storage or world-open admin ports
CWE
CWE-284
Why
A security group/firewall rule allows 0.0.0.0/0 near an SSH, RDP or database port.
Fix
Restrict the source to a VPN/bastion range or use a managed access proxy.
Retest
Apply the fix, then run `pandaward retest`; the finding becomes REMEDIATED only when builtin-infra completes and no longer observes it.
Evidence
ev_822dc4e9c892428a via builtin-infra

PW-0029 · Android app is debuggable

high CONFIRMED OPEN
Location
android/app/src/main/AndroidManifest.xml:1
Control
K-001 Android manifest: not debuggable, no backup, no cleartext traffic
CWE
CWE-489
Why
Manifest sets android:debuggable="true". Static observation; runtime impact depends on build variant.
Fix
Set android:debuggable to false for release builds (use build-type manifest placeholders).
Retest
Apply the fix, then run `pandaward retest`; the finding becomes REMEDIATED only when builtin-mobile completes and no longer observes it.
Evidence
ev_cdde459f87b81902 via builtin-mobile

PW-0020 · GitHub Action not pinned to a commit SHA

medium CONFIRMED OPEN
Location
.github/workflows/ci.yml:9
Control
N-001 Third-party GitHub Actions pinned to a full commit SHA
CWE
CWE-829
Why
someone/deploy-action@main uses a mutable reference; whoever controls that tag/branch can change the code that runs with this workflow's secrets.
Fix
Pin to the full 40-character commit SHA of a reviewed release and keep the version in a trailing comment; let Dependabot/Renovate update it.
Retest
Apply the fix, then run `pandaward retest`; the finding becomes REMEDIATED only when builtin-cicd completes and no longer observes it.
Evidence
ev_b013c649d18f6fc3 via builtin-cicd

PW-0023 · Workflow does not declare GITHUB_TOKEN permissions

medium CONFIRMED OPEN
Location
.github/workflows/ci.yml:1
Control
N-004 Workflow GITHUB_TOKEN permissions declared explicitly
CWE
CWE-250
Why
Without a permissions block the token gets the repository default, which may be read-write for everything.
Fix
Add `permissions: contents: read` at the top level and grant extra scopes per job only where needed.
Retest
Apply the fix, then run `pandaward retest`; the finding becomes REMEDIATED only when builtin-cicd completes and no longer observes it.
Evidence
ev_bc44fe7969b08ac8 via builtin-cicd

PW-0025 · Container runs as root

medium CONFIRMED OPEN
Location
Dockerfile:1
Control
J-001 Container images do not run as root
CWE
CWE-250
Why
The final image stage has no non-root USER, so a compromise of the process is root inside the container.
Fix
Create an unprivileged user and add `USER <uid>` in the final stage.
Retest
Apply the fix, then run `pandaward retest`; the finding becomes REMEDIATED only when builtin-infra completes and no longer observes it.
Evidence
ev_2dd232b952152e08 via builtin-infra

PW-0028 · Package manifest without lockfile

medium CONFIRMED OPEN
Location
package.json:1
Control
I-001 Every package manifest has a committed lockfile
CWE
CWE-829
Why
Without a committed lockfile every install can resolve different transitive versions, including a newly published malicious one.
Fix
Commit the lockfile and install with the frozen/ci mode (npm ci, pip install --require-hashes, go mod verify).
Retest
Apply the fix, then run `pandaward retest`; the finding becomes REMEDIATED only when builtin-supply completes and no longer observes it.
Evidence
ev_e081c5b1020366d9 via builtin-supply

PW-0019 · GitHub Action not pinned to a commit SHA

low CONFIRMED OPEN
Location
.github/workflows/ci.yml:6
Control
N-001 Third-party GitHub Actions pinned to a full commit SHA
CWE
CWE-829
Why
actions/checkout@v4 uses a mutable reference; whoever controls that tag/branch can change the code that runs with this workflow's secrets.
Fix
Pin to the full 40-character commit SHA of a reviewed release and keep the version in a trailing comment; let Dependabot/Renovate update it.
Retest
Apply the fix, then run `pandaward retest`; the finding becomes REMEDIATED only when builtin-cicd completes and no longer observes it.
Evidence
ev_4611c27259ceb153 via builtin-cicd

PW-0024 · Base image not pinned

low CONFIRMED OPEN
Location
Dockerfile:1
Control
J-002 Container base images pinned (no latest or missing tag)
CWE
CWE-829
Why
The base image uses latest or no tag, so builds are not reproducible and can silently pick up a changed image.
Fix
Pin a specific version tag, ideally with @sha256 digest, and update it deliberately.
Retest
Apply the fix, then run `pandaward retest`; the finding becomes REMEDIATED only when builtin-infra completes and no longer observes it.
Evidence
ev_98bb7a66c22d7481 via builtin-infra

PW-0030 · Android backup enabled

low CONFIRMED OPEN
Location
android/app/src/main/AndroidManifest.xml:1
Control
K-001 Android manifest: not debuggable, no backup, no cleartext traffic
CWE
CWE-530
Why
Manifest sets android:allowBackup="true". Static observation; runtime impact depends on build variant.
Fix
Set android:allowBackup to false for release builds (use build-type manifest placeholders).
Retest
Apply the fix, then run `pandaward retest`; the finding becomes REMEDIATED only when builtin-mobile completes and no longer observes it.
Evidence
ev_1c22ef1d4a6f0958 via builtin-mobile

Suspected signals (11)

Heuristic or reviewer-proposed hypotheses. They are not confirmed vulnerabilities until verified.

PW-0007 · Unsafe deserialization API

high HYPOTHESIS OPEN
Location
app.py:4
Control
D-004 No unsafe deserialization APIs on untrusted data
CWE
CWE-502
Why
Deserializing untrusted data with this API can execute code.
Fix
Use JSON or yaml.safe_load; never unpickle data from outside the trust boundary.
Retest
Apply the fix, then run `pandaward retest`; the finding becomes REMEDIATED only when builtin-code completes and no longer observes it.
Evidence
ev_45edd1ca1b90d972 via builtin-code

PW-0011 · Model output may reach code or shell execution

high HYPOTHESIS OPEN
Location
app.py:7
Control
P-001 Model output is not executed as code or shell
CWE
CWE-94
Why
An execution sink appears on the same line as model output. Prompt injection could turn into code execution.
Fix
Treat model output as untrusted data: parse into a typed structure, validate against an allowlist, require human approval for side effects.
Retest
Apply the fix, then run `pandaward retest`; the finding becomes REMEDIATED only when builtin-code completes and no longer observes it.
Evidence
ev_f6f8776e80a54556 via builtin-code

PW-0013 · SQL built with string concatenation

high HYPOTHESIS OPEN
Location
src/server.js:6
Control
D-003 No SQL statements built by string concatenation or interpolation
CWE
CWE-89
Why
Query text is concatenated with values; if a value is user controlled this is SQL injection.
Fix
Use parameterized queries / prepared statements or the ORM query builder.
Retest
Apply the fix, then run `pandaward retest`; the finding becomes REMEDIATED only when builtin-code completes and no longer observes it.
Evidence
ev_9163cd2dde765988 via builtin-code

PW-0015 · Shell command built from a string

high HYPOTHESIS OPEN
Location
src/server.js:8
Control
D-002 No shell command construction through a shell interpreter
CWE
CWE-78
Why
child_process.exec or shell:true runs the command through a shell; interpolated values allow command injection.
Fix
Use execFile/spawn with an argument array and shell:false; validate arguments against an allowlist.
Retest
Apply the fix, then run `pandaward retest`; the finding becomes REMEDIATED only when builtin-code completes and no longer observes it.
Evidence
ev_18bcf670b9fe88b6 via builtin-code

PW-0018 · Webhook handler without visible signature verification

high HYPOTHESIS OPEN
Location
src/server.js:7
Control
G-001 Webhook handlers verify a signature before acting on the payload
CWE
CWE-345
Why
No signature/HMAC verification was found in the file that defines this webhook route. Verification may live in middleware; confirm manually.
Fix
Verify the provider signature over the raw request body with a constant-time compare before parsing or acting; reject replays by timestamp/event ID.
Retest
Apply the fix, then run `pandaward retest`; the finding becomes REMEDIATED only when builtin-code completes and no longer observes it.
Evidence
ev_fdf34989adaac10f via builtin-code

PW-0001 · Route not declared in the OpenAPI contract

medium HYPOTHESIS OPEN
Location
src/server.js:8
Control
A-003 Declared API contract (OpenAPI) matches discovered routes
Why
GET /admin/run is implemented but not documented; undocumented endpoints often miss contract and authorization tests (shadow API).
Fix
Document the endpoint in the OpenAPI contract with its security requirements, or remove it if unused.
Retest
Re-run `pandaward scan`; the route must appear in the contract comparison.
Evidence
ev_efa0768a93861314 via builtin-inventory

PW-0002 · Route not declared in the OpenAPI contract

medium HYPOTHESIS OPEN
Location
src/server.js:6
Control
A-003 Declared API contract (OpenAPI) matches discovered routes
Why
GET /api/invoices/:id is implemented but not documented; undocumented endpoints often miss contract and authorization tests (shadow API).
Fix
Document the endpoint in the OpenAPI contract with its security requirements, or remove it if unused.
Retest
Re-run `pandaward scan`; the route must appear in the contract comparison.
Evidence
ev_47d3f7f67228fdd6 via builtin-inventory

PW-0003 · Route not declared in the OpenAPI contract

medium HYPOTHESIS OPEN
Location
src/server.js:7
Control
A-003 Declared API contract (OpenAPI) matches discovered routes
Why
POST /webhooks/stripe is implemented but not documented; undocumented endpoints often miss contract and authorization tests (shadow API).
Fix
Document the endpoint in the OpenAPI contract with its security requirements, or remove it if unused.
Retest
Re-run `pandaward scan`; the route must appear in the contract comparison.
Evidence
ev_2de440fb1038ae7e via builtin-inventory

PW-0012 · jwt.decode used (no signature check)

medium HYPOTHESIS OPEN
Location
src/server.js:5
Control
B-001 JWT verification is not disabled and does not accept the 'none' algorithm
CWE
CWE-347
Why
jsonwebtoken's decode() does not verify the signature; trusting its output for authorization is unsafe.
Fix
Use jwt.verify(token, key, { algorithms: [...] }) for anything security relevant.
Retest
Apply the fix, then run `pandaward retest`; the finding becomes REMEDIATED only when builtin-code completes and no longer observes it.
Evidence
ev_ba4887d7098ce9c5 via builtin-code

PW-0016 · Raw HTML sink

medium HYPOTHESIS OPEN
Location
src/server.js:9
Control
H-001 No raw HTML injection sinks (innerHTML, dangerouslySetInnerHTML, v-html, |safe)
CWE
CWE-79
Why
Content is inserted as raw HTML. If it can contain user data this is cross-site scripting.
Fix
Render as text, or sanitize with a maintained sanitizer (DOMPurify) right at the sink.
Retest
Apply the fix, then run `pandaward retest`; the finding becomes REMEDIATED only when builtin-code completes and no longer observes it.
Evidence
ev_3492a3599d7b8d70 via builtin-code

PW-0031 · Exported Android component without permission

medium HYPOTHESIS OPEN
Location
android/app/src/main/AndroidManifest.xml:3
Control
K-002 Android exported components protected by permission
CWE
CWE-926
Why
Any installed app can invoke this receiver. Confirm it validates callers and input.
Fix
Set android:exported="false" unless required, or protect it with a signature-level permission.
Retest
Apply the fix, then run `pandaward retest`; the finding becomes REMEDIATED only when builtin-mobile completes and no longer observes it.
Evidence
ev_385c21dd4cc2e520 via builtin-mobile

Coverage by domain

DomainPASSFAILSUSPECTEDBLOCKEDUNSUPPORTEDINCONCLUSIVEERRORSTALENOT_APPLICABLE
A Asset inventory, architecture and threat model101101000
B Authentication, sessions and identity101110000
C Authorization, roles and tenant isolation000300000
D Input, output, injection and data flow022200000
E Secrets, cryptography, privacy and storage130100000
F Business logic, integrity and financial workflows000110000
G API contracts, integrations and messaging001010000
H Web frontend, browser and client-side controls002100000
I Dependencies, SBOM and software supply chain110100001
J Cloud, infrastructure, network and IaC030100001
K Android application security111100001
L iOS application security000000004
M Dynamic application/API security testing000100000
N CI/CD, source control and release security040000000
O Observability, detection and recovery100100000
P AI/LLM, agents, prompts and MCP001010001
Q Availability, concurrency and abuse resistance000110000
R Reporting, governance and remediation assurance100000001

Cross-domain edges

EdgeScenarioStatusReasonProvenance
AB1
Discovered login endpoints -> session tests
New auth route missing token/session coverageBLOCKEDnot decided: A-002=INCONCLUSIVE, B-003=UNSUPPORTED, B-004=BLOCKEDroute:POST:/api/login@src/server.js
AC1
Asset owners -> access policies
Orphan routes lack authorization checksBLOCKEDnot decided: C-002=BLOCKED, C-003=BLOCKEDroute:POST:/api/login@src/server.js, route:GET:/api/invoices/:id@src/server.js, route:POST:/webhooks/stripe@src/server.js, route:GET:/admin/run@src/server.js
AD1
Input entrypoints -> sinks
Ingress path crosses a parsing or command boundaryFAILfailed controls: D-001, D-002control:D-001, control:D-002, control:D-003, control:D-004, file:src/server.js
AE1
Asset classification -> secret scan
Secret material flows into config, workflow or IaCFAILfailed controls: E-001, E-002control:E-001, control:E-002
AG1
Service inventory -> API coverage
Undocumented endpoints bypass contract testsBLOCKEDnot decided: G-002=UNSUPPORTEDopenapi.yaml, route:POST:/api/login@src/server.js, route:GET:/api/invoices/:id@src/server.js, route:POST:/webhooks/stripe@src/server.js, route:GET:/admin/run@src/server.js
AJ1
Cloud-deployed asset -> exposure
Private API exposed by ingress or policy driftFAILfailed controls: J-001, J-004route:POST:/api/login@src/server.js, route:GET:/api/invoices/:id@src/server.js, route:POST:/webhooks/stripe@src/server.js, route:GET:/admin/run@src/server.js, Dockerfile, infra/main.tf
BC1
Authenticated identity -> authorization
Valid user can access another tenant's objectBLOCKEDnot decided: C-001=BLOCKEDroute:POST:/api/login@src/server.js, route:GET:/api/invoices/:id@src/server.js
BK1
Mobile identity -> Android storage
Token copied to Android insecure storageFAILfailed controls: K-001android/app/src/main/AndroidManifest.xml, src/server.js, route:POST:/api/login@src/server.js
CG1
Object access -> API response
Mass assignment or property-level data accessBLOCKEDnot decided: C-001=BLOCKED, G-002=UNSUPPORTEDroute:GET:/api/invoices/:id@src/server.js
DG1
Webhook input -> API trust
Unsigned callback payload drives privileged stateSUSPECTEDsuspected: G-001route:POST:/webhooks/stripe@src/server.js
DH1
HTML output -> browser
Unescaped backend content reaches the DOMSUSPECTEDsuspected: H-001control:H-001
DP1
Prompt content -> tools
Untrusted retrieved text triggers a tool actionBLOCKEDnot decided: P-003=UNSUPPORTEDapp.py
FG1
Payment state -> webhooks
Replay moves payment into an invalid terminal stateBLOCKEDnot decided: F-001=BLOCKEDsrc/server.js, route:POST:/webhooks/stripe@src/server.js
FQ1
State machine -> race
Concurrent requests bypass idempotencyBLOCKEDnot decided: F-002=UNSUPPORTED, Q-002=UNSUPPORTEDsrc/server.js
IN1
Action dependency -> CI integrity
Unpinned third-party action may change codeFAILfailed controls: N-001.github/workflows/ci.yml

Control ledger

ControlTitleMethodStatusReason
A-001Repository inventory walk completed without unreadable or skipped filesstaticPASS9 text files analyzed, none skipped
A-002Externally reachable routes enumerated with file referencesstaticINCONCLUSIVE4 HTTP routes, 0 GraphQL operations, 0 gRPC methods, 0 queue consumers and 0 cron jobs extracted heuristically with file and line (`pandaward routes`); completeness is not proven without a contract or runtime crawl
A-003Declared API contract (OpenAPI) matches discovered routesstaticSUSPECTED3 heuristic signal(s) need review; not confirmed
A-004Asset owners, trust boundaries and abuse cases reviewedmanualBLOCKEDmanual-assisted review required (/pandaward:review); not decided by automation
B-001JWT verification is not disabled and does not accept the 'none' algorithmstaticSUSPECTED1 heuristic signal(s) need review; not confirmed
B-002Session cookies are not explicitly configured without Secure/HttpOnlystaticPASScheck completed with no signal (code heuristics); PASS applies to this check only
B-003Login, reset and MFA state machine tested with negative casesruntimeUNSUPPORTEDruntime adapter for profile staging-active is not implemented in this release; use manual-assisted review
B-004Session expiry and revocation enforced server-sideruntimeBLOCKEDneeds an identity with revoked: true and authorization_checks in an approved scope manifest, then `pandaward test --profile staging-active`
C-001Object-level authorization enforced on parameterized routes (BOLA)runtimeBLOCKEDneeds identities and authorization_checks in an approved scope manifest, then `pandaward test --profile staging-active`
C-002Function-level authorization enforced on privileged routesruntimeBLOCKEDneeds identities and authorization_checks in an approved scope manifest, then `pandaward test --profile staging-active`
C-003Authorization checks reviewed for every route handlermanualBLOCKEDmanual-assisted review required (/pandaward:review); not decided by automation
D-001No dynamic code evaluation (eval/new Function/exec of strings)staticFAIL2 confirmed observation(s)
D-002No shell command construction through a shell interpreterstaticFAIL1 confirmed observation(s), 1 suspected
D-003No SQL statements built by string concatenation or interpolationstaticSUSPECTED1 heuristic signal(s) need review; not confirmed
D-004No unsafe deserialization APIs on untrusted datastaticSUSPECTED1 heuristic signal(s) need review; not confirmed
D-005Injection probes executed against approved targetruntimeBLOCKEDneeds zap.active_scan: true in an approved scope manifest, ZAP installed and `pandaward test --profile staging-active`
D-006Semgrep data-flow rules (SSRF, path traversal, template injection) and project rules report no findingsexternalBLOCKEDsemgrep is not installed (optional; run `pandaward doctor`)
E-001No high-confidence secret patterns in repository filesstaticFAIL2 confirmed observation(s)
E-002Environment and credential files are not tracked in gitstaticFAIL1 confirmed observation(s)
E-003TLS certificate verification is not disabled in codestaticFAIL1 confirmed observation(s)
E-004No weak hash or non-cryptographic random used for security valuesstaticPASScheck completed with no signal (code heuristics); PASS applies to this check only
E-005Gitleaks reports no secretsexternalBLOCKEDgitleaks is not installed (optional; run `pandaward doctor`)
F-001Business invariants for money and entitlement flows documented and reviewedmanualBLOCKEDmanual-assisted review required (/pandaward:review); not decided by automation
F-002Idempotency and double-processing tested with synthetic fixturesruntimeUNSUPPORTEDruntime adapter for profile staging-active is not implemented in this release; use manual-assisted review
G-001Webhook handlers verify a signature before acting on the payloadstaticSUSPECTED1 heuristic signal(s) need review; not confirmed
G-002Runtime API authorization matches the declared contractruntimeUNSUPPORTEDruntime adapter for profile staging-active is not implemented in this release; use manual-assisted review
H-001No raw HTML injection sinks (innerHTML, dangerouslySetInnerHTML, v-html, |safe)staticSUSPECTED1 heuristic signal(s) need review; not confirmed
H-002CORS is not configured as wildcard together with credentialsstaticSUSPECTED1 heuristic signal(s) need review; not confirmed
H-003Security response headers present on approved deployed targetruntimeBLOCKEDneeds `pandaward test --profile production-observe` with an approved scope manifest
I-001Every package manifest has a committed lockfilestaticFAIL1 confirmed observation(s)
I-002Dependencies with install-time scripts are listed for reviewstaticPASScheck completed with no signal (lockfiles, install scripts, requirement pins, MCP configs); PASS applies to this check only
I-003No known-vulnerable dependencies in an advisory databaseexternalBLOCKEDosv-scanner is not installed (optional; run `pandaward doctor`)
I-004Python requirements pinned to exact versionsstaticNOT_APPLICABLEauto: no 'python_reqs' assets found in inventory (review this decision)
J-001Container images do not run as rootstaticFAIL1 confirmed observation(s)
J-002Container base images pinned (no latest or missing tag)staticFAIL1 confirmed observation(s)
J-003No privileged containers or host networking in compose/KubernetesstaticNOT_APPLICABLEauto: no 'orchestration' assets found in inventory (review this decision)
J-004IaC does not expose public storage or world-open admin portsstaticFAIL1 confirmed observation(s), 1 suspected
J-005Trivy reports no IaC misconfigurationsexternalBLOCKEDtrivy is not installed (optional; run `pandaward doctor`)
K-001Android manifest: not debuggable, no backup, no cleartext trafficstaticFAIL2 confirmed observation(s)
K-002Android exported components protected by permissionstaticSUSPECTED1 heuristic signal(s) need review; not confirmed
K-003Android runtime storage and transport verified on emulatorruntimeBLOCKEDneeds runtime.android_package, a running emulator with the debuggable test build, and `pandaward test --profile local-runtime`
K-004Android app does not keep credentials in plain SharedPreferences or world-accessible storagestaticPASScheck completed with no signal (android manifest, iOS plist and entitlements, mobile storage checks); PASS applies to this check only
K-005Built APK manifest: not debuggable, no backup or cleartext, no unprotected exported componentsexternalNOT_APPLICABLEauto: no 'apk' assets found in inventory (review this decision)
L-001iOS App Transport Security does not allow arbitrary loadsstaticNOT_APPLICABLEauto: no 'ios' assets found in inventory (review this decision)
L-002iOS keychain and storage verified on simulatorruntimeNOT_APPLICABLEauto: no 'ios' assets found in inventory (review this decision)
L-003iOS entitlements do not allow debugging outside debug buildsstaticNOT_APPLICABLEauto: no 'ios' assets found in inventory (review this decision)
L-004iOS credentials kept in the Keychain with a restrictive accessibility class, not in UserDefaultsstaticNOT_APPLICABLEauto: no 'ios' assets found in inventory (review this decision)
M-001Passive DAST (ZAP baseline) against approved targetruntimeBLOCKEDneeds `pandaward test --profile staging-active` with an approved scope manifest and ZAP installed
N-001Third-party GitHub Actions pinned to a full commit SHAstaticFAIL2 confirmed observation(s)
N-002No untrusted event data interpolated into run: scriptsstaticFAIL1 confirmed observation(s)
N-003pull_request_target workflows do not check out untrusted PR codestaticFAIL1 confirmed observation(s)
N-004Workflow GITHUB_TOKEN permissions declared explicitlystaticFAIL1 confirmed observation(s)
O-001Security events logged and alerted (privilege changes, auth failures)manualBLOCKEDmanual-assisted review required (/pandaward:review); not decided by automation
O-002Secrets and credentials not written to logsstaticPASScheck completed with no signal (code heuristics); PASS applies to this check only
P-001Model output is not executed as code or shellstaticSUSPECTED1 heuristic signal(s) need review; not confirmed
P-002MCP server configs pinned and free of inline credentialsstaticNOT_APPLICABLEauto: no 'mcp_config' assets found in inventory (review this decision)
P-003Prompt-injection and tool-authorization cases testedruntimeUNSUPPORTEDruntime adapter for profile staging-active is not implemented in this release; use manual-assisted review
Q-001Rate limiting applied to authentication and expensive routesmanualBLOCKEDmanual-assisted review required (/pandaward:review); not decided by automation
Q-002Concurrency and duplicate-action tests on stateful flowsruntimeUNSUPPORTEDruntime adapter for profile staging-active is not implemented in this release; use manual-assisted review
R-001All evidence artifacts of this assessment verify against recorded SHA-256staticPASS31 evidence artifacts verified against SHA-256
R-002Imported third-party analyzer results (SARIF) report no findingsexternalNOT_APPLICABLEauto: no 'sarif' assets found in inventory (review this decision)

Tool runs

AdapterVersionResultSignalsDetail
builtin-cicd0.2.1OK51 workflows
builtin-code0.2.1OK12code heuristics
builtin-infra0.2.1OK4dockerfile/compose/k8s/terraform checks
builtin-inventory0.2.1OK315 assets
builtin-mobile0.2.1OK3android manifest, iOS plist and entitlements, mobile storage checks
builtin-secrets0.2.1OK316 secret formats checked; 1 sensitive file names recorded without reading
builtin-supply0.2.1OK1lockfiles, install scripts, requirement pins, MCP configs
gitleaksBLOCKED0gitleaks is not installed (optional; run `pandaward doctor`)
osv-scannerBLOCKED0osv-scanner is not installed (optional; run `pandaward doctor`)
semgrepBLOCKED0semgrep is not installed (optional; run `pandaward doctor`)
trivyBLOCKED0trivy is not installed (optional; run `pandaward doctor`)

Evidence index

31 redacted artifacts under .pandaward/private/evidence/, named by SHA-256.

EvidenceSHA-256CollectorSource
ev_17b39394ce37dd0a17b39394ce37dd0a0de700dbb903572efdc354be838155d54c2c8d0e2efeb0b8builtin-secretssrc/server.js#L2-L2
ev_18bcf670b9fe88b618bcf670b9fe88b64d139efde10e65e0274fd3ea4a73c2a93e2c4a572da8695cbuiltin-codesrc/server.js#L8-L8
ev_1c22ef1d4a6f09581c22ef1d4a6f09581363dd3d521b89f576fca9e2b7bb6e7726d2f7f3b454df37builtin-mobileandroid/app/src/main/AndroidManifest.xml#L1-L1
ev_2b3c5175a0b4065c2b3c5175a0b4065c3599ce12d8dba7960e6c5b9bd6c16c3947e367598bbbd094builtin-secrets.env
ev_2dd232b952152e082dd232b952152e08f1ef75802cc28bd5c6a074299101c0cb03b2cf1b68185a6abuiltin-infraDockerfile#L1-L1
ev_2de440fb1038ae7e2de440fb1038ae7e66d537bbf6b430507479cf5d1ce6519a58c423374907823dbuiltin-inventorysrc/server.js#L7-L7
ev_3492a3599d7b8d703492a3599d7b8d7016a07bcb9ed0773f888387f2c95f9d77d8e6ca53c4012d5dbuiltin-codesrc/server.js#L9-L9
ev_385c21dd4cc2e520385c21dd4cc2e520f0876003cd58591eaffa08d917771aca8bace033edbe4a72builtin-mobileandroid/app/src/main/AndroidManifest.xml#L3-L3
ev_45edd1ca1b90d97245edd1ca1b90d972b8b85cde1a248bcffb06f92e712dda6b36da2a3d7fc9fce5builtin-codeapp.py#L4-L4
ev_4611c27259ceb1534611c27259ceb1535e0118b38d6fcd0380e333979e1415875926554f10ca9f10builtin-cicd.github/workflows/ci.yml#L6-L6
ev_47d3f7f67228fdd647d3f7f67228fdd6afc263d85982473a7b4838a60bf30fa2fdbc3b75bf60a86ebuiltin-inventorysrc/server.js#L6-L6
ev_4a7f9c2c4be3bcdb4a7f9c2c4be3bcdb8687f118ec4015e3782a9ea4a7080672b281f92d07d6fa0abuiltin-cicd.github/workflows/ci.yml#L8-L8
ev_4f9bf0d255e934f14f9bf0d255e934f197e52ca274cb292eb831a90bd499a2021158cc82d14881acbuiltin-infrainfra/main.tf#L1-L1
ev_4fc7c8c69e0311564fc7c8c69e031156263780edf79b4f52804e1991029f5388c4d6ab98516afcaabuiltin-secretsapp.py#L8-L8
ev_7eb1da32ab0560fe7eb1da32ab0560fe2ee8962ada80f96dbe720e4c9aeedcadfd3dd40feef13daabuiltin-codesrc/server.js#L8-L8
ev_822dc4e9c892428a822dc4e9c892428aea1fa57990ff08b0f58ac5f189179141e81ae2d071516875builtin-infrainfra/main.tf#L6-L6
ev_8f75c59732ca936d8f75c59732ca936db9fb6715c44a20e9772c50aceb3f8d022c970a5700bce04dbuiltin-codesrc/server.js#L4-L4
ev_9163cd2dde7659889163cd2dde7659880af78bc17e9b265ce83f9248557f2a54824be4725b7647a3builtin-codesrc/server.js#L6-L6
ev_94913aefcc6346ee94913aefcc6346ee4a0057bf92ee3bdaa7889ff39d20b3818bf17f30e656a4b7builtin-codeapp.py#L6-L6
ev_98bb7a66c22d748198bb7a66c22d7481eea003e7ec8b2dbabedd051499b73798d6e0f57e013ff363builtin-infraDockerfile#L1-L1
ev_a9c4d034c668acc8a9c4d034c668acc81cd7cdb434c4597d35e6d7568a4840db216326a061460f3fbuiltin-codeapp.py#L7-L7
ev_b013c649d18f6fc3b013c649d18f6fc37f8cefa1ea850deb9289169e1cfec887694e8ca51d5acbe1builtin-cicd.github/workflows/ci.yml#L9-L9
ev_ba4887d7098ce9c5ba4887d7098ce9c5f0d133ba772bbe0cf45b1ff2b3d2476df689e3571594bee8builtin-codesrc/server.js#L5-L5
ev_bc44fe7969b08ac8bc44fe7969b08ac86db054aafb4d26b89586d08b0546ef694b8cc58f309a1ff7builtin-cicd.github/workflows/ci.yml#L1-L1
ev_cdde459f87b81902cdde459f87b819027a96c9f7a2836db82d3d87d999df46fa3fe668c4097e3dfcbuiltin-mobileandroid/app/src/main/AndroidManifest.xml#L1-L1
ev_d4c0b7d0aaff8778d4c0b7d0aaff8778b011b8b9a3db6440e2d144f22060290a326be3462e364fdabuiltin-cicd.github/workflows/ci.yml#L11-L11
ev_e081c5b1020366d9e081c5b1020366d9d14573e4fecfa24b1afacb3bc3f9b5a6472f6245d090d880builtin-supplypackage.json#L1-L1
ev_e8d11c07675dc9abe8d11c07675dc9abaa9d111a717bdc9914443d8969b9f52ab584a747cec0060cbuiltin-codeapp.py#L5-L5
ev_efa0768a93861314efa0768a9386131425422ebad65848b31fefd3a4d9265fab15f93834bc2f61ccbuiltin-inventorysrc/server.js#L8-L8
ev_f6f8776e80a54556f6f8776e80a545566da22965fa764a799f2401818a4b866cc32f2e26914b2a4abuiltin-codeapp.py#L7-L7
ev_fdf34989adaac10ffdf34989adaac10f800ab39fe8ed55cf4515004df04443de3800ab24a195cf02builtin-codesrc/server.js#L7-L7

Generated 2026-10-28T20:49:03Z by pandaward 0.2.1.