Skip to content

Commit c574de2

Browse files
Merge branch 'main' into fix/socket-mode-current-session-runner-leak
2 parents 86e003b + e513558 commit c574de2

37 files changed

Lines changed: 1487 additions & 182 deletions

.github/SECURITY.md

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# Security Policy
2+
3+
Slack takes the security of its software and services seriously, including all open-source repositories managed through the [slackapi](https://github.com/slackapi) GitHub organization.
4+
5+
## Reporting a Vulnerability
6+
7+
**Do NOT report security vulnerabilities through public GitHub issues, pull requests, or discussions.**
8+
9+
If you believe you have found a security vulnerability in `slack_sdk`, please report it through the Slack bug bounty program on HackerOne:
10+
11+
**<https://hackerone.com/slack>**
12+
13+
Even if `slack_sdk` is not explicitly listed as an in-scope asset on the HackerOne program page, reports for vulnerabilities in this package should still be submitted there. The Slack security team triages reports for all `slackapi` open-source repositories through this program.
14+
15+
If HackerOne is inaccessible, you may alternatively report the issue to [security@salesforce.com](mailto:security@salesforce.com).
16+
17+
Please do not discuss potential vulnerabilities in public without first coordinating with the security team.
18+
19+
## What to Include
20+
21+
To help us triage and respond quickly, please include:
22+
23+
- Type of vulnerability (e.g., signature bypass, token leakage, denial of service)
24+
- Affected version(s) of `slack_sdk`
25+
- Step-by-step reproduction instructions
26+
- Proof-of-concept code or payloads, if available
27+
- Impact assessment: what an attacker could achieve
28+
- Any specific configuration required to trigger the vulnerability
29+
- Affected source file paths, if known
30+
31+
## Threat Model
32+
33+
The Python Slack SDK is a collection of client libraries for interacting with Slack's APIs. It provides utilities for request signature verification, OAuth token management and storage, and real-time WebSocket communication via Socket Mode. The security boundary covers the safe handling of credentials, the integrity of cryptographic verification, and the confidentiality of data in transit and at rest.
34+
35+
### In Scope
36+
37+
The following are considered SDK vulnerabilities:
38+
39+
- Bypass of request signature verification (HMAC-SHA256 validation in `slack_sdk.signature`)
40+
- Token or credential leakage through logs, error messages, HTTP headers, or unintended network requests
41+
- OAuth state parameter validation bypass or CSRF vulnerabilities in the authorization flow (`slack_sdk.oauth`)
42+
- Cross-tenant token exposure or installation data leakage in built-in installation stores
43+
- Token storage vulnerabilities in any built-in installation store or state store backend
44+
- Failure to enforce TLS for connections to Slack's APIs (Web API, WebSocket, or webhook endpoints)
45+
- WebSocket connection hijacking or man-in-the-middle vulnerabilities in Socket Mode clients
46+
- Denial of service caused by malformed API responses or WebSocket frames that crash or hang the client
47+
- Information disclosure through SDK error responses or timing side channels
48+
- Insecure default configurations that could lead to credential exposure
49+
50+
### Out of Scope
51+
52+
The following are NOT SDK vulnerabilities:
53+
54+
- Vulnerabilities in the Python runtime, operating system, or hosting infrastructure
55+
- Security issues in Slack's server-side platform infrastructure (report those directly under Slack's main HackerOne scope)
56+
- Vulnerabilities in third-party PyPI packages chosen and installed by the developer outside of this SDK's direct dependencies (e.g., aiohttp, websockets, SQLAlchemy, boto3)
57+
- Security issues in developer application logic built on top of the SDK (e.g., storing tokens insecurely in application code)
58+
- Attacks that require possession of valid tokens or signing secrets (the SDK assumes credentials provided to it are confidential)
59+
- Rate limiting or resource exhaustion on Slack's servers caused by legitimate API usage
60+
- Issues that only affect end-of-life Python versions with no reproduction on supported versions
61+
- Security of custom API base URLs configured by the developer for testing or proxying
62+
63+
## Disclosure Policy
64+
65+
This project follows coordinated disclosure:
66+
67+
- Allow a reasonable timeframe for the team to investigate, develop, and release a fix before any public disclosure.
68+
- Researchers who follow responsible disclosure practices are eligible for recognition and bounty consideration through the Slack HackerOne program.

