Skip to content

Commit 2f1e33f

Browse files
1 parent 8b1322b commit 2f1e33f

File tree

2 files changed

+109
-4
lines changed

2 files changed

+109
-4
lines changed

advisories/unreviewed/2025/10/GHSA-29mf-w486-v3vc/GHSA-29mf-w486-v3vc.json renamed to advisories/github-reviewed/2025/10/GHSA-29mf-w486-v3vc/GHSA-29mf-w486-v3vc.json

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,72 @@
11
{
22
"schema_version": "1.4.0",
33
"id": "GHSA-29mf-w486-v3vc",
4-
"modified": "2025-10-10T21:31:15Z",
4+
"modified": "2025-10-13T13:34:11Z",
55
"published": "2025-10-10T21:31:15Z",
66
"aliases": [
77
"CVE-2025-60880"
88
],
9+
"summary": "Bagisto is vulnerable to XSS through Admin Panel's product creation path",
910
"details": "An authenticated stored XSS vulnerability exists in the Bagisto 2.3.6 admin panel's product creation path, allowing an attacker to upload a crafted SVG file containing malicious JavaScript code. This vulnerability can be exploited by an authenticated admin user to execute arbitrary JavaScript in the browser, potentially leading to session hijacking, data theft, or unauthorized actions.",
1011
"severity": [
1112
{
1213
"type": "CVSS_V3",
1314
"score": "CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:C/C:H/I:L/A:H"
1415
}
1516
],
16-
"affected": [],
17+
"affected": [
18+
{
19+
"package": {
20+
"ecosystem": "Packagist",
21+
"name": "bagisto/bagisto"
22+
},
23+
"ranges": [
24+
{
25+
"type": "ECOSYSTEM",
26+
"events": [
27+
{
28+
"introduced": "2.3.6"
29+
},
30+
{
31+
"fixed": "2.3.7"
32+
}
33+
]
34+
}
35+
],
36+
"versions": [
37+
"2.3.6"
38+
]
39+
}
40+
],
1741
"references": [
1842
{
1943
"type": "ADVISORY",
2044
"url": "https://nvd.nist.gov/vuln/detail/CVE-2025-60880"
2145
},
46+
{
47+
"type": "WEB",
48+
"url": "https://github.com/bagisto/bagisto/commit/9ec40c99c34a83f311ffbb7c1039a59ff9d655cc"
49+
},
2250
{
2351
"type": "WEB",
2452
"url": "https://github.com/Shenal01/CVE-2025-60880"
53+
},
54+
{
55+
"type": "PACKAGE",
56+
"url": "https://github.com/bagisto/bagisto"
57+
},
58+
{
59+
"type": "WEB",
60+
"url": "https://github.com/darylldoyle/svg-sanitizer/releases"
2561
}
2662
],
2763
"database_specific": {
2864
"cwe_ids": [
2965
"CWE-79"
3066
],
3167
"severity": "HIGH",
32-
"github_reviewed": false,
33-
"github_reviewed_at": null,
68+
"github_reviewed": true,
69+
"github_reviewed_at": "2025-10-13T13:34:11Z",
3470
"nvd_published_at": "2025-10-10T19:15:38Z"
3571
}
3672
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
{
2+
"schema_version": "1.4.0",
3+
"id": "GHSA-7r7f-9xpj-jmr7",
4+
"modified": "2025-10-13T13:33:22Z",
5+
"published": "2025-10-13T13:33:22Z",
6+
"aliases": [
7+
"CVE-2025-48043"
8+
],
9+
"summary": "Ash Framework: Filter authorization misapplies impossible bypass/runtime policies",
10+
"details": "### Summary\n\nWhen using **filter** authorization, two edge cases could cause the policy compiler/authorizer to generate a permissive filter:\n\n1. **Bypass policies whose condition can never pass at runtime** were compiled as\n `OR(AND(condition, compiled_policies), NOT(condition))`.\n If the condition could never be true at runtime, the `NOT(condition)` branch evaluated truthy and the overall expression became permissive.\n\n2. **Runtime policy scenarios that reduce to “no checks are applicable”** (an empty SAT scenario) were treated as an empty clause and dropped instead of being treated as **`false`**, which could again produce an overly broad (permissive) filter.\n\nThese bugs could allow reads to return records that should have been excluded by policy.\n\n### Impact\n\nProjects that rely on **filter-based authorization** and define:\n\n* `bypass ... do ... end` blocks whose condition(s) are only resolvable at runtime and can never pass in a given request context, **or**\n* runtime checks that simplify to an **empty** scenario for a clause\n\nmay unintentionally generate a permissive query filter, potentially returning unauthorized data.\n\n*Actions primarily affected:* reads guarded by filter policies. Non-filter (e.g., hard forbid) policies are not impacted.\n\n### Technical details\n\nThis patch corrects two behaviors:\n\n* **`Ash.Policy.Policy.compile_policy_expression/1`** now treats **bypass** blocks as\n `AND(condition_expression, compiled_policies)`\n instead of `OR(AND(...), NOT(condition_expression))`. This removes the permissive `NOT(condition)` escape hatch when a bypass condition never passes.\n\n* **`Ash.Policy.Authorizer`** now treats **empty SAT scenarios** (`scenario == %{}`) as **`false`**, ensuring impossible scenarios do not collapse into a no-op and inadvertently widen the filter. The reducer also normalizes `nil` → `false` consistently when building `auto_filter` fragments.\n\nRelevant changes are in:\n\n* `lib/ash/policy/policy.ex` (bypass compilation)\n* `lib/ash/policy/authorizer/authorizer.ex` (scenario handling / auto_filter normalization)\n* Tests added: `test/policy/filter_condition_test.exs` (`RuntimeFalsyCheck`, `RuntimeBypassResource`) validate the corrected behavior.\n\n### Workarounds\n\n* Avoid `bypass` policies whose conditions are only decidable at runtime and may be perpetually false in some contexts; prefer explicit `authorize_if`/`forbid_if` blocks without `bypass` for those cases.\n* Add an explicit **final `forbid_if always()`** guard for sensitive reads as a belt-and-suspenders fallback until user can upgrade.\n* Where feasible, replace runtime-unknown checks with strict/compile-time checks or restructure to avoid empty SAT scenarios.\n\n### How to tell if user is affected\n\nUser is likely affected if ALL of the following are true:\n\n* Uses **filter authorization**; and\n* Defines `bypass` block with `access_type :runtime` without any policies after it; or\n* Defines `bypass` blocks whose conditions are evaluated at runtime (e.g., checks with `strict_check/3` returning `:unknown` and a runtime `check/4` that may never succeed in some contexts) without any policies after it\n\nA quick sanity test is to issue a read expected to return **no** rows under such a bypass or runtime-falsy condition and verify it indeed returns `[]`. The included test `bypass works with filter policies` demonstrates the corrected, non-permissive behavior.",
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:N/SC:N/SI:N/SA:N"
15+
}
16+
],
17+
"affected": [
18+
{
19+
"package": {
20+
"ecosystem": "Hex",
21+
"name": "ash"
22+
},
23+
"ranges": [
24+
{
25+
"type": "ECOSYSTEM",
26+
"events": [
27+
{
28+
"introduced": "0"
29+
},
30+
{
31+
"fixed": "3.6.2"
32+
}
33+
]
34+
}
35+
]
36+
}
37+
],
38+
"references": [
39+
{
40+
"type": "WEB",
41+
"url": "https://github.com/ash-project/ash/security/advisories/GHSA-7r7f-9xpj-jmr7"
42+
},
43+
{
44+
"type": "ADVISORY",
45+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2025-48043"
46+
},
47+
{
48+
"type": "WEB",
49+
"url": "https://github.com/ash-project/ash/commit/66d81300065b970da0d2f4528354835d2418c7ae"
50+
},
51+
{
52+
"type": "PACKAGE",
53+
"url": "https://github.com/ash-project/ash"
54+
},
55+
{
56+
"type": "WEB",
57+
"url": "https://github.com/ash-project/ash/releases/tag/v3.6.2"
58+
}
59+
],
60+
"database_specific": {
61+
"cwe_ids": [
62+
"CWE-863"
63+
],
64+
"severity": "HIGH",
65+
"github_reviewed": true,
66+
"github_reviewed_at": "2025-10-13T13:33:22Z",
67+
"nvd_published_at": "2025-10-10T16:15:52Z"
68+
}
69+
}

0 commit comments

Comments
 (0)