Skip to content

Nov 2, 2026 Security Incident Post-Mortem

November 8, 2026 · Devin Stein, CEO & Founder

Summary

On November 2, 2026, an attacker got into Dosu's production systems. They started with a free Dosu account, then exploited an RLS policy on org invitations to make themselves an owner of Dosu's own internal org.

From there they redirected the Dosu internal org's integrations to a server they controlled, taking the integrations' credentials. With those credentials they reached our CI pipeline, our DB, and our cloud project. The main intrusion ran from 04:11 to 07:59 UTC on November 2. Earlier scanning started on October 31, and the last probes of our public endpoints came on November 4.

Our database provider, Supabase, alerted us to the malicious activity. We cut off the attacker's access, rotated every production secret, and fixed the flaws they used.

Based on the attacker's query patterns, we believe their goal was to find OpenAI and Anthropic API keys and other credentials. Their searches repeatedly targeted strings in those providers' key formats. And once they accessed our own, they immediately started to use them.

Exposed

  • Account details for Dosu users: names, email addresses, sign-in providers and sign-in times. No passwords.
  • For a small percentage of customers, pages Dosu indexed were impacted. We have contacted each of them directly.

Not exposed

  • Source code, messages and billing information.
  • Integration credentials and API keys. The attacker reached the tables that hold them, but credentials are encrypted and API keys are hashed.
  • No customer data was mutated.

If you have not already been contacted directly, you don't need to take any action.

How the attacker got in

The attacker went from a new account to our cloud project in under two hours. Each step used access gained in the step before it.

  1. Reconnaissance (Oct 31 to Nov 2). From two IP addresses, the attacker scanned our public APIs and tried forged tokens. Every forged token was rejected.
  2. Sign-up (05:59 UTC). They created a free Dosu account with Slack sign-in.
  3. Org takeover (06:21 to 07:00). An incorrect RLS policy check let the attacker create an invitation to any org. The attacker invited themselves as owner of Dosu's internal org and of one open-source community org.
  4. Integration credentials (06:42). As an owner, they changed the server URL of our internal org's integrations to a Cloudflare Quick Tunnel they controlled. Dosu then sent those integrations' credentials to the tunnel. These included a read-only database token and a GitHub token for our bot account.
  5. Database credentials (06:51 to 07:57). Using that database access, they collected further database credentials and used them to read tables and run commands in our database.
  6. CI credentials (07:50). With the bot's GitHub token, they opened a pull request to our internal repository. Our CI ran an infrastructure preview on pull requests with access to production cloud credentials. The pull request's code sent those credentials to the attacker.
  7. Cloud project (07:52 to 07:59). With the cloud credentials, they deployed a small backdoor service and ran a few reconnaissance commands in it. Our org policy blocked every attempt to make it public. Their last action in our cloud project was at 07:59.

Along the way, they also tried to turn Dosu's own AI agent against us. They planted prompt-injection pages and asked the agent for secrets, environment variables and cloud metadata. The agent refused every request for credentials.

How we detected and contained it

Supabase, our database provider, detected the malicious activity and alerted us at 08:17 UTC on November 2. We started our response straight away and treated every credential the attacker could have reached as exposed.

What we did:

  • Removed the attacker's accounts, org memberships, pending invitations and OAuth apps, revoked their sessions, and reverted all changes they made to the DB and environment.
  • Fixed the invitation authorization check.
  • Rotated every production secret by 16:53 UTC: database credentials and signing keys, cloud service account keys, CI and deployment tokens, GitHub tokens and app keys, and keys for the third-party services we use.
  • Signed out every session that could have been affected.
  • Locked down our CI pipeline. Pull requests can no longer reach production credentials, and deployments now use short-lived credentials instead of stored keys.

What this means for your data

The attacker had database-level access for about an hour on November 2. We reviewed all access logs. Here is what we found for each kind of data.

DataImpactedWhat we found
Account detailsYesThe attacker downloaded the list of Dosu user accounts: names, email addresses, sign-in providers and sign-in times. The list holds no passwords or password hashes.
PagesPartialFor some customers, the attacker read content Dosu had indexed from connected sources. We have contacted each of those customers directly.
Source codeNoNot affected. We rotated the Dosu GitHub App's keys, and its logs show no malicious activity in your repositories during the incident.
MessagesNoNot affected. We rotated the credentials Dosu uses to read your messages, and logs show no sign of malicious activity during the incident.
Integration credentials and API keysNoAttacker tried to access, but integration credentials are encrypted and API keys are hashed.
Billing informationNoNot affected.
Your content in DosuNoNo changes. The only content the attacker changed was two org avatars: Dosu's own and one public open-source org's. Both changes were cosmetic.