docs/reference/index.html

Lines changed: 73 additions & 11 deletions
Large diffs are not rendered by default.

docs/reference/models/blocks/basic_components.html

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ <h3>Class variables</h3>
188188
<h3>Static methods</h3>
189189
<dl>
190190
<dt id="slack_sdk.models.blocks.basic_components.ConfirmObject.parse"><code class="name flex">
191-
<span>def <span class="ident">parse</span></span>(<span>confirm: <a title="slack_sdk.models.blocks.basic_components.ConfirmObject" href="#slack_sdk.models.blocks.basic_components.ConfirmObject">ConfirmObject</a> | Dict[str, Any])</span>
191+
<span>def <span class="ident">parse</span></span>(<span>confirm: ForwardRef('<a title="slack_sdk.models.blocks.basic_components.ConfirmObject" href="#slack_sdk.models.blocks.basic_components.ConfirmObject">ConfirmObject</a>') | Dict[str, Any])</span>
192192
</code></dt>
193193
<dd>
194194
<div class="desc"></div>
@@ -324,7 +324,7 @@ <h3>Class variables</h3>
324324
<h3>Static methods</h3>
325325
<dl>
326326
<dt id="slack_sdk.models.blocks.basic_components.DispatchActionConfig.parse"><code class="name flex">
327-
<span>def <span class="ident">parse</span></span>(<span>config: <a title="slack_sdk.models.blocks.basic_components.DispatchActionConfig" href="#slack_sdk.models.blocks.basic_components.DispatchActionConfig">DispatchActionConfig</a> | Dict[str, Any])</span>
327+
<span>def <span class="ident">parse</span></span>(<span>config: ForwardRef('<a title="slack_sdk.models.blocks.basic_components.DispatchActionConfig" href="#slack_sdk.models.blocks.basic_components.DispatchActionConfig">DispatchActionConfig</a>') | Dict[str, Any])</span>
328328
</code></dt>
329329
<dd>
330330
<div class="desc"></div>
@@ -446,7 +446,7 @@ <h3>Class variables</h3>
446446
<h3>Static methods</h3>
447447
<dl>
448448
<dt id="slack_sdk.models.blocks.basic_components.FeedbackButtonObject.parse"><code class="name flex">
449-
<span>def <span class="ident">parse</span></span>(<span>feedback_button: <a title="slack_sdk.models.blocks.basic_components.FeedbackButtonObject" href="#slack_sdk.models.blocks.basic_components.FeedbackButtonObject">FeedbackButtonObject</a> | Dict[str, Any])</span>
449+
<span>def <span class="ident">parse</span></span>(<span>feedback_button: ForwardRef('<a title="slack_sdk.models.blocks.basic_components.FeedbackButtonObject" href="#slack_sdk.models.blocks.basic_components.FeedbackButtonObject">FeedbackButtonObject</a>') | Dict[str, Any])</span>
450450
</code></dt>
451451
<dd>
452452
<div class="desc"></div>
@@ -907,7 +907,7 @@ <h3>Static methods</h3>
907907
<div class="desc"><p>Creates a simple Option instance with the same value and label</p></div>
908908
</dd>
909909
<dt id="slack_sdk.models.blocks.basic_components.Option.parse_all"><code class="name flex">
910-
<span>def <span class="ident">parse_all</span></span>(<span>options: Sequence[Dict[str, Any] | <a title="slack_sdk.models.blocks.basic_components.Option" href="#slack_sdk.models.blocks.basic_components.Option">Option</a>] | None) ‑> List[<a title="slack_sdk.models.blocks.basic_components.Option" href="#slack_sdk.models.blocks.basic_components.Option">Option</a>] | None</span>
910+
<span>def <span class="ident">parse_all</span></span>(<span>options: Sequence[Dict[str, Any] | ForwardRef('<a title="slack_sdk.models.blocks.basic_components.Option" href="#slack_sdk.models.blocks.basic_components.Option">Option</a>')] | None) ‑> List[<a title="slack_sdk.models.blocks.basic_components.Option" href="#slack_sdk.models.blocks.basic_components.Option">Option</a>] | None</span>
911911
</code></dt>
912912
<dd>
913913
<div class="desc"></div>
@@ -1105,7 +1105,7 @@ <h3>Class variables</h3>
11051105
<h3>Static methods</h3>
11061106
<dl>
11071107
<dt id="slack_sdk.models.blocks.basic_components.OptionGroup.parse_all"><code class="name flex">
1108-
<span>def <span class="ident">parse_all</span></span>(<span>option_groups: Sequence[Dict[str, Any] | <a title="slack_sdk.models.blocks.basic_components.OptionGroup" href="#slack_sdk.models.blocks.basic_components.OptionGroup">OptionGroup</a>] | None) ‑> List[<a title="slack_sdk.models.blocks.basic_components.OptionGroup" href="#slack_sdk.models.blocks.basic_components.OptionGroup">OptionGroup</a>] | None</span>
1108+
<span>def <span class="ident">parse_all</span></span>(<span>option_groups: Sequence[Dict[str, Any] | ForwardRef('<a title="slack_sdk.models.blocks.basic_components.OptionGroup" href="#slack_sdk.models.blocks.basic_components.OptionGroup">OptionGroup</a>')] | None) ‑> List[<a title="slack_sdk.models.blocks.basic_components.OptionGroup" href="#slack_sdk.models.blocks.basic_components.OptionGroup">OptionGroup</a>] | None</span>
11091109
</code></dt>
11101110
<dd>
11111111
<div class="desc"></div>
@@ -1536,7 +1536,7 @@ <h3>Class variables</h3>
15361536
<h3>Static methods</h3>
15371537
<dl>
15381538
<dt id="slack_sdk.models.blocks.basic_components.TextObject.parse"><code class="name flex">
1539-
<span>def <span class="ident">parse</span></span>(<span>text: str | Dict[str, Any] | <a title="slack_sdk.models.blocks.basic_components.TextObject" href="#slack_sdk.models.blocks.basic_components.TextObject">TextObject</a>,<br>default_type: str = 'mrkdwn') ‑> <a title="slack_sdk.models.blocks.basic_components.TextObject" href="#slack_sdk.models.blocks.basic_components.TextObject">TextObject</a> | None</span>
1539+
<span>def <span class="ident">parse</span></span>(<span>text: str | Dict[str, Any] | ForwardRef('<a title="slack_sdk.models.blocks.basic_components.TextObject" href="#slack_sdk.models.blocks.basic_components.TextObject">TextObject</a>'),<br>default_type: str = 'mrkdwn') ‑> <a title="slack_sdk.models.blocks.basic_components.TextObject" href="#slack_sdk.models.blocks.basic_components.TextObject">TextObject</a> | None</span>
15401540
</code></dt>
15411541
<dd>
15421542
<div class="desc"></div>

