Skip to content

Commit f15232f

Browse files
1 parent de1fca2 commit f15232f

2 files changed

Lines changed: 159 additions & 0 deletions

File tree

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
{
2+
"schema_version": "1.4.0",
3+
"id": "GHSA-8c4j-f57c-35cf",
4+
"modified": "2026-03-27T19:36:23Z",
5+
"published": "2026-03-27T19:36:23Z",
6+
"aliases": [
7+
"CVE-2026-34046"
8+
],
9+
"summary": "Langflow: Authenticated Users Can Read, Modify, and Delete Any Flow via Missing Ownership Check",
10+
"details": "## Vulnerability\n\n### IDOR in `GET/PATCH/DELETE /api/v1/flow/{flow_id}`\n\nThe `_read_flow` helper in `src/backend/base/langflow/api/v1/flows.py` branched on the `AUTO_LOGIN` setting to decide whether to filter by `user_id`. When `AUTO_LOGIN` was `False` (i.e., authentication was enabled), neither branch enforced an ownership check — the query returned any flow matching the given UUID regardless of who owned it.\n\nThis exposed any authenticated user to:\n\n- **Read** any other user's flow, including embedded plaintext API keys\n- **Modify** the logic of another user's AI agents\n- **Delete** flows belonging to other users\n\nThe vulnerability was introduced by the conditional logic that was meant to accommodate public/example flows (those with `user_id = NULL`) under auto-login mode, but inadvertently left the authenticated path without an ownership filter.\n\n---\n\n## Fix (PR #8956)\n\nThe fix removes the `AUTO_LOGIN` conditional entirely and unconditionally scopes the query to the requesting user:\n\n```diff\n- auth_settings = settings_service.auth_settings\n- stmt = select(Flow).where(Flow.id == flow_id)\n- if auth_settings.AUTO_LOGIN:\n- stmt = stmt.where(\n- (Flow.user_id == user_id) | (Flow.user_id == None) # noqa: E711\n- )\n+ stmt = select(Flow).where(Flow.id == flow_id).where(Flow.user_id == user_id)\n```\n\nAll three operations — read, update, and delete — route through `_read_flow`, so the single change covers the full attack surface. A cross-user isolation test (`test_read_flows_user_isolation`) was added to prevent regression.\n\n---\n\n## Acknowledgements\n\nLangflow thanks the security researcher who responsibly disclosed this vulnerability:\n\n- **[@chximn-dt](https://github.com/chximn-dt)**",
11+
"severity": [
12+
{
13+
"type": "CVSS_V4",
14+
"score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N"
15+
}
16+
],
17+
"affected": [
18+
{
19+
"package": {
20+
"ecosystem": "PyPI",
21+
"name": "langflow"
22+
},
23+
"ranges": [
24+
{
25+
"type": "ECOSYSTEM",
26+
"events": [
27+
{
28+
"introduced": "0"
29+
},
30+
{
31+
"fixed": "1.5.1"
32+
}
33+
]
34+
}
35+
],
36+
"database_specific": {
37+
"last_known_affected_version_range": "<= 1.5.0"
38+
}
39+
},
40+
{
41+
"package": {
42+
"ecosystem": "PyPI",
43+
"name": "langflow-base"
44+
},
45+
"ranges": [
46+
{
47+
"type": "ECOSYSTEM",
48+
"events": [
49+
{
50+
"introduced": "0"
51+
},
52+
{
53+
"fixed": "0.5.1"
54+
}
55+
]
56+
}
57+
],
58+
"database_specific": {
59+
"last_known_affected_version_range": "<= 0.5.0"
60+
}
61+
}
62+
],
63+
"references": [
64+
{
65+
"type": "WEB",
66+
"url": "https://github.com/langflow-ai/langflow/security/advisories/GHSA-8c4j-f57c-35cf"
67+
},
68+
{
69+
"type": "WEB",
70+
"url": "https://github.com/langflow-ai/langflow/pull/8956"
71+
},
72+
{
73+
"type": "PACKAGE",
74+
"url": "https://github.com/langflow-ai/langflow"
75+
}
76+
],
77+
"database_specific": {
78+
"cwe_ids": [
79+
"CWE-639",
80+
"CWE-862"
81+
],
82+
"severity": "HIGH",
83+
"github_reviewed": true,
84+
"github_reviewed_at": "2026-03-27T19:36:23Z",
85+
"nvd_published_at": null
86+
}
87+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
{
2+
"schema_version": "1.4.0",
3+
"id": "GHSA-x34h-54cw-9825",
4+
"modified": "2026-03-27T19:35:16Z",
5+
"published": "2026-03-27T19:35:16Z",
6+
"aliases": [
7+
"CVE-2026-34042"
8+
],
9+
"summary": "act: actions/cache server allows malicious cache injection",
10+
"details": "act's built-in actions/cache server listens to connections on all interfaces and allows anyone who can connect to it — including someone anywhere on the internet — to create caches with arbitrary keys and retrieve all existing caches. If one can predict which cache keys will be used by local actions, one can create malicious caches containing whatever files one pleases, most likely allowing arbitrary remote code execution within the Docker container.\n\n## Discovery\n\nDiscovered while discussing [forgejo/runner#294](https://code.forgejo.org/forgejo/runner/issues/294).\n\n## Proposed Mitigation\n\nIt was discussed to append a secret to `ACTIONS_CACHE_URL` to retain compatibility with GitHub's cache action and still allow authorization. Forgejo is considering also encoding which repo is currently being run in CI into the secret in the URL to prevent unrelated repos using the same (probably global) runner from seeing each other's caches.",
11+
"severity": [
12+
{
13+
"type": "CVSS_V3",
14+
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:L/A:N"
15+
}
16+
],
17+
"affected": [
18+
{
19+
"package": {
20+
"ecosystem": "Go",
21+
"name": "github.com/nektos/act"
22+
},
23+
"ranges": [
24+
{
25+
"type": "ECOSYSTEM",
26+
"events": [
27+
{
28+
"introduced": "0"
29+
},
30+
{
31+
"fixed": "0.2.86"
32+
}
33+
]
34+
}
35+
],
36+
"database_specific": {
37+
"last_known_affected_version_range": "<= 0.2.85"
38+
}
39+
}
40+
],
41+
"references": [
42+
{
43+
"type": "WEB",
44+
"url": "https://github.com/nektos/act/security/advisories/GHSA-x34h-54cw-9825"
45+
},
46+
{
47+
"type": "WEB",
48+
"url": "https://github.com/nektos/act/commit/c28c27e141e8b54f9853de82f421ee09846751f7"
49+
},
50+
{
51+
"type": "WEB",
52+
"url": "https://code.forgejo.org/forgejo/runner/issues/294"
53+
},
54+
{
55+
"type": "PACKAGE",
56+
"url": "https://github.com/nektos/act"
57+
},
58+
{
59+
"type": "WEB",
60+
"url": "https://github.com/nektos/act/releases/tag/v0.2.86"
61+
}
62+
],
63+
"database_specific": {
64+
"cwe_ids": [
65+
"CWE-862"
66+
],
67+
"severity": "HIGH",
68+
"github_reviewed": true,
69+
"github_reviewed_at": "2026-03-27T19:35:16Z",
70+
"nvd_published_at": null
71+
}
72+
}

0 commit comments

Comments
 (0)