Slack offers a wide variety of permission scopes to developers who’re developing Slack apps. This reference will help developers and security professionals understand how different scopes introduce risk, potential vulnerability and other abuse cases into an organization’s environment. Remember! Apps should only request the minimal permissions and methods needed to perform the function(s) of the app.

Note: This list is not exhaustive in terms of the scopes I’ve provided analysis for. I will continue to update this as time goes by. It’s also very likely that I miss potential risks or maybe attribute risk to a scope that might not really be there. This is a best-effort by me though! If there’s something I’ve gotten wrong, or something you know that I don’t, I would love to hear from ya!

Risk Level

Low

These are scopes that have virtually no meaningful risk.

  • app_mentions:read
  • assistant:write
  • bookmarks:read
  • bot
  • calls:read
  • channels:manage
  • channels:read
  • channels:write - ⚠️ Allows conversations.externalInvitePermissions.set API method which may have an abuse vector by which nefarious external accounts can be added to a public channel with permissions to post, add files, etc…
  • chat:write
  • chat:write:bot
  • chat:write.customize - ⚠️ Could be used to impersonate other accounts by mimicing username and avatar of a trusted user.
  • commands - ℹ: adds shortcuts or slash commands.
  • dnd:read
  • dnd:write
  • email
  • emoji:read
  • groups:read
  • groups:write - ⚠️ Allows conversations.externalInvitePermissions.set API method which may have an abuse vector by which nefarious external accounts can be added to a private channel with permissions to post, add files, etc…
  • identify - A legacy scope which should not be used.
  • im:history - ℹ: Can read message history sent between a user and the bot itself.
  • im:read
  • im:write
  • mpim:read
  • mpim:write
  • openid - Can get email and other information from users who explicitly log in via Sign-in-with-Slack.
  • pins:read
  • pins:write
  • profile
  • reactions:read
  • reactions:write
  • team:read
  • usergroups:read
  • usergroups:write
  • users:read
  • users:write - ⚠️ Could potentially allow a bot to add users to sensitive user groups.
  • workflow.steps:execute - ⚠️ Allows the ability to update configuration for a workflow step. This method is now deprecated and shouldn’t be used.

Medium

These scopes represent some material risk, and should probably be reviewed.

  • bookmarks:write - Would allow a bot to change bookmark links to something potentially malicious.
  • channels:join - Allows bot to join any and all public channels in a workspace. This is a vector for potential mass-spam and surveillance. (Granted they also have write access, e.g. chat:write)
  • chat:write.public - Allows bot to send messages to channels it is not a member of. An obvious medium for phishing.
  • chat:write:user - Allows a bot to send messages on a user’s behalf. This could facilitate impersonation and convincing phishing attacks.
  • files:read - Allows a bot to download files uploaded to workspaces.
  • incoming-webhook - There are known phishing-related weaknesses associated with this scope.
  • links:read - Allows a bot to view URLs in messages. URLs often contain sensitive information (e.g. credentials, IPs, secrets, domain names, etc…). So the bot could harvest this information.
  • links:write - Provides access to chat.unfurl API method. Unfurling has inherent dangers.
  • mpim:history - Allows bot to see message history of a group direct message. Sensitive information is often shared in private group threads, so be cautious when allowing this scope for bots added to groups.
  • usergroups:write - Could allow a bot to add unauthorized users to groups.
  • users.profile:read - Can be used to harvest profile details from all users in a workspace (e.g. first/last names, start date, status, titles, phone numbers, etc…)
  • users.profile:write - IF the bot holds an elevated token, this scope can be used to change profile information for other users in a workspace. Use caution in how apps with this scope are configured to ensure they don’t have god-level profile-changing powers.
  • users:read.email - Allows a bot to harvest user emails from across a workspace.

High

These are the riskiest of scopes, and almost always necessitate a security review.

  • calls:write - Allows a bot to start a call and add participants. Notably, this seems like a way to maybe harvest audio from unwitting users. It could also be abused in a way that could cause system degradation (i.e. a lot of calls are being initiated and recordings saved)
  • channels:history - View messages and other content in public channels that your slack app has been added to. The potential to harvest and exfil sensitive data included in said channel.
  • files:write - Allows an app to add and edit files. This can be abused to cause overall system degradation (i.e. uploading a bunch of large files). It could also be used to compromise integrity of files.
  • groups:history - View messages and other content in private channels that your slack app has been added to. The potential to harvest and exfil sensitive data included in said private group.
  • admin.* - Any Slack app that has an admin-related scope should probably be reviewed with a high level of potential risk.

Resources