Skip to content

Extension headers are stored in plaintext in config file #5567

@dianed-square

Description

@dianed-square

Describe the bug

Headers for streamable_http extensions are stored in plaintext in the config.yaml file instead of being securely stored, e.g. in the system keychain. Some headers contain sensitive credentials (e.g., Personal Access Tokens, API keys).

To Reproduce
Steps to reproduce the behavior:

  1. Install a third-party extension (e.g., GitHub MCP extension) with authentication headers
  2. Add an Authorization header with a PAT: Authorization: Bearer github_pat_xxxxx
  3. Save the extension configuration
  4. Open ~/.config/goose/config.yaml
  5. Observe the PAT is stored in plaintext

Expected behavior

Header values should be stored securely, similar to how environment variables are handled.

Screenshots

Example from config.yaml showing plaintext token:

extensions:
  github:
    headers:
      Authorization: Bearer github_pat_11ARRU44Y0Cf5xSzEaM83L_[REDACTED]

**Please provide following information:**
 - **OS & Arch:** macOS
 - **Interface:** UI
 - **Version:** v1.12.1
 - **Extensions enabled:** Developer. Todo, Extension Manager, GitHub
 - **Provider & Model:** n/a

**Additional context**

Could address issue #4307's security concerns by using automatic keychain storage

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions