Skip to content

Run Shannon with a ChatGPT or xAI subscription

Give Shannon a subscription login and one test account, validate model access and the app login, then scan. It works the same with GPT-6 Sol on a ChatGPT Plus or Pro subscription and with Grok 4.7 on an xAI subscription.

Both the ChatGPT and xAI subscription workflows were tested recently. The current releases are Shannon 3.5.0 and Pi 1.5.2.

Before you start, you need:

  • Docker, and Node.js 22.19 or later (Pi’s Node requirement)
  • The app you want to test, with a login, and a local checkout of the source revision deployed there.
  • A target URL reachable from Shannon’s Docker worker. For an app on your machine, use a Docker-reachable address such as http://host.docker.internal:3000 in both the target and login URLs, and configure the app to accept that host. localhost inside the worker refers to the worker itself.
  • A ChatGPT Plus or Pro subscription, or an xAI subscription
  • One test account with access to the features you want tested, and sample records for those features

Shannon uses your subscription through Pi. Install Pi, run pi, type /login, choose your provider, and complete the browser sign-in. Pi saves your login in ~/.pi/agent/auth.json. With SHANNON_USE_PI_AUTH=1, Shannon reuses that login to access your subscription.

ChatGPT on a Codex subscription

In Pi, choose /login → Sign in with an account → OpenAI Codex, called OpenAI Codex (legacy) in some older Pi versions, and complete the browser sign-in. These Shannon 3.5.0 instructions use the openai-codex provider, not the separate openai provider offered by “Sign in with ChatGPT”. Then set:

Terminal window
export SHANNON_USE_PI_AUTH=1
export SHANNON_AI_MODEL=openai-codex:gpt-6-sol

The scan counts against your subscription’s usage limits. See the Codex subscription setup guide.

Grok on an xAI subscription

Sign in to xAI in Pi, then point Shannon at it:

Terminal window
export SHANNON_USE_PI_AUTH=1
export SHANNON_AI_MODEL=xai:grok-4.7

The scan counts against your plan’s usage limits (xAI subscription setup).

Run the commands from the same terminal where you exported these variables.

OpenAI applies real-time safeguards to security work, and a Shannon scan is one. Before your first ChatGPT-backed scan, open OpenAI’s Cyber page and complete the access it asks of security testers. Shannon does not run a cyber-access probe for xAI. If the model refuses has the details.

The rest of this page works the same with either subscription.

Shannon checks your target, source, configuration, model access, and app login, then analyzes the source code and tests the running application. It tests injection, XSS, authentication, SSRF, and authorization, and assembles the findings into a final report.

Create shannon.yaml outside the source repository with the credentials and login steps for one disposable test account. Use a high-privilege test account, such as an administrator, to give Shannon access to more features and API endpoints:

description: "A copy of the app, with a disposable test account and data."
authentication:
login_type: form
login_url: "https://app.example.com/signin"
credentials:
username: "test-admin@app.example.com"
password: "CHANGE_ME_PASSWORD"
login_flow:
- "Type $username into the Work email field"
- "Click Continue with email"
- "Type $password into the Password field"
- "Click Sign in"
success_condition:
type: url_contains
value: "/dashboard"
rules_of_engagement: |
Test only https://app.example.com.
Use only the test workspace and its disposable records.
Do not trigger email, payments, or external jobs.
Modify only disposable records created for this test.
At most 2 requests per second. Back off on 429 or repeated 5xx.
List blocked checks and what each one needed.

Replace CHANGE_ME_PASSWORD with the test account’s password, and update the login URL, steps, and success condition to match your app.

Keep the configuration outside Git and restrict access to the file. Treat Pi’s auth.json, scan logs, and reports as sensitive, and redact credentials and private findings before sharing them. Authentication credentials may be included in prompts sent to your chosen model provider, so use only disposable test credentials that you are authorized to share with that provider.

Rules of engagement guide the agent. Do not rely on prose instructions as a hard rate limiter, request cap, or network isolation boundary. Use a disposable environment with only the access needed for the assessment.

Add sample records for the features you want tested. If sign-in uses a separate authentication service, allow its normal sign-in calls in the rules of engagement and state whether testing that service is in scope.

Repository and configuration paths can be absolute or relative to your current directory.

Run these two checks with your target URL and paths from the shell where you signed in:

Terminal window
npx @keygraph/shannon@3.5.0 start -u "https://app.example.com" -r "./my-app" --validate-model
npx @keygraph/shannon@3.5.0 start -u "https://app.example.com" -r "./my-app" -c "./shannon.yaml" --validate-auth

--validate-model checks your model-provider credentials and model access. For a ChatGPT subscription it also runs OpenAI’s cyber-access check; there’s no such probe for xAI (preflight source). It makes a few model requests and stops before the scan, and a pass doesn’t promise that every later request goes through.

Each --validate-auth run attempts a real login. Look for Authentication validated. No pentest was run (--validate-auth). on success; a failed login reports where it failed. Confirm in the app that the test account has the permissions you expect. The check consumes model usage and stops before the scan. (Verdict handling, terminal message)

Start the scan:

Terminal window
npx @keygraph/shannon@3.5.0 start \
-u "https://app.example.com" \
-r "./my-app" \
-c "./shannon.yaml" \
--follow

Open Security-Assessment-Report.md or Security-Assessment-Report.pdf in the location shown by Shannon.

Use the final report to review the findings and exploit evidence. Review which checks ran and which were blocked. A completed scan or successful login validation does not establish complete authorization coverage. One high-privilege account does not establish coverage of access checks between different users or roles.

If you want more detail about what happened during the scan, read .shannon/workflow.log in the scan’s workspace.

Guidance updated 2026-11-11 for Shannon 3.5.0. Provider access requirements and model availability can change; follow the providers’ current instructions linked below.

A provider may decline a security-testing request even when your subscription login succeeds. Follow the provider’s access instructions and run --validate-model before starting the scan.

An access-check pass is evidence that those requests succeeded with that credential and model, not a guarantee for the whole scan. Shannon does not enroll accounts or verify approval tiers. For enrollment requirements, use the provider’s current instructions linked from Shannon’s provider guide.

Run the check with the model you plan to scan with, and again after any approval:

Terminal window
npx @keygraph/shannon@3.5.0 start -u "https://app.example.com" -r "./my-app" --validate-model

The check works with a subscription or a key and stops before the scan. Passing it does not guarantee that every later request will be accepted.

At the check, you get one of these lines, with the reference OpenAiCyberAccessError or AnthropicCyberAccessError:

OpenAI declined the security workload behind its cyber-access program.
Anthropic declined the security workload behind its cyber-access program.

During a scan, the CLI can show only a general failure. Check .shannon/workflow.log in the scan’s workspace for the reason. A decline from a ChatGPT subscription can read “This content was flagged for possible cybersecurity risk”.

  1. Check that the model ID, credential and endpoint are the ones you intended. Approval for a different account or model does not establish that this request will succeed.
  2. Follow the provider’s current access instructions if required. Shannon’s decline message is not proof of a particular enrollment status.
  3. Run --validate-model again with the same model before resuming. Resume only if the scan has a usable checkpoint.