# Invited team member can disclosure slack channels

Low-privileged invited team member could query GraphQL slack_pipelines to read private Slack channel names they were never invited to.

- Payout: $500
- Severity: low
- Program: HackerOne
- Credited: eremeev
- Disclosed: 2019-04-05
- Write-up quality: 6/10
- Original: https://hackerone.com/reports/509574
- Library page: https://bugbountylibrary.com/r/h1%3A509574
- Tags: domain:api domain:web impact:data-leak kind:bounty platform:hackerone sev:low tech:graphql technique:source-review vuln:access-control vuln:info-disclosure

**Target:** HackerOne GraphQL API (teams/slack_pipelines/slack_integration.channels)
**Root cause:** GraphQL resolver for slack_integration.channels did not enforce Slack channel membership/permission checks, exposing private channel names to any team member regardless of role.
**Steps:**
1. As team admin, create Slack integration and a private channel (e.g. `h1test`).
2. Invite a new HackerOne team member with no permissions and not invited to the Slack team.
3. Log in as the invited user and send GraphQL query: `query{teams(where:{handle:{_eq:"<team>"}}){edges{node{slack_pipelines{nodes{id descriptive_label team{handle slack_integration{channels{name}}}}}}}}}`
4. Observe private channel names returned that the user cannot see in Slack.
**How found:** Researcher noticed Slack UI hides private channels from non-members, then hypothesized the GraphQL backend might not enforce the same check and queried slack_integration.channels directly.
**Exploitation:** Authenticated low-privileged team member issues a single GraphQL query against the team handle to enumerate private Slack channel names via the slack_integration.channels resolver.
**Insight:** When a UI hides objects based on membership, test the backing GraphQL resolver directly—nested relationship fields (integration.channels) often skip the authorization applied at the top-level UI.
