Skip to content

Commit 6862709

Browse files
1 parent cbe243e commit 6862709

1 file changed

Lines changed: 90 additions & 0 deletions

File tree

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
{
2+
"schema_version": "1.4.0",
3+
"id": "GHSA-43w5-mmxv-cpvh",
4+
"modified": "2026-03-17T16:59:59Z",
5+
"published": "2026-03-17T16:59:59Z",
6+
"aliases": [],
7+
"summary": "Micronaut vulnerable to DoS via crafted form-urlencoded body binding with descending array indices",
8+
"details": "In `JsonBeanPropertyBinder::expandArrayToThreshold` in `io.micronaut:micronaut-json-core` before Micronaut 4 4.10.16 and in Micronaut 3 before 3.10.5 does not correctly handle descending array index order during form-urlencoded body binding, which allows remote attackers to cause a denial of service (non-terminating loop, CPU exhaustion, and OutOfMemoryError) via crafted indexed form parameters (e.g., `authors[1].name` followed by `authors[0].name`).\n\n### Example\n\nWith such an application\n\n```java\npackage dosform;\n\nimport io.micronaut.http.HttpResponse;\nimport io.micronaut.http.MediaType;\nimport io.micronaut.http.annotation.Body;\nimport io.micronaut.http.annotation.Consumes;\nimport io.micronaut.http.annotation.Controller;\nimport io.micronaut.http.annotation.Get;\nimport io.micronaut.http.annotation.Post;\nimport io.micronaut.http.annotation.Produces;\n\nimport java.net.URI;\n\n@Controller\nclass HomeController {\n\n @Produces(MediaType.TEXT_HTML)\n @Get\n String index() {\n return \"\"\"\n <!DOCTYPE html>\n <html>\n <head>\n <title></title>\n </head>\n <body>\n <form action=\"/submit\" method=\"post\">\n <label for=\"firstAuthor\">Fist Author</label>\n <input id=\"firstAuthor\" name=\"authors[0].name\" type=\"text\"/>\n\n <label for=\"secondAuthor\">Second Author</label>\n <input id=\"secondAuthor\" name=\"authors[1].name\" type=\"text\"/>\n \n <label for=\"thirdAuthor\">Third Author</label>\n <input id=\"thirdAuthor\" name=\"authors[2].name\" type=\"text\"/>\n\n <button type=\"submit\">Submit</button>\n </form>\n \n </body>\n </html>\n \"\"\";\n }\n\n @Consumes(MediaType.APPLICATION_FORM_URLENCODED)\n @Post(\"/submit\")\n HttpResponse<?> submit(@Body Book book) {\n return HttpResponse.seeOther(URI.create(\"/\"));\n }\n}\npackage dosform;\n\nimport io.micronaut.core.annotation.Introspected;\n\nimport java.util.Objects;\n\n@Introspected\npublic class Author {\n private String name;\n public String getName() { return name; }\n public void setName(String name) { this.name = name; }\n\n @Override\n public final boolean equals(Object o) {\n if (!(o instanceof Author)) return false;\n\n Author author = (Author) o;\n return Objects.equals(name, author.name);\n }\n\n @Override\n public int hashCode() {\n return Objects.hashCode(name);\n }\n\n @Override\n public String toString() {\n return \"Author{\" +\n \"name='\" + name + '\\'' +\n '}';\n }\n}\npackage dosform;\n\nimport io.micronaut.core.annotation.Introspected;\n\nimport java.util.List;\nimport java.util.Objects;\n\n@Introspected\npublic class Book {\n private List<Author> authors;\n public List<Author> getAuthors() { return authors; }\n public void setAuthors(List<Author> authors) { this.authors = authors; }\n\n @Override\n public final boolean equals(Object o) {\n if (!(o instanceof Book)) return false;\n\n Book book = (Book) o;\n return Objects.equals(authors, book.authors);\n }\n\n @Override\n public int hashCode() {\n return Objects.hashCode(authors);\n }\n\n @Override\n public String toString() {\n return \"Book{\" +\n \"authors=\" + authors +\n '}';\n }\n}\n```\n\nSending `curl -v -X POST 'http://127.0.0.1:8080/submit' -H 'Content-Type: application/x-www-form-urlencoded' --data-urlencode 'authors[1].name=RobertGalbraith' --data-urlencode 'authors[0].name=JKRowling'` causes sustained CPU usage and unbounded memory growth (eventually `OutOfMemoryError`). \n\n### Patches\nFor Micronaut 4, the problem has been patched in `micronaut-core`, dependencies with group id `io.micronaut`, since [4.10.16](https://github.com/micronaut-projects/micronaut-core/releases/tag/v4.10.16).\n\nFor Micronaut 3, the problem has been patched since [3.10.5](https://github.com/micronaut-projects/micronaut-core/releases/tag/v3.10.5)\n\nUsers upgrade to the latest version of the framework. \n\n### Workarounds\nThere is no way for users to fix or remediate the vulnerability without upgrading.\n\n### References\nPR Fix: https://github.com/micronaut-projects/micronaut-core/pull/12410",
9+
"severity": [
10+
{
11+
"type": "CVSS_V4",
12+
"score": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N"
13+
}
14+
],
15+
"affected": [
16+
{
17+
"package": {
18+
"ecosystem": "Maven",
19+
"name": "io.micronaut:micronaut-json-core"
20+
},
21+
"ranges": [
22+
{
23+
"type": "ECOSYSTEM",
24+
"events": [
25+
{
26+
"introduced": "4.0.0-M1"
27+
},
28+
{
29+
"fixed": "4.10.16"
30+
}
31+
]
32+
}
33+
]
34+
},
35+
{
36+
"package": {
37+
"ecosystem": "Maven",
38+
"name": "io.micronaut:micronaut-json-core"
39+
},
40+
"ranges": [
41+
{
42+
"type": "ECOSYSTEM",
43+
"events": [
44+
{
45+
"introduced": "0"
46+
},
47+
{
48+
"fixed": "3.10.5"
49+
}
50+
]
51+
}
52+
]
53+
}
54+
],
55+
"references": [
56+
{
57+
"type": "WEB",
58+
"url": "https://github.com/micronaut-projects/micronaut-core/security/advisories/GHSA-43w5-mmxv-cpvh"
59+
},
60+
{
61+
"type": "WEB",
62+
"url": "https://github.com/micronaut-projects/micronaut-core/pull/12410"
63+
},
64+
{
65+
"type": "WEB",
66+
"url": "https://github.com/micronaut-projects/micronaut-core/commit/1afe509677c51b320041b7a2c177366d4a4deb55"
67+
},
68+
{
69+
"type": "PACKAGE",
70+
"url": "https://github.com/micronaut-projects/micronaut-core"
71+
},
72+
{
73+
"type": "WEB",
74+
"url": "https://github.com/micronaut-projects/micronaut-core/releases/tag/v3.10.5"
75+
},
76+
{
77+
"type": "WEB",
78+
"url": "https://github.com/micronaut-projects/micronaut-core/releases/tag/v4.10.16"
79+
}
80+
],
81+
"database_specific": {
82+
"cwe_ids": [
83+
"CWE-835"
84+
],
85+
"severity": "HIGH",
86+
"github_reviewed": true,
87+
"github_reviewed_at": "2026-03-17T16:59:59Z",
88+
"nvd_published_at": null
89+
}
90+
}

0 commit comments

Comments
 (0)