Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

Container create: default-deny HostConfig, validate Mounts and the bind read-only mode

Đã đóng
#88 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

Một pull request liên quan đã được merge.

  • #92 của @abienkowski — đã merge

Đánh giá

Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức phù hợp với người mới
15/100
Loại issue
Lỗi
Độ rõ ràng
Khá rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
docker, go, rust, typescript
Lĩnh vực
api, security

Hướng nghiên cứu

Start with the POST /containers/create middleware in go/internal/middleware/mountsource.go and containerconfig.go, then the matching files in rs/src/middleware.rs and ts/src/middleware.ts. The issue asks for a default-deny allowlist on HostConfig, a Mounts check that matches the Binds whitelist, bind-mode parsing for read_write, and forcing Privileged to false even when container_config is empty. Done means the three repro creates return 403 in each implementation, and the policy tests cover the new rules. The issue is a breaking security change that needs maintainer agreement on the allowlist first.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

Priority: P0 Status: Break Change Type: Bug

Describe the bug

On POST /containers/create, the proxy checks only part of the request. Every other field goes to the daemon unchanged:

  • The volume whitelist checks the host path of HostConfig.Binds and the legacy top-level Volumes. It does not check HostConfig.Mounts.
  • The bind mode is not checked. read_write: false is parsed in all three implementations, but no gate reads it.
  • ContainerConfigMutator overwrites NetworkMode, RestartPolicy, SecurityOpt, Privileged, User and LogConfig. If container_config is empty, it returns early and does not even force Privileged: false.
  • Other HostConfig fields pass through: Devices, DeviceRequests, DeviceCgroupRules, GroupAdd, CapAdd, VolumesFrom, Links, Sysctls, CgroupParent, Runtime, the host values of PidMode, IpcMode, UTSMode, UsernsMode and CgroupnsMode, MaskedPaths/ReadonlyPaths, and SecurityOpt when the policy sets none.

So every policy-level restriction on mounts and privileges can be bypassed by a caller of the socket.

Affected implementation(s)

  • Go
  • Rust
  • TypeScript
  • All

Go go/internal/middleware/mountsource.go (Binds host path only), go/internal/middleware/containerconfig.go:13 (early return). Rust rs/src/middleware.rs and TypeScript ts/src/middleware.ts have the same gaps.

To Reproduce

Policy with volumes: [{host_path: /srv/ok, container_path: /ok, read_write: false}]. Through the proxy, each of these creates is accepted and the daemon receives the field unchanged:

  1. docker create --mount type=bind,src=/,dst=/host alpine:3.20 true
  2. docker create -v /srv/ok:/ok:rw alpine:3.20 true (also -v /srv/ok:/ok with no mode)
  3. docker create --cap-add SYS_ADMIN --pid host alpine:3.20 true

Expected behavior

Default-deny on HostConfig:

  1. A HostConfig key outside a fixed allowlist must be absent or hold its zero value. Otherwise the proxy returns 403 and names the field. A denylist would miss fields that the Engine API adds later.
  2. HostConfig.Mounts gets the same whitelist as Binds. bind mounts must match a policy volume, with ReadOnly: true if the volume is not read_write. volume mounts and all other types except tmpfs are denied.
  3. Each bind mode is parsed. A volume with read_write: false requires ro.
  4. The mutator forces Privileged: false even if container_config is empty. SecurityOpt from the caller is denied unless the policy lists it, apart from no-new-privileges.

Status: Break Change: creates that set these fields are now denied.

Additional context

Found while verifying the proxy for ChainSafe/lodestar-infrastructure#9.

Ngôn ngữ chính
Rust
Star
2
Fork
0
Merge trung bình
12 giờ 11 phút
Pull request đã merge (30 ngày)
30

Chuẩn bị môi trường

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của ChainSafe/docker-socket-policy

Tất cả issue của ChainSafe/docker-socket-policy

Issue tương tự

Thêm issue về Rust

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.