ChainSafe / ChainSafe/docker-socket-policy

Go router doesn't exclude reserved path segments in extractContainerName (cross-language parity)

Open
#24 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Rust
Stars
2
Forks
0
Avg merge
5h 17m
Merged PRs (30d)
13

Description

## Problem

While reviewing the Quint spec's routing table against all three implementations (issue #5), found a cross-language inconsistency in how container names are extracted from the URL path.

Rust (`rs/src/proxy.rs`) and TypeScript (`ts/src/proxy.ts`) both explicitly exclude reserved path segments (`create`, `json`, `exec`) from being treated as a container name when parsing `/containers/:name/...` paths. Go's `extractContainerName` (`go/internal/proxy/router.go`) does not.

Concretely: a request like `DELETE /containers/json` is treated as `Allow` (unknown-container passthrough) in Go, but falls through to `Deny` (default-deny) in Rust and TypeScript, because Rust/TS recognize `json` as a reserved segment rather than a container name.

## Impact

Low severity — not exploitable as a privilege escalation on its own (the request would still need to pass all other gates), and not exercised by the Quint model (which doesn't model this specific parsing edge case). But it's a real behavioral difference between the three "equal peer" implementations that could cause confusing/inconsistent behavior depending on which language a deployment uses.

## Solution

Update `go/internal/proxy/router.go`'s `extractContainerName` to exclude the same reserved segments (`create`, `json`, `exec`, and any others Rust/TS already exclude) that Rust and TypeScript already handle, so all three implementations agree on which path segments are container names vs. reserved routing keywords.

## Which implementation(s) would this affect?
- [x] Go

## Additional context
Found during the Quint spec review in #5. Confirmed via `gh api` diff of Router implementations, not by direct testing — recommend adding a unit test case for `DELETE /containers/json` (and similar) across all three languages once fixed, to catch regressions.

Contributor guide

Open the contributing guide

Research direction

Start in go/internal/proxy/router.go at extractContainerName, then compare the reserved-segment handling in rs/src/proxy.rs and ts/src/proxy.ts. Add coverage for DELETE /containers/json and similar reserved paths, and verify Go agrees with the Rust and TypeScript behavior without treating reserved segments as container names.

Written by the indexing model from the issue text.

Assessment

Tech stack
docker, go, rust, typescript
Domain
api, backend
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Active
Clarity
Clearly specified
Newbie friendliness
76/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.