For AWS teams with more attack surface than security staff

Pentest every release. Fix only what’s real.

Offense attacks your live system the way a skilled pentester would, and proves every finding. Defense reads what your tools already report, learns what your business runs on, and tells you which ones are real.

The evidence for SOC 2, ISO 27001 and customer reviews comes out of the same work. No separate project.

You ship weekly. You’re tested yearly.

An annual pentest tests one snapshot. Your tools run daily but only match known patterns, so they miss the flaws that matter most, like one customer reading another’s data. Every release in between goes out untested.

52 weeks · 1 pentest51 releases nobody tested

Your tools found 4,127 issues. Three matter.

Your tools can’t know that one public bucket holds your website images and another holds your customer records. So everything gets a severity, nothing gets fixed, and the finding that matters waits in row 212. Alert fatigue is a context problem, not a headcount problem.

4,127 findings
Port 22 openLambda wildcard policynpm package outdatedSnapshot unencryptedOld TLS cipherSecurity group 0.0.0.0/0Root access key presentBucket versioning offCookie without SecureUnencrypted EBS volumeKMS rotation offWeak password policyjQuery 1.12 detectedS3 bucket publicRDS publicly accessibleContainer runs as rootNo VPC flow logsCVE-2023-44487 in ingressOutdated base imageUnused IAM roleIMDSv1 allowedDirectory listing onIAM user without MFALog group no retentionHTTP listener on 80Missing HSTS headerTLS 1.0 enabledCloudTrail single regionSecret in env varRedis port openPort 22 openLambda wildcard policynpm package outdatedSnapshot unencryptedOld TLS cipherSecurity group 0.0.0.0/0Root access key presentBucket versioning offCookie without SecureUnencrypted EBS volumeKMS rotation offWeak password policyjQuery 1.12 detectedS3 bucket publicRDS publicly accessibleContainer runs as rootNo VPC flow logsCVE-2023-44487 in ingressOutdated base imageUnused IAM roleIMDSv1 allowedDirectory listing onIAM user without MFALog group no retentionHTTP listener on 80Missing HSTS headerTLS 1.0 enabledCloudTrail single regionSecret in env varRedis port openPort 22 openLambda wildcard policynpm package outdatedSnapshot unencryptedOld TLS cipherSecurity group 0.0.0.0/0Root access key presentBucket versioning offCookie without SecureUnencrypted EBS volumeKMS rotation offWeak password policyjQuery 1.12 detectedS3 bucket publicRDS publicly accessibleContainer runs as rootNo VPC flow logsCVE-2023-44487 in ingressOutdated base imageUnused IAM roleIMDSv1 allowedDirectory listing onIAM user without MFALog group no retentionHTTP listener on 80Missing HSTS headerTLS 1.0 enabledCloudTrail single regionSecret in env varRedis port openPort 22 openLambda wildcard policynpm package outdatedSnapshot unencryptedOld TLS cipherSecurity group 0.0.0.0/0Root access key presentBucket versioning offCookie without SecureUnencrypted EBS volumeKMS rotation offWeak password policyjQuery 1.12 detectedS3 bucket publicRDS publicly accessibleContainer runs as rootNo VPC flow logsCVE-2023-44487 in ingressOutdated base imageUnused IAM roleIMDSv1 allowedDirectory listing onIAM user without MFALog group no retentionHTTP listener on 80Missing HSTS headerTLS 1.0 enabledCloudTrail single regionSecret in env varRedis port openPort 22 openLambda wildcard policynpm package outdatedSnapshot unencryptedOld TLS cipherSecurity group 0.0.0.0/0Root access key presentBucket versioning offCookie without SecureUnencrypted EBS volumeKMS rotation offWeak password policy
4,127 findings · 3 risksthe one that matters is row 212
Offense

A pentester’s judgment on every release.

Offense plans attacks, chains findings and proves each one, the way a skilled pentester would. It runs on every release and tracks each vulnerability from run to run.

Replay a run
Run 12 · demo GraphQL API · 18 minutes, condensed
Attack surface · 214 operations
query:orgchangeddeep test
mutation:inviteMemberchangeddeep test
query:invoiceschangeddeep test
query:mesafe
mutation:updateProfilesafe
query:auditLogstale
Mapped once in run 1 and kept current. This run re-tests what changed in depth and confirms the rest.
A walkthrough of one run against our demo API.
Proven, not flagged
Every finding includes the request and response that prove it, replayed to rule out flukes. No maybes, no theoretical severity.
Coverage you can check
Counted from what actually ran, operation by operation. Nothing is assumed.
Built for production
You set the scope, the test accounts and the rate budget. Destructive commands are blocked. You hold the kill switch.

One pentest buys you a week. Offense covers the year.

A good annual pentest runs five figures and tests the system you had that week. If you ship weekly, about fifty releases go out after it, untested. Offense runs on every one, re-tests what changed in depth, and costs a fraction of that one engagement.

ComparisonAnnual pentestOffense
CoversThe week it ranEvery release
FindsWhat existed that weekWhat each release introduced, and what it broke
Proves the fixNext year, if you book againOn the next run
Hands youA report, weeks laterA ticket with the request and response, the same day
CostsFive figuresA fraction of that
Defense

Your tools flag everything. Defense shows what’s actually dangerous.

Defense reads your cloud, code and identity directory to learn what each resource holds and what can reach it. It ranks by that, explains every rank in one sentence, and gives you the fix.