If we learn anything that changes this picture, we will contact affected customers directly.

What you need to do

Nothing. We rotated every key and token Dosu holds on your behalf. You don't need to reconnect integrations or create new API keys.

As a precaution, we recommend you search your own logs for the indicators of compromise below. If you find a match, or have any questions, contact us at security@dosu.dev.

Indicators of compromise

Two IP addresses carried out the attack. We tie them to one operator through a shared TLS fingerprint. All times are UTC.

IndicatorTypeSeen (UTC)Notes
185.209.178.153IPv4 (Latitude.sh)Nov 2, 04:11–07:59Main attack address
56.10.188.158IPv4 (AWS ap-southeast-1)Oct 31 06:45 – Nov 4 04:35Scanning and probing
plains-roof-anybody-seasons.trycloudflare.comDomainNov 2, from 06:09Tunnel the attacker pointed integrations at
webhook.site/42ecb092-44f0-4a9c-9b62-696d1405d911URLNov 2, 07:51Where stolen CI credentials were sent
fldubai.comEmail domainNov 2Domain of the attacker's accounts
t13d3112h2_e8f1e7e78f70_b26ce05bbdd6TLS JA4Oct 31 – Nov 4The attacker's curl client, seen from both IPs
t13d1813h1_85036bcba153_d339722ba4afTLS JA4Oct 31 – Nov 2The attacker's Python client
ARTEX-17785/1.0User agentOct 31Custom; seen only from the attacker

The attacker's names for apps, branches and services used the prefixes pentest, probe and mq-probe-.

Timeline (UTC)

TimeEvent
Oct 31, 06:45First scanning of Dosu's public APIs, from 56.10.188.158
Nov 2, 04:11Scanning starts from a second address, 185.209.178.153
Nov 2, 05:59Attacker signs up for a Dosu account
Nov 2, 06:21–07:00Attacker makes themselves owner of Dosu's internal org and one open-source org
Nov 2, 06:42Attacker points our internal org's integrations at their tunnel and captures their credentials
Nov 2, 06:51Attacker starts querying our database
Nov 2, 07:27Attacker downloads the list of user accounts
Nov 2, 07:50Attacker opens a pull request with our bot's GitHub token; CI sends them production cloud credentials
Nov 2, 07:52Attacker deploys a backdoor service in our cloud project
Nov 2, 07:59Attacker's last action in our cloud project
Nov 2, 08:17Supabase alerts us to malicious activity; Dosu is unavailable until 11:28
Nov 2, 15:35Invitation authorization fix ships
Nov 2, 15:36Stolen cloud key deleted
Nov 2, 16:53All production secrets rotated
Nov 3, 05:29–05:3456.10.188.158 probes our API; every request is rejected or gets only public data
Nov 3 – Nov 4Customers notified
Nov 4, 04:35Last probe from 56.10.188.158, against publicly readable data

What we learned

All code that a frontier model hasn't reviewed is at risk. It has become irresponsible to write and review code without AI.

The flaw that let the attacker in was one missing check in one access policy written years ago by humans with minimal AI assistance. The vulnerability wasn't detected in multiple penetration tests at various points in time, including one the week prior to the incident.

The attacker used the ARTEX penetration testing framework. It sent more than 80,000 requests in 90 minutes and found the flaw within hours. Agents can do more sophisticated attacks, chain together series of vulnerabilities, and act faster than any human or even teams of humans could have prior.

And unfortunately, this is only the beginning for attacks like this, and it's likely going to get much worse. The attacking model was intelligent, but limited in its malicious intent. The logs indicate the agent “believed” it was running a penetration test. If it had more malicious goals and training, the results could have been much worse.

We now assume that any code written by people or by older models has bugs like this, and that attackers' models will find them.

We are completely overhauling our security review process and going to conduct regular agent-based penetration tests of all externally exposed surface areas.

Our commitment

We're sorry. You trust Dosu with access to your code and your team's knowledge.

We've published the details above so you can check your own systems, and so other teams can learn from our mistakes. If you have questions, contact security@dosu.dev or email me directly at devin at dosu.dev.

Devin Stein, CEO & Founder