You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/content/docs/rfc-requirement-dashboard.md
+30-19Lines changed: 30 additions & 19 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
---
2
2
title: "RFC Requirement Dashboard"
3
-
description: "Complete RFC 2119 requirement-level analysis for all 172 Http11Probe tests"
3
+
description: "Complete RFC 2119 requirement-level analysis for all 183 Http11Probe tests"
4
4
weight: 2
5
5
breadcrumbs: false
6
6
---
@@ -11,18 +11,18 @@ This dashboard classifies every Http11Probe test by its [RFC 2119](https://www.r
11
11
12
12
| Requirement Level | Count | Meaning (RFC 2119) |
13
13
|---|---|---|
14
-
|**MUST**|96| Absolute requirement — no compliant implementation may deviate |
14
+
|**MUST**|103| Absolute requirement — no compliant implementation may deviate |
15
15
|**SHOULD**| 29 | Recommended — valid exceptions exist but must be understood |
16
16
|**MAY**| 10 | Truly optional — either behavior is fully compliant |
17
17
|**"ought to"**| 1 | Weaker than SHOULD — recommended but not normative |
18
-
|**Unscored**|25| Informational — no pass/fail judgement |
18
+
|**Unscored**|29| Informational — no pass/fail judgement |
19
19
|**N/A**| 11 | Best-practice / no single RFC verb applies |
20
20
21
-
**Total: 172 tests**
21
+
**Total: 183 tests**
22
22
23
23
---
24
24
25
-
## MUST-Level Requirements (96 tests)
25
+
## MUST-Level Requirements (103 tests)
26
26
27
27
These tests enforce absolute RFC requirements. A compliant server has no discretion — it **MUST** behave as specified.
28
28
@@ -99,11 +99,18 @@ The RFC requires rejection, but the mechanism (400 status or connection close) h
99
99
| 56 |`SMUG-CLTE-KEEPALIVE`| Smuggling |[RFC 9112 §6.1](https://www.rfc-editor.org/rfc/rfc9112#section-6.1)| CL+TE conflict with explicit `Connection: keep-alive`. **MUST** close connection regardless of keep-alive. |
100
100
| 57 |`SMUG-CLTE-DESYNC`| Smuggling |[RFC 9112 §6.1](https://www.rfc-editor.org/rfc/rfc9112#section-6.1)| Classic CL.TE desync: CL=6 with TE=chunked body `0\r\n\r\nX`. Poison byte after CL boundary confirms desync. **MUST** close connection. |
101
101
| 58 |`SMUG-TECL-DESYNC`| Smuggling |[RFC 9112 §6.1](https://www.rfc-editor.org/rfc/rfc9112#section-6.1)| Reverse TE.CL desync: TE=chunked terminates at `0\r\n\r\n` but CL=30. Extra bytes on wire confirm desync. **MUST** close connection. |
102
+
| 59 |`SMUG-CHUNK-SIZE-PLUS`| Smuggling |[RFC 9112 §7.1](https://www.rfc-editor.org/rfc/rfc9112#section-7.1)| Grammar: `chunk-size = 1*HEXDIG`. Leading `+` is not HEXDIG; invalid chunk framing **MUST** be rejected. |
103
+
| 60 |`SMUG-CHUNK-SIZE-TRAILING-OWS`| Smuggling |[RFC 9112 §7.1](https://www.rfc-editor.org/rfc/rfc9112#section-7.1)| Grammar: `chunk-size = 1*HEXDIG`. Trailing whitespace in chunk-size is invalid syntax and **MUST** be rejected. |
104
+
| 61 |`SMUG-CHUNK-EXT-INVALID-TOKEN`| Smuggling |[RFC 9112 §7.1.1](https://www.rfc-editor.org/rfc/rfc9112#section-7.1.1)| Grammar: `chunk-ext-name = token`. `[` is not a valid token character, so the chunk extension is invalid and **MUST** be rejected. |
105
+
| 62 |`SMUG-OPTIONS-TE-OBS-FOLD`| Smuggling |[RFC 9112 §5.2](https://www.rfc-editor.org/rfc/rfc9112#section-5.2)| "A server that receives an obs-fold in a request message ... **MUST** either reject the message by sending a 400 (Bad Request) ... or replace each received obs-fold with one or more SP octets." |
106
+
| 63 |`SMUG-CHUNK-INVALID-SIZE-DESYNC`| Smuggling |[RFC 9112 §7.1](https://www.rfc-editor.org/rfc/rfc9112#section-7.1)| Sequence test with invalid `+0` chunk-size plus poison byte. Since `chunk-size = 1*HEXDIG`, this framing error **MUST** be rejected to prevent desync. |
102
107
| 54 |`COMP-CONNECTION-CLOSE`| Compliance |[RFC 9112 §9.6](https://www.rfc-editor.org/rfc/rfc9112#section-9.6)| "A server that receives a 'close' connection option **MUST** initiate closure of the connection after it sends the final response to the request that contained the 'close' connection option." |
103
108
| 55 |`COMP-OPTIONS-STAR`| Compliance |[RFC 9112 §3.2.4](https://www.rfc-editor.org/rfc/rfc9112#section-3.2.4)| The asterisk-form `*` is defined only for OPTIONS. A valid OPTIONS * request **MUST** be accepted. |
104
109
| 56 |`COMP-POST-CL-BODY`| Compliance |[RFC 9112 §6.2](https://www.rfc-editor.org/rfc/rfc9112#section-6.2)| "If a valid Content-Length header field is present without Transfer-Encoding, its decimal value defines the expected message body length in octets." Server **MUST** accept a well-formed POST with matching body. |
105
110
| 57 |`COMP-POST-CL-ZERO`| Compliance |[RFC 9112 §6.2](https://www.rfc-editor.org/rfc/rfc9112#section-6.2)| Content-Length: 0 is a valid 1*DIGIT value. Server **MUST** accept zero-length body. |
106
111
| 58 |`COMP-POST-NO-CL-NO-TE`| Compliance |[RFC 9112 §6.3](https://www.rfc-editor.org/rfc/rfc9112#section-6.3)| "If this is a request message and none of the above are true, then the message body length is zero (no message body is present)." Server **MUST** treat as zero-length. |
112
+
| 59 |`COMP-RANGE-POST`| Compliance |[RFC 9110 §14.2](https://www.rfc-editor.org/rfc/rfc9110#section-14.2)| "A server **MUST** ignore a Range header field received with a request method other than GET." |
113
+
| 60 |`COMP-UPGRADE-HTTP10`| Compliance |[RFC 9110 §7.8](https://www.rfc-editor.org/rfc/rfc9110#section-7.8)| "A server **MUST** ignore an Upgrade header field that is received in an HTTP/1.0 request." |
107
114
| 59 |`COMP-CHUNKED-BODY`| Compliance |[RFC 9112 §7.1](https://www.rfc-editor.org/rfc/rfc9112#section-7.1)| "A recipient **MUST** be able to parse and decode the chunked transfer coding." |
108
115
| 60 |`COMP-CHUNKED-MULTI`| Compliance |[RFC 9112 §7.1](https://www.rfc-editor.org/rfc/rfc9112#section-7.1)| Same — multi-chunk is the standard chunked format. **MUST** accept. |
109
116
| 61 |`COMP-CHUNKED-EMPTY`| Compliance |[RFC 9112 §7.1](https://www.rfc-editor.org/rfc/rfc9112#section-7.1)| A zero-length chunked body (just `0\r\n\r\n`) is valid. **MUST** accept. |
@@ -205,7 +212,7 @@ Weaker than SHOULD — recommends but does not normatively require.
205
212
206
213
---
207
214
208
-
## Unscored Tests (25 tests)
215
+
## Unscored Tests (29 tests)
209
216
210
217
These tests are informational — they produce warnings but never fail.
211
218
@@ -236,6 +243,10 @@ These tests are informational — they produce warnings but never fail.
236
243
| 23 |`COMP-RANGE-INVALID`| Compliance |[RFC 9110 §14.2](https://www.rfc-editor.org/rfc/rfc9110#section-14.2)| "A server **MAY** ignore the Range header field." Invalid Range syntax — 2xx or 416 both acceptable. |
237
244
| 24 |`COMP-POST-UNSUPPORTED-CT`| Compliance |[RFC 9110 §15.5.16](https://www.rfc-editor.org/rfc/rfc9110#section-15.5.16)| POST with unknown Content-Type — 415 or 2xx both acceptable. |
238
245
| 25 |`SMUG-PIPELINE-SAFE`| Smuggling |[RFC 9112 §9.3](https://www.rfc-editor.org/rfc/rfc9112#section-9.3)| Baseline: two clean pipelined GETs. Validates sequence test infrastructure against the target. |
246
+
| 26 |`SMUG-CL0-BODY-POISON`| Smuggling |[RFC 9112 §6.2](https://www.rfc-editor.org/rfc/rfc9112#section-6.2)|`Content-Length: 0` plus trailing bytes, then follow-up GET on same socket. Sequence telemetry for `0.CL`-style poisoning behavior. |
247
+
| 27 |`SMUG-GET-CL-BODY-DESYNC`| Smuggling |[RFC 9110 §9.3.1](https://www.rfc-editor.org/rfc/rfc9110#section-9.3.1)| "Content received in a GET request ... might lead some implementations to reject the request and close the connection because of its potential as a request smuggling attack." Adds follow-up desync check. |
248
+
| 28 |`SMUG-OPTIONS-CL-BODY-DESYNC`| Smuggling |[RFC 9110 §9.3.7](https://www.rfc-editor.org/rfc/rfc9110#section-9.3.7)| OPTIONS with body plus follow-up GET to detect unread-body poisoning on persistent connections. |
249
+
| 29 |`SMUG-EXPECT-100-CL-DESYNC`| Smuggling |[RFC 9110 §10.1.1](https://www.rfc-editor.org/rfc/rfc9110#section-10.1.1)| Expect/continue flow with immediate body plus follow-up GET; highlights whether connection framing remains synchronized. |
239
250
240
251
---
241
252
@@ -261,25 +272,25 @@ These tests don't map to a single RFC 2119 keyword but enforce defensive best pr
261
272
262
273
## Requirement Level by Suite
263
274
264
-
### Compliance Suite (74 tests)
275
+
### Compliance Suite (76 tests)
265
276
266
277
| Level | Tests |
267
278
|-------|-------|
268
-
| MUST |45|
279
+
| MUST |47|
269
280
| SHOULD | 15 |
270
281
| MAY | 6 |
271
282
| Unscored | 7 |
272
283
| N/A | 1 |
273
284
274
-
### Smuggling Suite (67 tests)
285
+
### Smuggling Suite (76 tests)
275
286
276
287
| Level | Tests |
277
288
|-------|-------|
278
-
| MUST |39|
289
+
| MUST |44|
279
290
| SHOULD | 9 |
280
291
| MAY | 3 |
281
292
| "ought to" | 1 |
282
-
| Unscored |15|
293
+
| Unscored |19|
283
294
284
295
### Malformed Input Suite (26 tests)
285
296
@@ -310,26 +321,26 @@ These tests don't map to a single RFC 2119 keyword but enforce defensive best pr
A two-step sequence: invalid chunk-size `+0` with poison byte `X`, then a clean `GET`.
18
+
19
+
```http
20
+
POST / HTTP/1.1\r\n
21
+
Host: localhost:8080\r\n
22
+
Transfer-Encoding: chunked\r\n
23
+
\r\n
24
+
+0\r\n
25
+
\r\n
26
+
X
27
+
28
+
GET / HTTP/1.1\r\n
29
+
Host: localhost:8080\r\n
30
+
\r\n
31
+
```
32
+
33
+
## What the RFC says
34
+
35
+
> "chunk-size = 1*HEXDIG" -- RFC 9112 Section 7.1
36
+
37
+
Invalid chunk-size is a framing error. This sequence confirms whether acceptance leads to follow-up parsing corruption.
38
+
39
+
## Partial Coverage Note
40
+
41
+
Existing tests (`SMUG-CHUNK-NEGATIVE`, `SMUG-CHUNK-HEX-PREFIX`, `SMUG-CHUNK-SPILL`, `MAL-CHUNK-SIZE-OVERFLOW`) cover invalid chunk primitives. This test adds explicit desync confirmation via a follow-up request.
42
+
43
+
## Why it matters
44
+
45
+
If invalid chunk-size is tolerated and the connection remains open, poison bytes can be interpreted as the next request.
0 commit comments