Opened 3 weeks ago
Last modified 3 weeks ago
#37413 assigned Bug
MultiPartParser treats boundary tokens not preceded by CRLF as delimiters
| Reported by: | Natalia Bidart | Owned by: | Vishy |
|---|---|---|---|
| Component: | HTTP handling | Version: | dev |
| Severity: | Normal | Keywords: | MultiPartParser boundary not-security |
| Cc: | Triage Stage: | Accepted | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
BoundaryIter._find_boundary() in django/http/multipartparser.py looks for the bare --<boundary> string and only strips a preceding CRLF if present. Per RFC 2046 section 5.1.1, a delimiter is CRLF "--" boundary, so a boundary token appearing inside part data without a leading CRLF should be treated as content, not as the end of the part:
The boundary delimiter MUST occur at the beginning of a line, i.e., following a CRLF, and the initial CRLF is considered to be attached to the boundary delimiter line rather than part of the preceding part.
For example, with boundary XYZ, this body (CRLF line endings):
--XYZ Content-Disposition: form-data; name="a" foo--XYZ Content-Disposition: form-data; name="b" bar --XYZ--
is parsed as two fields (a="foo", b="bar"), while a strict parser would return a single field a whose value includes the embedded token.
Requiring the CRLF prefix (other than for the first delimiter at the start of the body) would align Django with the RFC. Lenient clients that rely on the current behavior could be affected, so this may need a deprecation path or at least a release note.
Change History (3)
comment:1 by , 3 weeks ago
| Keywords: | not-security added |
|---|---|
| Triage Stage: | Unreviewed → Accepted |
comment:2 by , 3 weeks ago
| Owner: | set to |
|---|---|
| Status: | new → assigned |
Nice find, thanks!