docs/reference/models/blocks/block_elements.html

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -146,13 +146,13 @@ <h3>Class variables</h3>
146146
<h3>Static methods</h3>
147147
<dl>
148148
<dt id="slack_sdk.models.blocks.block_elements.BlockElement.parse"><code class="name flex">
149-
<span>def <span class="ident">parse</span></span>(<span>block_element: dict | <a title="slack_sdk.models.blocks.block_elements.BlockElement" href="#slack_sdk.models.blocks.block_elements.BlockElement">BlockElement</a>) ‑> <a title="slack_sdk.models.blocks.block_elements.BlockElement" href="#slack_sdk.models.blocks.block_elements.BlockElement">BlockElement</a> | <a title="slack_sdk.models.blocks.basic_components.TextObject" href="basic_components.html#slack_sdk.models.blocks.basic_components.TextObject">TextObject</a> | None</span>
149+
<span>def <span class="ident">parse</span></span>(<span>block_element: dict | ForwardRef('<a title="slack_sdk.models.blocks.block_elements.BlockElement" href="#slack_sdk.models.blocks.block_elements.BlockElement">BlockElement</a>')) ‑> <a title="slack_sdk.models.blocks.block_elements.BlockElement" href="#slack_sdk.models.blocks.block_elements.BlockElement">BlockElement</a> | <a title="slack_sdk.models.blocks.basic_components.TextObject" href="basic_components.html#slack_sdk.models.blocks.basic_components.TextObject">TextObject</a> | None</span>
150150
</code></dt>
151151
<dd>
152152
<div class="desc"></div>
153153
</dd>
154154
<dt id="slack_sdk.models.blocks.block_elements.BlockElement.parse_all"><code class="name flex">
155-
<span>def <span class="ident">parse_all</span></span>(<span>block_elements: Sequence[dict | <a title="slack_sdk.models.blocks.block_elements.BlockElement" href="#slack_sdk.models.blocks.block_elements.BlockElement">BlockElement</a> | <a title="slack_sdk.models.blocks.basic_components.TextObject" href="basic_components.html#slack_sdk.models.blocks.basic_components.TextObject">TextObject</a>]) ‑> List[<a title="slack_sdk.models.blocks.block_elements.BlockElement" href="#slack_sdk.models.blocks.block_elements.BlockElement">BlockElement</a> | <a title="slack_sdk.models.blocks.basic_components.TextObject" href="basic_components.html#slack_sdk.models.blocks.basic_components.TextObject">TextObject</a>]</span>
155+
<span>def <span class="ident">parse_all</span></span>(<span>block_elements: Sequence[dict | ForwardRef('<a title="slack_sdk.models.blocks.block_elements.BlockElement" href="#slack_sdk.models.blocks.block_elements.BlockElement">BlockElement</a>') | <a title="slack_sdk.models.blocks.basic_components.TextObject" href="basic_components.html#slack_sdk.models.blocks.basic_components.TextObject">TextObject</a>]) ‑> List[<a title="slack_sdk.models.blocks.block_elements.BlockElement" href="#slack_sdk.models.blocks.block_elements.BlockElement">BlockElement</a> | <a title="slack_sdk.models.blocks.basic_components.TextObject" href="basic_components.html#slack_sdk.models.blocks.basic_components.TextObject">TextObject</a>]</span>
156156
</code></dt>
157157
<dd>
158158
<div class="desc"></div>
@@ -829,7 +829,7 @@ <h3>Class variables</h3>
829829
<h3>Static methods</h3>
830830
<dl>
831831
<dt id="slack_sdk.models.blocks.block_elements.ConversationFilter.parse"><code class="name flex">
832-
<span>def <span class="ident">parse</span></span>(<span>filter: dict | <a title="slack_sdk.models.blocks.block_elements.ConversationFilter" href="#slack_sdk.models.blocks.block_elements.ConversationFilter">ConversationFilter</a>)</span>
832+
<span>def <span class="ident">parse</span></span>(<span>filter: dict | ForwardRef('<a title="slack_sdk.models.blocks.block_elements.ConversationFilter" href="#slack_sdk.models.blocks.block_elements.ConversationFilter">ConversationFilter</a>'))</span>
833833
</code></dt>
834834
<dd>
835835
<div class="desc"></div>
@@ -3392,7 +3392,7 @@ <h3>Inherited members</h3>
33923392

