Skip to content

docs: clarify exposure triage evidence permissions and privacy - #261

Merged
sodejm merged 2 commits into
mainfrom
codex/issue-195-exposure-triage-privacy
Oct 11, 2026
Merged

sodejm merged 2 commits into
mainfrom
codex/issue-195-exposure-triage-privacy

Conversation

@sodejm

@sodejm sodejm commented Oct 11, 2026

Copy link
Copy Markdown
Owner

Summary

Clarify the permissions and handling required for exposure-triage evidence in the analyst playbook, and link that guidance from the package quick start. The playbook now distinguishes read-only access for the offline triage command from permissions needed to export source data or write a report. It describes private fields, restricted storage, redaction, and a synthetic example that can safely be displayed.

Addresses #195.

Acceptance criteria

  • Document input read permissions, private evidence handling, redaction expectations, and safe examples.
  • Run focused acceptance checks and make check; update affected docs.
  • Out-of-scope work identified: no CLI behavior or source-system permission changes.

Evidence

  • Focused validation passed: from the package directory, python3.12 -m exposuretriage.cli validate --input fixtures/bundles/synthetic-enterprise/bundle.json accepted the synthetic bundle; python3.12 -m exposuretriage.cli triage --input fixtures/bundles/synthetic-enterprise/bundle.json produced the expected seven-item synthetic report; python3.12 scripts/validate_package.py passed; git diff --check passed.
  • make check passed in this checkout with a Python 3.14 test environment selected through PATH and PYTHON. The system Python 3.9 did not meet the repository's Python 3.11 minimum. The full run passed after using the supported environment and allowing the test suite's local Unix socket bind.
  • Staged diff and outgoing commit passed gitleaks with no findings.
  • Hosted CI state: pending draft PR checks.
  • Independent agent critique of the two-file diff found no issues; this does not replace human review.

Impact review

  • Tests: documentation-only change with an explicit issue-coverage exception in the commit message; existing package validation and full repository checks passed.
  • Documentation: package README and analyst playbook updated together.
  • Architecture or migrations: none; the offline data flow and schema are unchanged.
  • Security, privacy, and abuse cases: documents least-privilege access, private evidence, stdout/log exposure, report file permissions, redaction, and preservation of identifier links in examples.
  • Operations, release, and rollback: operators should use approved restricted workspaces and a restrictive umask; a Git revert restores the prior guidance. No deployment or data migration is involved.

Risks and residual uncertainty

The CLI does not enforce redaction or restrictive file permissions; the new guidance requires operators to handle those controls. Human review of this exact head commit and hosted CI are pending, so this PR remains draft.

@sodejm
sodejm marked this pull request as ready for review October 11, 2026 15:50
@sodejm
sodejm merged commit 6b4196b into main Oct 11, 2026
18 checks passed
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 11, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-11T15:54:00.508854Z e38a13e Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e38a13e7e4

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

```bash
python3 -m exposuretriage.cli triage --input path/to/triage-bundle.json
cd plugins/vulnerability-management/exposure-triage-workbench
python3 -m exposuretriage.cli validate --input fixtures/bundles/synthetic-enterprise/bundle.json

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Stop presenting the parser check as schema validation

When redaction accidentally removes a required collection or leaves another schema violation, this newly recommended validate command still reports success: ingest_triage_bundle() defaults missing advisories, assets, components, and reachability to empty lists and never evaluates triage-input.schema.json. A bundle containing only the schema version, bundle ID, and timestamp therefore validates and produces a zero-item report, so the workflow does not ensure that identifier links remain valid or that the demonstration is meaningful. Either perform actual schema/referential validation or explicitly document this command's narrower checks and direct analysts to a real validation gate.

AGENTS.md reference: plugins/AGENTS.md:L9-L13

Useful? React with 👍 / 👎.


### 2. Triage an Evidence Bundle via CLI

Before using real exports or sharing reports, follow the input access and private-evidence guidance in the [analyst playbook](docs/PLAYBOOK.md).

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Put the privacy safeguards in the installed skill workflow

When users invoke the installed Codex plugin, .codex-plugin/plugin.json loads ./skills/ directly, and skills/exposure-triage/SKILL.md tells the agent to triage a real bundle to stdout or triage-report.json without mentioning authorization, restricted storage, log exposure, redaction, or file permissions. Those users need not traverse this README link, so the principal agent-facing workflow can still expose the private asset, owner, path, and reachability data this change is intended to protect; add the safeguards or a mandatory playbook reference before the skill's execution commands.

AGENTS.md reference: AGENTS.md:L110-L114

Useful? React with 👍 / 👎.

1. **Confirm Access and Protect Evidence**:
Obtain authorized, read-only access to the scoped advisory, asset inventory, component/SBOM, and reachability exports, plus local read access to the assembled JSON bundle. The offline triage command does not need cloud administrator, network probe, or source-system write permissions. Exporting the source data may require separate permissions; follow the source system's approval process. If writing a report, use an approved directory where you have write access.

Treat both the bundle and its reports as private evidence. They can contain asset and subscription IDs, display names, owners, software paths, tags, and free-text reachability evidence. Keep them in an approved, access-restricted workspace and follow the engagement's retention rules. The CLI does not redact fields or set restrictive file permissions; set a restrictive shell `umask` (for example, `umask 077`) before creating reports. Without `--output`, the report goes to standard output and may be captured in terminal transcripts or CI logs.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Secure reused output files instead of relying on umask

When an analyst reruns triage using an existing report path, umask 077 provides no protection because Path.write_text() truncates the existing inode without changing its mode; an existing 0644 report remains 0644 after following this guidance. Reusing an output filename is normal for iterative triage, so private evidence can remain readable beyond the intended audience despite the documented precaution; require a new destination or instruct operators to set and verify the output mode explicitly.

AGENTS.md reference: AGENTS.md:L101-L108

Useful? React with 👍 / 👎.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant