TS-2025-004
Description: Tailnets using shared public email providers
What happened?
On May 22, 2025 our Reddit community gave us the necessary kick to address an issue with handling shared public email provider domains ("shared domains"). We mitigated the risk for new tailnets being created on previously unknown shared domains by enabling user approval by default. This issue affects only a small portion of our user base, and this bulletin provides some background, mitigation steps, and our future plans.
Background
Tailscale users are mapped to tailnets by their email address domain (with a
few exceptions*). This means that user1@example.com
and user2@example.com
can both log in to tailnet example.com
. We chose this default behavior because
it reduces onboarding friction for new users and tailnet admins.
The downside of this default behavior is that if a user's email address comes from a shared domain, multiple unrelated users may be able to join the same tailnet without realizing that others are in their tailnet too.
Tailscale has a workaround for this scenario: we flag known shared domains in
our database. For example, when user@gmail.com
logs in for the first time, we
create a personal tailnet named user@gmail.com
for them instead of adding
them to one giant gmail.com
tailnet. If there is an existing shared domain
tailnet, we "decompose" it - break it up into new personal tailnets for each
user with only their nodes. Very popular email providers, like Gmail or Yahoo,
have been decomposed from the very beginning.
This workaround has an obvious flaw: we can't flag all shared domains in our database proactively, because there is no authoritative list of such domains and new providers can show up at any time. So far we have patched over this flaw by retroactively flagging new shared domains when users report them to us. This has been convenient for ease of onboarding new users, especially users on corporate domains.
* We use special OIDC claims to map logins to tailnets on Google Workspace
(hd
claim) and Microsoft Entra (tid
claim).
What changed
On May 22, 2025 a post on Reddit made the severity of this issue more obvious. The poster was using a previously unknown shared domain. We flagged the new shared domain and decomposed the tailnet.
To mitigate the potential risk for tailnets on shared domains, we enabled user approval by default for all new tailnets. This way, even if unexpected users log in using a shared domain that is not decomposed yet, an administrator will have to approve them first. We did not change the setting for any existing tailnets to avoid breaking any workflows.
Since May 22nd, we also decomposed 130 additional tailnets based on signals like: number of users, payment plan, recent activity, whether they have a Google Workspace or a Microsoft Entra tenant, and basic online research. Before May 22nd, we had already flagged and decomposed 534 shared domains, many proactively, but some in response to support tickets.
What we're doing next
We have certainly dug ourselves into a hole here. There are various public lists of shared domains, but it is tricky to figure out which existing tailnets are meant to be single-user and which are not. There are shared email hosting providers, customer emails created by ISPs, university emails, disposable email providers, etc. In all cases a tailnet could be a legitimate corporate tailnet for the company or university, and decomposing the tailnet could break their setup.
There are several planned actions and projects that should improve the situation:
- Short-term
- Proactively flag more shared domains that don't have tailnets yet, using public email provider lists and the Public Suffix List.
- Reach out to admins of tailnets that are potentially on shared domains, but where we can't be certain, with advice on how to protect and audit their tailnets.
- Medium-term
- Mark any new domain coming through a Google or Microsoft login as shared if it's not associated with Google Workspace or a private Microsoft Entra tenant.
- Prompt owners of existing tailnets like the above to enable User Approval on next login. Today this is ~1.7% of all tailnets.
- Create a process for unflagging a shared domain through a support ticket and DNS ownership verification in case of false positives.
- We are discussing changing the default ACL in new tailnets, but no decision has been made yet.
- Long-term: a large identity model change has been in the works for roughly a year that, among other things, will make all new user registrations create a personal tailnet instead of a domain-wide tailnet by default.
What was the impact?
There are two potentially risky scenarios with shared domains: malicious users and malicious admins.
Malicious users could join a tailnet of an unsuspecting user and access exposed ports on that user's nodes. Tailnet ACLs could limit that impact, but default ACLs allow access to all ports on all nodes. Note that Tailscale SSH is not allowed between nodes of different users, so a malicious user would need to exploit some other software on a victim's node to gain access or information. Also note that the free plan of Tailscale is limited to 3 users.
Malicious admins could create a tailnet on a shared domain and wait, or social-engineer victims to join it. Once victims join the tailnet, a malicious admin could access all open ports on victims' nodes, and set up a subnet router to intercept their traffic. A malicious admin could also set up their own DNS server for the tailnet to record and spoof DNS responses.
We are not aware of any instances of either of these scenarios happening.
Who was affected?
Users of 664 known shared domains out of a total 166,488 unique domains we've seen across all tailnets may have had their nodes exposed to other users with the same email domain. 534 of these shared domains have been been decomposed throughout Tailscale's history and not recently.
There may be other tailnets using shared domains that we haven't discovered yet.
Who was not affected?
The following categories of users are not affected:
- Users with custom email domains (corporate or personal)
- Users with custom OIDC providers
- GitHub users, including personal and org tailnets
- Owners of tailnets with User Approval or Device Approval enabled
- Owners of tailnets with Tailnet Lock enabled
- Users of very popular email providers, like
gmail.com
,outlook.com
,yahoo.com
,protonmail.com
, and others - Users with custom restrictive ACLs that avoid
autogroup:member
and other broad selectors insrc
clauses
What do I need to do?
If your tailnet name in the top-left corner of the Admin Console is an email address rather than a bare domain, no action is needed.
If you are in a tailnet on a shared domain:
- Contact support to request your tailnet to be decomposed.
- If you're the tailnet owner, review the list of users in your tailnet and audit logs for evidence of any suspicious activity.
- If you're the tailnet owner and don't want to decompose your tailnet, enable user and/or device approval.
If you are in a tailnet on a domain that was wrongfully decomposed, contact support to reset your tailnet.
Timeline
- March 2019: Tailscale started, Google and Azure AD (now Entra) authentication implemented
- December 2019
- decision to maintain a list of shared domains was made
- first shared domain hardcoded -
gmail.com
- Tailscale launched to a small set of users
- November 2020: Node sharing released
- January 2021: the hardcoded list of shared domains moved into a database table, tools created for the support team to decompose new shared domains
- June 2021: GitHub authentication added
- March 2023: Custom OIDC authentication added
- April 2023: Passkey authentication added
- April 2023: Apple authentication added
- May 2023: External user invites added
- This was primarily the point at which creating a tailnet for email domains stopped being necessary. Multiple users could join a shared tailnet by an invitation to access each other's nodes, even on personal accounts from shared domains.
- May 2025:
- May 22nd: Reddit user posted about an unexpected member of their tailnet
- May 22nd: User approval enabled by default for new tailnets
- May 23rd-27th: 130 shared domain tailnets identified and decomposed