33933393
@property
33943394
def attributes(self) -&gt; Set[str]: # type: ignore[override]
3395-
return super().attributes.union({&#34;timestamp&#34;, &#34;format&#34;, &#34;url&#34;, &#34;fallback&#34;})
3395+
return super().attributes.union({&#34;timestamp&#34;, &#34;format&#34;, &#34;url&#34;, &#34;fallback&#34;, &#34;style&#34;})
33963396

33973397
def __init__(
33983398
self,
@@ -3401,6 +3401,7 @@ <h3>Inherited members</h3>
34013401
format: str,
34023402
url: Optional[str] = None,
34033403
fallback: Optional[str] = None,
3404+
style: Optional[Union[dict, &#34;RichTextElementParts.TextStyle&#34;]] = None,
34043405
**others: dict,
34053406
):
34063407
super().__init__(type=self.type)
@@ -3409,40 +3410,45 @@ <h3>Inherited members</h3>
34093410
self.format = format
34103411
self.url = url
34113412
self.fallback = fallback
3413+
self.style = style
34123414

34133415
class Broadcast(RichTextElement):
34143416
type = &#34;broadcast&#34;
34153417

34163418
@property
34173419
def attributes(self) -&gt; Set[str]: # type: ignore[override]
3418-
return super().attributes.union({&#34;range&#34;})
3420+
return super().attributes.union({&#34;range&#34;, &#34;style&#34;})
34193421

34203422
def __init__(
34213423
self,
34223424
*,
34233425
range: str, # channel, here, ..
3426+
style: Optional[Union[dict, &#34;RichTextElementParts.TextStyle&#34;]] = None,
34243427
**others: dict,
34253428
):
34263429
super().__init__(type=self.type)
34273430
show_unknown_key_warning(self, others)
34283431
self.range = range
3432+
self.style = style
34293433

34303434
class Color(RichTextElement):
34313435
type = &#34;color&#34;
34323436

34333437
@property
34343438
def attributes(self) -&gt; Set[str]: # type: ignore[override]
3435-
return super().attributes.union({&#34;value&#34;})
3439+
return super().attributes.union({&#34;value&#34;, &#34;style&#34;})
34363440

34373441
def __init__(
34383442
self,
34393443
*,
34403444
value: str,
3445+
style: Optional[Union[dict, &#34;RichTextElementParts.TextStyle&#34;]] = None,
34413446
**others: dict,
34423447
):
34433448
super().__init__(type=self.type)
34443449
show_unknown_key_warning(self, others)
3445-
self.value = value</code></pre>
3450+
self.value = value
3451+
self.style = style</code></pre>
34463452
</details>
34473453
<div class="desc"></div>
34483454
<h3>Class variables</h3>
@@ -3505,7 +3511,7 @@ <h3>Class variables</h3>
35053511
</dd>
35063512
<dt id="slack_sdk.models.blocks.block_elements.RichTextInputElement"><code class="flex name class">
35073513
<span>class <span class="ident">RichTextInputElement</span></span>
3508-
<span>(</span><span>*,<br>action_id: str | None = None,<br>placeholder: str | dict | <a title="slack_sdk.models.blocks.basic_components.TextObject" href="basic_components.html#slack_sdk.models.blocks.basic_components.TextObject">TextObject</a> | None = None,<br>initial_value: Dict[str, Any] | RichTextBlock | None = None,<br>dispatch_action_config: dict | <a title="slack_sdk.models.blocks.basic_components.DispatchActionConfig" href="basic_components.html#slack_sdk.models.blocks.basic_components.DispatchActionConfig">DispatchActionConfig</a> | None = None,<br>focus_on_load: bool | None = None,<br>**others: dict)</span>
3514+
<span>(</span><span>*,<br>action_id: str | None = None,<br>placeholder: str | dict | <a title="slack_sdk.models.blocks.basic_components.TextObject" href="basic_components.html#slack_sdk.models.blocks.basic_components.TextObject">TextObject</a> | None = None,<br>initial_value: Dict[str, Any] | ForwardRef('RichTextBlock') | None = None,<br>dispatch_action_config: dict | <a title="slack_sdk.models.blocks.basic_components.DispatchActionConfig" href="basic_components.html#slack_sdk.models.blocks.basic_components.DispatchActionConfig">DispatchActionConfig</a> | None = None,<br>focus_on_load: bool | None = None,<br>**others: dict)</span>
35093515
</code></dt>
35103516
<dd>
35113517
<details class="source">

0 commit comments

Comments
 (0)