AWS Access Key ID exposed
Identified a standard AWS Access Key ID starting with 'AKIA' or 'ABIA'.
AWS_ACCESS_KEY_ID = "AKIA********MPLE"
Database connection string with embedded password
Identified a database URI containing hardcoded credentials (PostgreSQL, MySQL, MongoDB, Redis).
DATABASE_URL = "postgres://pg_admin:Supe********345!@db-prod.internal:5432/corp_data"
Slack Webhook or Bot Token exposed
Identified a Slack Incoming Webhook URL or Bot OAuth Token (xoxb/xoxp).
SLACK_ALERT_WEBHOOK = "http********uvwx"
Unpinned base image tag (:latest or no tag)
Base image 'python:latest' uses mutable ':latest' tag.
FROM python:latest
Sensitive credential passed via ENV or ARG
A secret, token, key, or password is baked into an ENV or ARG instruction. These values persist in image layer metadata and are visible via `docker history`.
ENV API_SECRET_TOKEN=sk-live-99a8b7c6d5e4f3a2b1c0d9e8
Unverified download and shell execution (curl/wget | sh)
The RUN instruction pipes remote network content directly into a shell interpreter (`curl ... | sh` or `wget ... | bash`) without checksum verification.
curl -fsSL https://raw.githubusercontent.com/untrusted/installer.sh | sh
Use of ADD instead of COPY for local files
`ADD` has unexpected side effects: it extracts tar archives automatically and accepts remote URLs. Best practice is to use `COPY` for local files.
ADD src/ /app/src/
Container runs as root (missing non-root USER)
Container executes as default root user (UID 0).
Missing USER directive
Missing HEALTHCHECK instruction
No HEALTHCHECK instruction defined in Dockerfile.
Missing HEALTHCHECK
Leaked Internal Origin IP or Staging Hostname in Client-Side JS
Hardcoded RFC1918 private IP address (`10.x.x.x`, `192.168.x.x`, `172.16-31.x.x`) or internal hostname (`.internal`, `.corp`, `.local`, `.lan`) found in JavaScript code. This aids attackers in mapping internal infrastructure and bypassing CDN/WAF protection.
const INTERNAL_ORIGIN = "http://10.0.20.51:8080/status";
Hidden Administrative, Debug, or Internal API Endpoint in JS Bundle
A JavaScript/TypeScript file references an administrative, internal, debug, or server-status route. Attackers extract these endpoints during client-side reconnaissance to discover unprotected admin functionality, IDOR vectors, or WAF bypass routes.
const ADMIN_EXPORT_ENDPOINT = "/api/v1/admin/users/export";
Unsafe DOM XSS Sink or Dynamic Code Execution (innerHTML / eval / document.write)
Detected dangerous client-side sink (`eval()`, `new Function()`, `document.write()`, `.innerHTML =`, or `dangerouslySetInnerHTML`). Unsanitized input reaching these sinks allows attackers to escalate HTML injection into full DOM-based Cross-Site Scripting (XSS).
document.getElementById("banner").innerHTML = untrustedHtml;
Insecure Cross-Origin postMessage Wildcard ('*')
Using `postMessage(..., '*')` broadcasts sensitive client-side messages or tokens to any origin, allowing malicious iframes or windows to intercept data.
window.parent.postMessage({ status: "loaded" }, "*");
Exposed Production SourceMap Reference (sourceMappingURL)
The JavaScript bundle contains a `sourceMappingURL` directive pointing to a `.map` file. In production, exposed source maps allow attackers to reconstruct the full unminified source code, developer comments, and business logic.
//# sourceMappingURL=frontend_bundle.js.map
Overly permissive workflow permissions (write-all)
The workflow or job explicitly grants `permissions: write-all`. This violates the principle of least privilege and allows compromised steps to write to all repo resources.
permissions: write-all
Unpinned GitHub Action (mutable tag/branch used instead of full commit SHA)
Action 'actions/checkout' is pinned to mutable ref '@v3' instead of an immutable 40-char commit SHA.
uses: actions/checkout@v3
Potential script injection via untrusted GitHub context in 'run'
Untrusted context '${{ github.event.pull_request.title }}' used directly in shell execution script.
echo "Building PR release for: ${{ github.event.pull_request.title }}"
Missing job execution timeout
Job 'release' does not define 'timeout-minutes'. Runaway jobs could deplete CI minutes.
job 'release': missing timeout-minutes