Five findings, ranked two ways
Ranked by what’s at stake. One question is waiting on you.
3 of 5 need attention. Worst: Customer export bucket is publicly readable.
01
Customer export bucket is publicly readable
Guessed Critical: the internet reaches it and the name suggests customer data. Nobody has confirmed what it holds.
Defense is guessing. What does this bucket hold?
Critical?reported High
02
iam/ci-deploy holds AdministratorAccess
High: used 6 of 12,400 allowed actions in 90 days, and the key was used from a new network on Aug 4.
Highreported Medium
03
Database snapshot is unencrypted
Medium: private, but it holds a copy of the billing database. Encrypt on the next snapshot.
Mediumreported High
04
Marketing assets bucket is public
Low: public by design. It holds only website images.
Lowreported High
05
Port 22 open to the internet
Low: sandbox account with no data and no route to production.
Lowreported Critical
Every row explains its rank. Answer a question once and it applies to every similar resource.

Train it once. It ranks like it works there.

Tell it what a bucket holds, who owns a system, what’s public on purpose. Once. The answer applies to every similar resource, the queue reorders in front of you, and it tells you exactly what your answer moved. The more you teach it, the more your mornings look like three decisions instead of three hundred.

Flagged. Confirmed. Fixed. Proven.

Defense
Flags it
Ranked Critical: reachable from the internet, holds customer records.
Offense
Confirms it
An attempt reads it from the internet, as a partner identity.
Defense
Fixes it
The exact change, ready for a person to apply. You approve it.
Offense
Proves it
Attacks again. No longer reached: the finding closes and guards every later run.
Open · unconfirmedhbl-customer-exports
Customer export bucket is publicly readable
Critical: internet-reachable + holds customer records (confirmed by Priya R.)

One tool tells you what’s real. The other proves it, and keeps proving it after the fix. Nobody on your team argues with a ticket again.

Green means someone looked.

When a source stops reporting, a scan times out, or nothing is watching a resource, most dashboards show nothing wrong. Ours shows a gap. Absence of findings is never read as compliance.

A source that stopped reporting shows as a gap, not as quiet.
A scan that timed out shows as unknown. Never as safe.
A guess is labeled a guess, and comes with a question.
The exposure map: internet-exposed resources, the services behind them, and the data they reach, with a banner saying which sources did not report.
The exposure map from a demo workspace. Two resources couldn’t be evaluated and four sources didn’t report. It says so instead of drawing them clean.

Hand your auditor proof, not screenshots.

Every finding carries the proof it happened. Every decision sits on a signed record: who accepted a risk, why, and until when. Who approved a fix, and the proof it held. When your auditor or a customer’s security team asks, you send one package. They verify it on their own laptop, without trusting us.

SOC 2, ISO 27001, customer security reviews: the evidence is already there.

$ python3 defense-verify
Checking the evidence package in
xagax-defense-evidence-harborline-payments

  ok   provenance.json is signed by key 1ddbeeed5b90…95c99f20
       and names manifest.json, which is what is here: the cloud
       environment of Harborline Payments on console.xagax.com,
       CIS Critical Security Controls 8.1 over 2026-07-31 to
       2026-10-29, read at 2026-10-29 12:22 UTC

  ok   every file listed in manifest.json hashes to exactly
       what it says

  ok   both checkpoints are signed by keys this package pins,
       the keys its deployment publishes at /security

  ok   the record extends the checkpoint it was cut at:
       nothing altered, reordered or removed since it was signed

  ok   4 claims are signed by the keys pinned in claim-keys.json

verified · checked offline, against nothing but this package
  and the keys it names
The verifier, run offline on a laptop that cannot reach us. Five checks, then verified.
The audit log’s signed checkpoint: the record still hashes to what was signed, with the key the trust center publishes.
The audit log’s signed checkpoint. Rewriting the record would mean re-signing it, and the key is not there to take.
Security & access

We read the envelope, never the letter.

Defense
Defense looks at your cloud through a read-only role you grant. It can look but never touch. It never opens your files, your databases or your customers’ data. Everything it keeps is locked with a key only your company holds. Leave, and the key is destroyed. Everything you taught it goes with you.
Offense
Offense attacks only what you scope, inside a rate budget you set, and you hold the kill switch. Every request it sends is on the record, and its evidence is sealed the same way.
The audit log’s view of what left the account, counted by record and source, beside the list of what never leaves.
What leaves your account, counted by record. Contents of buckets and databases, secrets and personal data never do.
Nothing changes without a named person on your team approving it, and every approval is on the record. Architecture and data-flow documentation is available for your security review. Ask for it.

Six questions, answered straight.

Will Offense break production?

You set the scope, the test accounts and the rate budget. Destructive commands are blocked outright, and you hold the kill switch. It’s built to test live systems carefully. That’s the whole job.

How do we start?

One read-only cloud role for Defense, or one target and a test account for Offense. About thirty minutes either way, and you’ll see real findings the first day. No contract to start.

Will my auditor accept this instead of a pentest?

It gives you the evidence: every finding with its proof, every decision on a signed record, in a package anyone can verify. Whether that replaces a third-party test is your auditor’s call. Most teams keep the annual test and use Offense for the releases in between.

Does it work with my stack?

AWS today, one account or a whole Organization, plus GitHub and Google Workspace. Offense attacks HTTP APIs from the internet, like an outsider, using test accounts you provide. Hosted by us, in the US.

What do you store?

What we need to explain a risk, never the contents of your files, databases or customer data. It’s sealed with a key that’s yours alone and destroyed when you leave.

What happens when it’s wrong?

It says so. A guess is labeled a guess and comes with a question. Answer it once and every similar resource learns.

Start with one target. See real findings the first day.

We’re onboarding a small number of teams. Tell us about your setup and we’ll come back within two business days. One target for Offense, or one read-only cloud account for Defense. That’s all a first run needs.