Commit cd45dd2
committed
Fix predictable marker collision in EncodingPatternPreservation
EncodingPatternPreservation.captureAndReplaceMatches() previously used a
fixed, publicly-known default marker (this class's simple name,
"EncodingPatternPreservation") to temporarily stand in for matched
content while the rest of the string is encoded.
restoreOriginalContent() restores captured content in FIFO order using
replaceFirst(marker, ...), matching the marker as plain literal text.
If the input already contains that literal string ahead of the real
matched content (e.g. CSSCodec.encode() on
"EncodingPatternPreservation background:rgb(1,2,3)"), replaceFirst
matches the attacker-supplied text instead of the real placeholder,
silently desynchronizing every subsequent restoration and corrupting
the encoded output.
Fix: derive the default marker per-instance from a random UUID (with
hyphens stripped, since a hyphen would itself be altered by an
encoding pass such as CSSCodec's before restoration), so it cannot be
predicted or embedded by input content. The public
setReplacementMarker() API is unchanged.
Added regression tests covering marker unpredictability and the
literal-marker-in-input desync scenario.1 parent 58be169 commit cd45dd2
2 files changed
Lines changed: 61 additions & 6 deletions
File tree
- src
- main/java/org/owasp/esapi/codecs/ref
- test/java/org/owasp/esapi/codecs/ref
Lines changed: 28 additions & 4 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
| 5 | + | |
5 | 6 | | |
6 | 7 | | |
7 | 8 | | |
| |||
12 | 13 | | |
13 | 14 | | |
14 | 15 | | |
15 | | - | |
16 | | - | |
17 | 16 | | |
18 | 17 | | |
19 | | - | |
20 | | - | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
21 | 45 | | |
22 | 46 | | |
23 | 47 | | |
| |||
Lines changed: 33 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
18 | | - | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
19 | 21 | | |
20 | 22 | | |
21 | 23 | | |
| |||
28 | 30 | | |
29 | 31 | | |
30 | 32 | | |
31 | | - | |
| 33 | + | |
32 | 34 | | |
33 | 35 | | |
34 | 36 | | |
35 | 37 | | |
36 | 38 | | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
37 | 68 | | |
38 | 69 | | |
39 | 70 | | |
| |||
0 commit comments