Skip to content

[security] Sandbox hardening: landing plan and progress #127

Closed

Description

@yusiwen

Purpose

Sequencing, definition of done, and the progress log for the sandbox hardening batch. Each linked issue is one PR-sized unit; this issue holds the order and the record.

Dependency shape

#120 shared writable roots ─┬─> #121 kernel boundary for bash ──> #124 grant lifetime
                            ├─> #122 per-call policy                 (needs #126 for the second-start scenario)
                            └─> #123 enforcement facts ──> #125 unified refusal vocabulary

#126 tuiprobe restart/mark step — parallel track, needed only by #124

Order and why

Definition of done, per step

  1. Branch created before the first commit; one concern per commit.
  2. Local evidence: the issue's acceptance run as command → result, with counts rather than adjectives.
  3. The PR references its issue and carries the verification plus the honest scope of what was not verified.
  4. CI green and every job's annotations_count at or below the documented baseline.
  5. Rebase-merge, branch deleted, default branch hard-synced.
  6. Closing comment on the issue: what landed, the measurements, and what was handed off.

Progress log

Append one line per merged step: issue, PR, commit, one measurement.

Activity

  1. added
    securitySecurity hardening, sandbox or SSRF residual
    on Oct 8, 2026
  2. yusiwen commented on Oct 9, 2026

    @yusiwen
    OwnerAuthor

    The batch is complete — S0 → S7 all landed

    Every step in this plan is done and recorded in the progress log above:

    Step Issue Where
    S0 decision and feasibility recorded in the #121 decision comment
    S1 #120 shared writable roots PR #128
    S2 #123 enforcement facts and startup probe PR #129
    S3 #121 kernel-enforced boundary for bash PRs #132/#133/#134
    S4 #122 per-call policy on the context PR #136
    S5 #124 grant lifetime and persistence PR #137
    S6 #125 one refusal vocabulary PR #138
    S7 #126 tuiprobe step, release and pin, plus the app-side half of the second start (#155) PRs #154/#156/#157/#158 and #163

    Three defects were found and fixed through the batch's own gates rather than left in comments:

    Definition of done, per step, as this issue set it: branch before the first commit; local evidence as command → result with counts; the PR references its issue and carries the honest scope; CI green with every job's annotations_count at the documented baseline (1 per job, 2 each for browser and tui-visual); rebase-merge, branch deleted, master hard-synced; a closing comment with the measurements and the hand-offs.

    One honest note on signatures, since it applies to every step: the branch commits were signed (%G? = G), but a rebase-merge makes GitHub re-create each commit, so what lands on master is unsigned. That is the repository's merge strategy, not a property of the change.

    What is left

    #139 — command confinement is opt-in, so the default posture for shell commands is still the string denylist. Deliberately deferred in this session: it needs two decisions first (the cache-root policy for a confined command, and the per-platform default on a host with no confinement mechanism), and its verification needs a Landlock host, so CI's Sandbox confinement (Landlock + PTY) job is the gate. It stays open as the only security item from this batch still outstanding; #162 is closed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    securitySecurity hardening, sandbox or SSRF residual

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions