T05 · Unauthorized Access and Privilege Escalation
- Location
scripts/linear_json.sh:54- Finding
Linear Adapter Exceeds the Assigned-to-Me Data Access Boundary
- Content
View full analysis
" >&2 exit 1 fi # Note: Linear's GraphQL supports querying team by ID. gql "{ team(id: \"$team_id\") { issues(first: 250, filter: { state: { type: { nin: [\\\"completed\\\", \\\"canceled\\\"] } } }) { nodes { id title url updatedAt state { id name type } } } } }" \ | jq -c '{data:{issues:{nodes:(.data.team.issues.nodes // [])}}}' ;; issues-project) project_id="${1:-}" if [[ -z "$project_id" ]]; then echo "Usage: linear_json.sh issues-project " >&2 exit 1 fi gql "{ project(id: \"$project_id\") { issues(first: 250, filter: { state: { type: { nin: [\\\"completed\\\", \\\"canceled\\\"] } } }) { nodes { id title url updatedAt state { id name type } } } } }" \ | jq -c '{data:{issues:{nodes:(.data.project.issues.nodes // [])}}}' ;; ``` ### Technical Analysis The declared workflow boundary requires `next` and `autopilot-tick` to consider only work items assigned to the authenticated user. However, both Linear GraphQL queries filter exclusively on workflow state. They request up to 250 non-completed and non-canceled issues across the configured team or project without an assignee constraint. Consequently, `LinearAdapter.fetchSnapshot()` can receive issue metadata belonging to other users, including issue identifiers, titles, URLs, update timestamps, and workflow states. Calls such as setup validation, backlog selection, and autopilot processing invoke this snapshot logic. The authorization token is sent only to Linear's official HTTPS API, which is necessary for the integration. The vulnerability is therefore not credential exfiltration; it is a failure to enforce the narrower, docu ...[truncated 1655 chars]- Remediation
View remediation
