preflight.sh calls a duplicated header present when only the first one counts #12

Closed
opened 2026-08-17 23:25:34 -05:00 by null · 0 comments
Owner

Run passively against privacyllc.dev, preflight.sh reported ok strict-transport-security present. The response actually carries two of them, in one response:

strict-transport-security: max-age=63072000; includeSubDomains
strict-transport-security: max-age=63072000; preload

RFC 6797 section 8.1: a user agent that receives more than one STS header field MUST process only the first and ignore the rest. So what is in force is includeSubDomains without preload, and the preload directive has never done anything — while the headers read, to a person, as though the site were preload-ready. hstspreload.org requires max-age, includeSubDomains and preload in a single header, so a submission would also be rejected.

The general shape is worth catching, not just this instance: a security header that is present is not the same as one that is in force. Two layers each adding their own is the ordinary cause, and the second is silently discarded.

Check each security header it already looks for, and report a count above one as a finding naming which directives are actually in force — the first occurrence — and which are being discarded.

Scope: this reports duplication, not policy quality. A default-src * is still a CSP and judging that is a person's job, as the script's header already says.

Verify: given a response with two Strict-Transport-Security headers, preflight.sh reports a finding naming the surviving directives and exits 1; given one header it stays quiet.

Run passively against privacyllc.dev, `preflight.sh` reported `ok strict-transport-security present`. The response actually carries **two** of them, in one response: strict-transport-security: max-age=63072000; includeSubDomains strict-transport-security: max-age=63072000; preload RFC 6797 section 8.1: a user agent that receives more than one STS header field MUST process only the first and ignore the rest. So what is in force is `includeSubDomains` without `preload`, and the `preload` directive has never done anything — while the headers read, to a person, as though the site were preload-ready. hstspreload.org requires `max-age`, `includeSubDomains` and `preload` in a single header, so a submission would also be rejected. The general shape is worth catching, not just this instance: **a security header that is present is not the same as one that is in force.** Two layers each adding their own is the ordinary cause, and the second is silently discarded. Check each security header it already looks for, and report a count above one as a finding naming which directives are actually in force — the first occurrence — and which are being discarded. Scope: this reports duplication, not policy quality. A `default-src *` is still a CSP and judging that is a person's job, as the script's header already says. Verify: given a response with two `Strict-Transport-Security` headers, preflight.sh reports a finding naming the surviving directives and exits 1; given one header it stays quiet.
null added this to the Batch 02 — Findings from the first real runs milestone 2026-08-17 23:25:34 -05:00
null added the
P2
label 2026-08-17 23:25:34 -05:00
null closed this issue 2026-08-17 23:30:52 -05:00
Sign in to join this conversation.
No Label
P0
P1
P2
release-blocker
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: null/Project-Template#12
No description provided.