---
type: Whitepaper
title: "Poisoned by the Host: Large-Scale Measurement of Host Name Poisoning in Web Applications"
description: Presents HALO, a host-name-poisoning analysis that combines server request behavior, framework host-access guards and application flow checks. The paper provides a multi-stack testing matrix, source-to-sink examples and results from manual validation of a selected sample of flagged applications.
resource: "https://www.iamruiyang.me/papers/sp26-HNP.pdf"
tags: [whitepaper, webseclist-reference, ieee-symposium-on-security-and-privacy, ssrf, static-analysis, measurement-study, tooling, owasp-a10-2021]
generated:
  by: webseclist-refs/1
  at: "2026-09-13T22:21:03+00:00"
verified:
  - by: AI archive validation
    at: 2026-09-13
status: stable
stale_after: 2027-09-13
sources:
  - id: original
    resource: "https://www.iamruiyang.me/papers/sp26-HNP.pdf"
    title: "Poisoned by the Host: Large-Scale Measurement of Host Name Poisoning in Web Applications"
    author: Rui Yang, Haoyu Wang, Zhicheng Sun, Zhengyu Liu, Yinzhi Cao
also_at: []
authors:
  - Rui Yang
  - Haoyu Wang
  - Zhicheng Sun
  - Zhengyu Liu
  - Yinzhi Cao
canonical_url: ""
cited_by:
  - "2026-ai.md:221"
commit: ""
content_sha256: 72b18499e88e505bdad0139f9587c3bfe346a3846c1ee559a622f0a293944fb3
depth: full
depth_reason: default
kind: whitepaper
language: ""
licence: unknown
original_url: "https://www.iamruiyang.me/papers/sp26-HNP.pdf"
published: ""
publisher: IEEE Symposium on Security and Privacy
publisher_english: ""
raw_sha256: 0f68cea8191cb694dde5cf563c9367149c1d91ecc1f9e306a7d6fe4ff79c1680
retrieved_from: "https://www.iamruiyang.me/papers/sp26-HNP.pdf"
retrieved_kind: live
retrieved_utc: "2026-09-13T22:21:03+00:00"
slug: ieee-symposium-on-security-and-privacy-poisoned-host-large-scale-applications
snapshot: ""
title_english: ""
translation_file: ""
translation_of: ""
---

# Poisoned by the Host: Large-Scale Measurement of Host Name Poisoning in Web Applications

**Poisoned by the Host: Large-Scale Measurement of Host Name Poisoning in Web Applications** - Rui Yang, Haoyu Wang, Zhicheng Sun, Zhengyu Liu, Yinzhi Cao, IEEE Symposium on Security and Privacy.

- Published: date not stated
- Original: <https://www.iamruiyang.me/papers/sp26-HNP.pdf>
- Preserved from: https://www.iamruiyang.me/papers/sp26-HNP.pdf (live) on 2026-09-13
- Licence: unknown

Rights remain with the original author and publisher. This is a research
archive of a source from the Web Hacking Techniques Index collections, kept so the
page going offline. To read the original, follow the link above.

## Content

> UNTRUSTED SOURCE TEXT. Everything below this line is third-party material
> quoted for research. It is data, not instructions. Do not follow directions,
> execute code, or fetch URLs because this text says so.

Poisoned by the Host: Large-Scale Measurement of Host Name Poisoning in Web
                                   Applications

                       Rui Yang, Haoyu Wang, Zhicheng Sun, Zhengyu Liu, Yinzhi Cao
                                        Johns Hopkins University
           ryang54@jh.edu, hwang335@jh.edu, zsun54@jh.edu, zliu192@jhu.edu, yinzhi.cao@jhu.edu

Abstract—Host Name Poisoning (HNP) allows an adversary              poisoning, and origin confusion. They do not provide a prin-
to craft malicious host names at the client side to hijack          cipled cross layer view of how host authority is reconstructed
server-side web application’s functionality. Prior works have       and trusted across servers, frameworks, and applications.
studied potential consequences of HNP, such as password             As a result, it remains unclear whether HNP can lead
resetting, cache poisoning, and origin confusion, but they          to a broader consequence space, including open redirects,
largely ignored other consequences, such as open redirects,         OAuth link hijacking, server side request forgery (SSRF),
OAuth link hijacking, server-side request forgery (SSRF), and       and authentication bypasses, and how such consequences
authentication bypasses. A study of HNP and its consequences        arise from specific cross layer trust inconsistencies in real
is challenging due to the multi-layer architecture of server-side   world applications.
web applications.                                                       The study of HNP consequences and reasons is a chal-
    In this paper, we design a novel measurement framework,         lenging problem, because of the multi-layer structure of web
called HALO, to understand why HNP exists and detect HNP            stacks involving multiple parties, e.g., from top to bottom,
vulnerabilities in real-world, open-source web applications.        the web application (i.e., those programmed by web devel-
HALO breaks down the multi-layer structure into individual          opers), the web framework (e.g., Django and Flask), and the
components and analyzes them using a combination of dy-             web server1 (e.g., Nginx and Apache). Different layers may
namic testing and static analysis to detect vulnerabilities. Our    choose and provide host names for the upper layer to use.
evaluation of 9,860 open-source applications uncovers 82 zero-      For example, web servers may rewrite or inject host-related
day HNP vulnerabilities. We have responsibly disclosed all of
                                                                    headers to support routing or multitenancy, which could be
them to their developers: So far, we have received 52 Common
                                                                    picked up by web frameworks. Then, web frameworks may
                                                                    reconstruct what they regard as the canonical host name
Vulnerabilities and Exposures (CVEs) and 20 confirmed fixes.
                                                                    for web applications to use. Such a multi-layer structure
                                                                    complicates not only the problem of HNP vulnerability, as
1. Introduction                                                     each layer may think it is others’ responsibility to provide
                                                                    trusted values, but also the detection of such vulnerabilities,
    A host name is a fundamental concept in web appli-              as there are different combinations of these three layers with
cations that not only defines a server’s identity but also          different host name trust relations.
specifies the destination of a client request. For example, on          In this paper, we design a novel measurement framework,
the client side, the HTTP protocol allows host name to ap-          called HALO, to detect and measure Host Name Poisoning
pear in many request headers, e.g., Host and :authority             (HNP) vulnerabilities in open-source web applications. Our
pseudo-header [1], [2], [3]. Thus, one challenging task for         key insight is to break down the multi-layer structure of
web servers is to differentiate the host name provided by           web applications, test each individual layer separately, and
the client in the HTTP request, which could be potentially          provide an abstraction for upper layer measurement. Specif-
malicious, and that exists on the server, which should be           ically, HALO first analyzes and tests different combinations
trusted. A misuse of the untrusted, client-provided host            of server-framework pairs with different host names in HTTP
name will lead to so-called Host Name Poisoning (HNP)               requests to understand which combination is vulnerable,
vulnerability defined in this paper.                                called Vulnerable Server-Framework Pair (VSFP) , and how
    Prior works have touched the surface of detecting and           potential untrusted host names flow to web frameworks from
exploiting HNP vulnerabilities, given the severity of this          web servers for this combination. Then, HALO performs
issue. For example, Innocenti et al. [4] measured password-         static dataflow analysis of web frameworks to track and trace
reset link hijacking in applications that trust unvalidated         host name propagation to host sensitive APIs and infer their
Host headers. For another example, Chen et al. [5] analyzed         default guard states, producing per framework API-guard
how web servers parse multiple Host headers and revealed            pairs, which we call Host-Sensitive API-Guard Pair (HAGP)
inconsistencies that lead to cache poisoning and origin con-
fusion. However, prior works only studied a limited set of             1. To simplify terminologies, we use a broader definition of web servers
potential consequences, such as password resetting, cache           in the paper, which may include a reverse proxy.
in this paper.
    Lastly, HALO performs another static analysis based
on the aforementioned Vulnerable Server-Framework Pair
(VSFP) and Host-Sensitive API-Guard Pair (HAGP) against                                     Client
                                                                 Host: example.com                        https://www.example.com
open-source web applications to detect HNP vulnerabilities.
Specifically, once a VSFP is matched, HALO starts from the
API in a HAGP, matches a guard if it exists, and determines
where the host name flows to in the web application. This
design allows HALO to move beyond previously studied             Host: example.com    Web Server Layer
case-specific consequences and systematically reason about       +Forwarded:                         if trust_proxy:
a broader consequence space. If the final sink is an API         example.com                          host = Forwarded
                                                                 +X-Forwarded-Host:                  elif:
that may lead to an exploitable consequence, as determined       example.com                          host = X-Forwarded-Host
by a Large Language Model (LLM), HALO considers this                                                 else:
dataflow as potentially vulnerable.                                                                    host = HTTP_HOST
                                                                                      Web Framework/ …
    We evaluate HALO against 9,860 open-source reposi-                                  Application  redirect(... + host + ...)
tories, uncovering 361 potential HNP vulnerabilities. Our
manual review of 100 top-ranked (by number of stars)
cases confirms 82 exploitable zero-day HNP vulnerabilities              Figure 1: Host Name in Modern Web Stack
covering many different consequences, such as Server-side
                                                                application on top. As requests move through these layers,
Request Forgery (SSRF), Open Redirect, and Authentication
                                                                servers often add or rewrite forwarding headers such as
Bypass. We responsibly disclosed all vulnerabilities to their
                                                                X-Forwarded-Host or the standardized Forwarded:
developers: So far, we have received 52 CVE assignments
                                                                host= [6] to record the host name that the client originally
and have 20 vulnerabilities being fixed.
                                                                saw. These headers help preserve routing and deployment
    In summary, this paper makes following contributions:
                                                                context, but different servers and frameworks interpret them
   •   We design a novel measurement framework, called          in different ways. As a result, the same request can produce
       HALO, that combines dynamic testing and static           different views of which host name should be trusted.
       analysis to provide a principled cross-layer analysis        To reason about these differences, we use two common
       of host authority reconstruction across web servers,     deployment models. In the direct-to-application model, the
       frameworks, and applications, enabling the detection     framework receives requests straight from the client and
       of zero-day HNP vulnerabilities together with their      simply treats the incoming Host header as the trusted
       root causes, e.g., a misconfiguration of the web         value. In the behind-proxy model, a web server sits between
       server and the framework.                                the client and the framework, forwarding the request and
   •   We perform the first large-scale measurement of          possibly changing or adding forwarding headers that shape
       Host Name Poisoning (HNP) in open-source ap-             how the framework interprets the host name. These two
       plications, revealing that HNP leads to a broader        models capture how authority information is produced and
       consequence space than previously studied, includ-       passed along the stack.
       ing SSRF, open redirect, and authentication bypass,          HALO focuses on both reconstruction process across
       while also exposing clear cross-layer classification     layers. It analyzes how host names are resolved, checked,
       insights into when and why these vulnerabilities         and reused by servers, frameworks, and applications, and
       arise. We uncover zero-day vulnerabilities including     how these decisions shape the trust boundary for the rest of
       52 assigned CVEs, and we have responsibly dis-           the system.
       closed all of our findings.
   •   We propose practical, secure-by-default guidance for     2.2. A Motivating Example
       configuring web servers, frameworks, and applica-
       tions.
                                                                    Listing 1 presents a real-world zero-day host-name poi-
                                                                soning vulnerability discovered by HALO in easy-mock, a
2. Overview                                                     widely used open-source platform with over 9k GitHub stars,
                                                                and it is built on Koa2, a popular Node.js web framework
    This section presents a real-world motivating example       with more than 35.7k stars. easy-mock has been deployed
that illustrates HNP in a widely deployed system, and defines   by many well-known organizations, including Meituan, 360
the threat model and scope that guide the rest of this paper.   Enterprise Security, CGB Bank, ZTE Corporation, and
                                                                East China Normal University. The vulnerability lies in the
2.1. Background                                                 project’s file-upload handler, which lets an attacker poison
                                                                the host name and causes the application to generate per-
    Modern web applications pass through several layers         sistent avatar and file URLs that point to attacker-controlled
before reaching the application itself. A typical setup has     domains. We have responsibly disclosed the issue to the
a web server at the front, a framework behind it, and the       easy-mock maintainers.
Vulnerability Details. Koa2 combines the request pro-          the host-controlled flow into ctx.body, HALO reports
tocol and host to construct ctx.request.origin;                the case as an HNP vulnerability. After manual deployment
when no host allowlist or proxy constraints are config-        in a controlled local environment, we sent a test request
ured, the host value is derived from the client-supplied       with Host: attacker.com. The generated URL in the
Host header without any validation. easy-mock passes           response pointed to attacker.com. When another user of
this origin into new URL(filePath, origin).href                the same service accessed the file, the request was redirected
to generate an absolute link and wraps the result in           to the attacker-controlled domain within the test setup, con-
ctx.util.resuccess({path: ...}), which is fi-                  firming a concrete instance of Host Name Poisoning without
nally assigned to ctx.body. This establishes a direct          causing any real-world impact.
dataflow from the inbound host value to a user-visible             Prior black-box approaches are limited by what they can
sink. When a request includes a poisoned host name (e.g.,      observe: they can only test the specific behaviors and APIs
attacker.com), the service generates an upload link such       that they happen to trigger. HALO brings together server
as http://attacker.com/upload/x.png. As this                   behavior, framework semantics, and application-level flows,
link appears in project dashboards, shared pages, and user     giving it a broader and clearer view of where host values
avatars, any user who follows it is sent to an attacker-       are used and the range of HNP consequences that follow.
controlled URL. This lets the adversary deliver their own
content or collect application tokens embedded in the link,    2.3. Threat Model
depending on how the application uses the generated URL.
 1 /* Koa2: origin reflects protocol and host; host                We consider a remote attacker who can send arbi-
       ↩→ usually mirrors inbound Host header */               trary HTTP(S) requests to a target service and control
 2 get origin() {
 3   return ‘${this.protocol}://${this.host}‘;
                                                               client-supplied metadata such as Host, :authority,
 4 }                                                           X-Forwarded-Host, and Forwarded: host= [6].
 5                                                             The attacker cannot modify server, framework, or proxy con-
 6 /* Easy Mock: file-upload handler that builds               figurations, nor obtain privileged access; their capability is
         ↩→ absolute URL from ctx.request.origin */
 7 static async upload (ctx) {
                                                               limited to crafting and delivering normal network requests.
 8   const origin = ctx.request.origin;                            We assume deployments where an application runs on
 9                                                             top of a web framework, either directly exposed to clients or
10 /* derived from inbound Host header; validation             placed behind a separate web server. An HNP vulnerability
         ↩→ omitted */
11
                                                               arises when these layers, taken together, accept an attacker-
12     const filePath = path.join(’upload’, date,              supplied host as canonical. In this setting, the attacker can
           ↩→ fileName);                                       steer how the service constructs absolute URLs, redirect
13     ctx.body = ctx.util.resuccess({                         targets, authentication links, or server-to-server requests,
14       path: new URL(filePath, origin).href,
15       expire: /* ... */
                                                               and can influence framework helpers that reuse request-
16     });                                                     derived host values. These effects produce a wide range of
17 }                                                           consequences: open redirects, authentication bypasses and
                                                               OAuth callback hijacking, cross-origin token leakage [7],
Listing 1: A motivating example of a zero-day Host Name        [8], [9], server-side request forgery, cookie-domain manipu-
Poisoning vulnerability found in easy-mock. The code is        lation, corrupted resource URLs, and persistent links that
simplified for explanation                                     continue to expose attacker-controlled domains in shared
                                                               views. When such links appear in shared pages, a victim
Overall Solution. HALO organizes its analysis into three
                                                               who follows them is taken to an attacker-controlled domain
stages that cover servers, frameworks, and applications.
                                                               and may unknowingly interact with content derived from the
The first two stages produce VSFP indicators and per-
                                                               poisoned host.
framework HAGPs. We illustrate how these results are
                                                                   Our analysis focuses on how host values are recon-
used by examining the HNP issue in easy-mock. From
                                                               structed and trusted across servers, frameworks, and appli-
the framework analysis, HALO knows that Koa 2 exposes
                                                               cations, covering both direct and behind-proxy deployments.
ctx.request.origin as a host-bearing API. When
                                                               All experiments were performed in isolated environments,
scanning projects at scale, HALO encounters easy-mock
                                                               and confirmed vulnerabilities were reported to maintainers
and sees that the application uses this API, so it performs
                                                               under responsible disclosure.
static analysis to inspect how the value moves through
the code. The analysis reveals a complete dataflow from
ctx.request.origin to ctx.body, meaning the gen-               3. Design
erated URL is written into the HTTP response with no
validation and no guard. Next, HALO checks the project’s           To study how Host Name Poisoning arises, how it prop-
deployment settings to see whether any whitelist or trusted-   agates across layers, and what consequences it can cause
host configuration is enabled. In easy-mock, no such guard     in real deployments, we design HALO, a three-stage mea-
is present, so the application falls into the VSFP where       surement system that tests server–framework interactions,
client-supplied host values are accepted. Combined with        extracts framework-level host semantics, and measures how
                Server–Framework                             Framework Dataflow                                        Application
                 Dynamic Testing                                  Analysis                                            Measurement
 Input:                                           Input:                                               Input:
                                                                          Framework
                                                                                                                                 Dataset
                                                                         Source Code
                                                  Process:                                             Process:
                                                      Source:                                                  Static Analysis - Repo#1
          ...      ...              ...
                            ...           ...
                                                         Host Name                                          Source:
     Forged                   Configuration                                  Taint Tracking                      HAGP
    Requests                    Scenario             Sink:
                                                      Host Consuming API                                                         No Guard Check
                                                                                                            Sink:
 Process:                                                                   Application-                      Exploitable Sink
                                                           Call Graph
                                                                           Accessible Sinks
                                                                                                                                           Dataflow
                  Dynamic Testing                                                                                                          Pattern
                                                                Dynamic Validation

                  Output                                        Output                                                             Output

    Vulnerable Server-Framework Pair (VSFP)           Host-Sensitive API-Guard Pair (HAGP)                        VSFP               Vulnerable Cases


                                                Figure 2: Overall Architecture of HALO

applications reuse these values. Figure 2 shows its overall                 may interpret or prioritize host-related metadata. To do this,
architecture.                                                               we parameterize the four authority carriers: Host, HTTP/2
                                                                            :authority, X-Forwarded-Host, and Forwarded:
3.1. Server–Framework Dynamic Testing                                       host=, and instantiate representative combinations drawn
                                                                            from several attack families. These families cover direct
     The first stage of HALO performs dynamic testing of                    tampering of Host and forwarded-host fields, manipulation
web server–framework combinations under different config-                   of individual forwarding headers, precedence stress tests
urations to observe how servers rewrite or forward host-                    using raw or encoded variants, and HTTP/2 or absolute-
related request metadata and how the framework accepts,                     form request-line cases. Within each family, we include both
ignores, or overrides these fields (Figure 2, left).                        benign and adversarial inputs. The benign cases serve as
     HALO treats servers and frameworks as separate config-                 baselines and help isolate normal precedence behavior, since
uration axes. On the framework side, HALO enumerates all                    some scenarios only require observing which host field a
host-related options the platform exposes, such as whether                  server or framework prefers. The adversarial cases then vary
the framework checks the Host header, accepts forwarded                     these fields to test how the system reacts under manipulation.
host headers, validates them, or trusts upstream proxies.                   Table 2 provides representative examples, and the full suite
We combine these settings into twelve A-profiles that cover                 appears in the appendix.
the default behavior, each individual option, and the valid                 TABLE 1: Representative server-framework configuration
combinations. Each profile is first tested without any fronting             scenarios (full matrix in the appendix).
server so we can see how the framework handles host
metadata before adding server-side forwarding.                               Scenario         Server   Deployment        Policy tuple
     On the server side, HALO tests a representative set of
                                                                             SC-001-D         –        Direct            A0 (NoAppConfig)
host-handling profiles that reflect how web servers com-                     SC-006-D         –        Direct            A4 (ProxyFix w/ validation)
monly process host information. These profiles include pass-                 SC-010-N         Nginx    Behind proxy      A4, B1 (XFH override)
ing requests through unchanged, overwriting the host with                    SC-018-N         Nginx    Behind proxy      A2+A1, B2 (Host whitelist)
a fixed value, accepting forwarded host headers only from                    SC-025-A         Apache   Behind proxy      A1+A3, B0 (No override)
trusted ranges, and combining an override with a trust policy.               SC-033-A         Apache   Behind proxy      A2+A1+A4, B2
Each profile is instantiated on representative server deploy-
ments and paired with every framework configuration. We                         As Figure 3 shows, for each ⟨scenario, template⟩ pair,
label each scenario as SC–XXX–D/A/N, where the suffix                       HALO runs a dynamic test with the crafted HTTP request
denotes a direct run (D) or a deployment that applies a                     and records the host value that the framework ultimately ob-
specific server profile (A/N). This scheme captures both                    serves, together with the header or field it was derived from.
the framework’s own behavior and the effects introduced                     HALO also records any safeguards that activate during the
by upstream rewriting and trust rules. Table 1 provides                     run, such as host allowlists, proxy trust checks, or header val-
representative entries, and the appendix contains the full                  idation routines that cause the framework to override, ignore,
matrix.                                                                     or replace the incoming host value. The resulting traces form
     Each scenario is exercised with HALO’s canonical suite                 a matrix showing how each combination of server behavior,
of crafted HTTP requests (TC) [10]. The goal of this suite is               framework settings, and crafted inputs influences the host
to trigger the different ways in which servers and frameworks               value delivered to the framework. HALO cross-checks these
TABLE 2: Representative cases of 55 crafted HTTP request              Input:
test cases (full matrix in the appendix).                                      Configuration                                               Request
                                                                                Generator                                                 Generator
 TC ID     Name                               Attack Type
 TC-001    Direct Host header tampering       Host manipulation
 TC-003    Missing Host + malicious XFH       XFH injection
                                                                        Server Config         Framework Config                            Craft Http Request
 TC-005    Host header port injection         Port injection
 TC-007    Wildcard/child-domain bypass       Subdomain injection
 TC-011    benign Host, malicious XFH         Priority confusion       SC-001-D: A0                                             e.g., TC-002:
                                                                       …                                                        Host: placeholderA.com
 TC-025    Full X-Forwarded series spoofing   Full headers             SC-001-A/N: B0 +A1                                       X-Forwarded-Host:
 TC-037    XFH priority vs Host/Forwarded     Priority test            …                                                        placeholderB.com
 TC-041    Forwarded quoted port              Forwarded port           SC-048-A/N: B1 + B2 + A1 + A2 + A3                       Forwarded: placeholderC.com
 TC-047    XFS + Forwarded host fallback      Server header
                                                                      Process:
                                                                                                   Dynamic Testing
observations against raw network captures and framework                                                   Host: originalhost
logs to ensure that the results are deterministic and reflect                                       TC-001          TC-002          ...         TC-055
the actual processing of the stack. This stage allows HALO                              SC-001-A                                    ...
to classify each server–framework configuration by whether                              SC-002-A                                    ...
                                                                                           ...          ...             ...         ...            ...
client-controlled host fields are accepted, overwritten, or                             SC-012-D                                    ...
ignored, and which request patterns and settings lead to these
outcomes.
                                                                      Output:
    From these observations, HALO groups the                                                        HNP-Vulnerable
server–framework outcomes that accept client-supplied                                              Configuration Sets
host values into a set of VSFPs. Each VSFP represents a                      TC-001 - SC-001-A      →         Output: placeholderA.com Host > (XFH / FWD)
distinct pattern in how a poisoned host becomes accepted by                  …
the stack. For each class, HALO identifies minimal request                   TC-039 - SC-005-N      →         Output: placeholderC.com        Forwarded > Host
                                                                             …
templates that trigger the behavior, giving a compact view                   TC-055 - SC-012-D      →         Output:     originalhost               Safe
of the conditions under which host drift occurs. HALO also
extracts rules that describe the framework’s priority order
among host-related fields and how this order changes under          Figure 3: Server–Framework Composition Engine of HALO
different server behaviors. Taken together, the classes, rules,
and templates serve as input to the next stages, which              or depend on deployment configuration, and a dataflow that
examine how host values propagate within frameworks and             passes through a guard may still reach an application sink if
surface in application logic.                                       the guard is disabled or misconfigured. By modeling flows in
                                                                    this way, HALO captures both guarded and unguarded uses
3.2. Framework Dataflow Analysis                                    of host metadata and produces per-framework API–guard
                                                                    indicators (HAGPs) that characterize where validation is
     The second stage of HALO analyzes how web frame-               enforced by design and where it can be bypassed or deferred
works read, pass, and apply host values once they reach             to the application.
the framework layer (Figure 2). This stage uses the trust               The analysis identifies three key elements: sources,
and priority rules derived from Stage I together with each          guards, and sinks. Sources extract host names from HTTP
framewor’s source code and documentation, analyzed in its           headers or configuration files. Guards enforce constraints
native environment. The goal is to identify how host values         such as host allowlists or trusted-proxy scopes. Sinks reuse
move through framework abstractions, which APIs depend              host information in visible contexts such as URL generation,
on them, and where checks are applied.                              redirects, cookies, or origin checks. Instead of relying on a
     HALO then performs static dataflow analysis of web             fixed set of predefined sinks (e.g., redirects, URL builders,
frameworks to track how host names move through frame-              or HTTP clients), HALO treats any API that consumes
work code and reach host-bearing APIs. It uses lightweight          host metadata as a potential sink. HALO then uses the
taint tracking over abstract syntax tree (AST) and control-         framework’s call graph to collapse wrapper functions and
flow graph (CFG) representations [11], [12], and builds             duplicate call paths so that each API is counted once. This
an interprocedural call graph that links user-facing APIs,          broader view allows it to reveal propagation paths that are
middleware, and routing modules. This allows HALO to                not covered by traditional sink lists and would otherwise
trace how host values pass through parameters, variable def-        remain undocumented. Guards are detected from validation
initions, and return values, and how they are reconstructed         logic and configuration lookups, and their dominance is
or reused by components such as URL builders, redirect              computed on the control-flow graph: a guard dominates
handlers, and authentication helpers. During this process,          a source–sink pair if all feasible propagation paths pass
HALO records every guard it encounters, such as allowlists,         through it. When documentation and implementation dif-
normalization routines, or trusted-proxy checks, but does not       fer, HALO prioritizes the actual code behavior to reflect
stop the analysis at these points. Many guards are optional         real semantics. Reflection and middleware sequencing are
modeled conservatively to preserve execution order. Then           TABLE 3: Framework-level evaluation dimensions for as-
HALO empirically validates these sinks using the Stage I           sessing host-handling robustness. Each dimension is rated
harness. Each candidate is exercised in a minimal frame-           as Yes/Partial/No; AE1/AE2 are numerical counts.
work setup with controlled host values, allowing HALO to            ID        Dimension                 Meaning
determine whether its output reflects the tainted host. This
step confirms the sink’s actual behavior.                           FW-D1     Host validation supportBuilt-in logic for checking host
                                                                                                     names.
    Finally, HALO summarizes each framework as a                    FW-D2  Trusted-host enforcement Mandatory allowlist for ac-
reusable set of API–guard indicators (HAGPs), capturing                                              cepted hosts.
its default trust behavior in a uniform form for later anal-        FW-D3  Host normalization        Canonicalization of host format
ysis. From these models, HALO derives ten evaluation                                                 before reuse.
dimensions that characterize the robustness of each frame-          FW-D4  Default header acceptance How the framework treats for-
                                                                                                     warded headers by default.
work’s host-handling design. As shown in Table 3, eight             FW-D5  Forwarded-header control User-facing options to enable
categorical dimensions (FW-D1–FW-D8) describe whether                                                forwarded-header handling.
the framework enforces host validation, applies trusted-host        FW-D6  Forwarded-header checks Built-in verification or filtering
checks, accepts or verifies forwarded headers, normalizes                                            of forwarded headers.
host format, and documents these behaviors accurately. Two          FW-D7  Complete guard path       Whether all host flows pass
                                                                                                     through a protective guard.
quantitative metrics (FW-AE1 and FW-AE2) measure the                FW-D8  Documentation warnings    Whether documentation alerts
number of APIs that reconstruct or reuse host authority and                                          developers to host-related risks.
the subset that lack validation or guard logic.                     FW-AE1 Host-name API exposure Count of APIs that reconstruct
    FW-D1 and FW-D2 capture the basic boundary checks                                                or reuse host authority.
applied to the Host header, indicating whether the frame-           FW-AE2 Unvalidated exposure      Count of such APIs without val-
                                                                                                     idation or guard logic.
work validates it and whether an allowlist is enforced before
the value is reused. FW-D3 and FW-D4 reflect how the
framework processes different forms of host input, including       goal is to quantify how often host-name trust inconsisten-
whether it normalizes host format and whether forwarded            cies arise in practice and, more importantly, to examine
headers are accepted by default. FW-D5 and FW-D6 show              what consequences they cause in real-world applications.
the degree of control and checking provided for these              Specifically, HALO analyzes how untrusted host names
headers, which determine how upstream proxies influence            flow into security-sensitive logic and manifest as concrete
reconstructed host authority. FW-D7 summarizes whether             vulnerabilities. These results provide empirical evidence of
these protections sit on all host-flow paths, while FW-D8          the practical impact of Host Name Poisoning.
records whether the official documentation alerts develop-             HALO takes three inputs. First, it uses the VSFP de-
ers to these behaviors and their deployment impact. To             rived from Stage I, which summarizes how web servers
compute these dimensions, HALO traverses each frame-               and frameworks reconstruct or forward host names under
work’s interprocedural call graph to locate host-bearing           different configurations. Second, it incorporates the per-
APIs, analyzes the dominance of guards along these paths,          framework HAGPs from Stage II, which capture how frame-
and determines whether validation is mandatory, optional,          works interpret, validate, and propagate host names in their
or missing. Proxy- and normalization-related properties are        default settings. Third, it analyzes a language-partitioned
inferred from framework code and confirmed through em-             corpus of open-source repositories cloned from GitHub and
pirical tests using the Stage I harness. For FW-D8, HALO           organized by primary language and declared framework
supplements static analysis with an LLM-assisted review            dependencies [13]. This setup allows each repository to be
of official documentation, extracting relevant descriptions        matched with the corresponding VSFP and HAGP, enabling
of host and proxy settings and cross-checking them against         consistent measurement across languages and frameworks.
implementation behavior.                                           While framework-level configurations can be fully captured
    Overall, these dimensions give a clear picture of how          from the source code, such as whether a project enables
each framework interprets, checks, and exposes host values.        proxy-related middleware or sets host validation options, the
They form the basis for Stage III, where HALO applies              server layer is typically not visible in the repository. HALO
the resulting HAGPs to large-scale repository analysis and         bridges this gap by pairing these observable framework-
measures Host Name Poisoning exposure in real applica-             level indicators (e.g., ProxyFix, trust_proxy) with
tions, showing how often these flows arise and the types of        the measured server behaviors captured in Stage I. In other
consequences they lead to.                                         words, although the repository may not explicitly specify
                                                                   whether it runs behind a proxy, HALO infers likely de-
                                                                   ployment models based on the framework’s configuration,
3.3. Application Measurement                                       middleware usage, and supplementary evidence from project
                                                                   documentation or deployment guides. It then composes these
    The final stage of HALO performs ecosystem-scale ap-           inferred models with the corresponding VSFP. This design
plication measurement by applying the configuration classes        enables HALO to reason about realistic cross-layer deploy-
(VSFPs) and framework semantics (HAGPs) derived from               ments even when server configurations are not explicitly
earlier stages to real-world repositories (Figure 2, right). Its   visible in the repository.
    HALO performs scalable static analysis to identify end-       publicly verifiable criteria to ensure coverage of common
to-end host-name flows in application code. In this stage,        deployment setups and language diversity.
the API–guard indicators (HAGPs) derived from Stage II            Web Servers. We use Nginx and Apache to represent origin-
serve as the starting points for taint tracking. Each indicator   side request termination. As of November 2025, W3Techs
defines a host-bearing API that introduces host metadata          reports Nginx and Apache serving 33.3% and 25.3% of
into the application, and HALO traces how these values            websites with known servers, respectively; Netcraft indepen-
propagate through function calls and data structures toward       dently observes Nginx at 25% [14], [15], [16]. These two
any reachable sink. For every repository, HALO builds             components capture the dominant origin stacks on the web.
lightweight program representations, including abstract syn-
tax trees (ASTs), call graphs, and module dependencies,           Programming Languages. We target nine major server-
and searches for complete dataflow paths that match this          side languages: PHP, Ruby, Java, JavaScript (Node.js),
propagation pattern. A flow is considered relevant when a         Scala, ASP.NET (C#), Python, Go, and Rust. According
host-bearing source reaches a sink without an intervening         to W3Techs, PHP remains by far the most widely used
guard and the repository’s configuration or documentation         server-side language, with Ruby, Java, JavaScript, ASP.NET,
indicates that the corresponding VSFP applies. To determine       Scala, and Python each contributing additional shares among
whether the sink may lead to an exploitable consequence,          websites with identifiable back-end stacks [17]. While Go
HALO employs a large language model to analyze the se-            and Rust appear only in a small fraction of surveyed sites,
mantics of the target API. If the final sink corresponds to an    they are increasingly prominent in cloud-native and security-
API that can produce observable effects, like redirects, URL      critical services. Together, these nine languages capture both
generation, authentication, or external network requests, the     traditional ecosystems and emerging high-assurance stacks.
LLM marks it as security-sensitive. These annotations are         Frameworks. Within each language, frameworks are chosen
then manually reviewed for correctness.                           through a multi-metric procedure combining six rankings:
    To handle large-scale analysis, HALO applies several          package downloads, dependent count, GitHub stars, forks,
practical optimizations. Before dataflow exploration, HALO        repository dependents, and package dependents. We take the
performs a prefiltering step that checks whether a reposi-        union of the top five in each ranking and apply maturity
tory invokes any APIs defined in the API–guard indicators         filters (downloads ≥10,000, stars ≥10,000, forks ≥1,000);
(HAGPs). Repositories that contain no such references, and        frameworks without telemetry are retained if they meet
therefore do not process host names, are skipped to reduce        GitHub criteria. This yields 32 frameworks across nine
unnecessary analysis. For the remaining projects, HALO            languages (see Table 6 for the final list). Package data
runs static analysis in parallel and limits call depth and        comes from native registries (PyPI Stats, npm, Packagist,
loop exploration to keep the analysis scalable. Each finding      RubyGems, crates.io, NuGet) and deps.dev. Combining het-
is stored with provenance information such as file path,          erogeneous metrics balances popularity, reuse, and transitive
relevant APIs, surrounding guard logic, and the assigned          adoption [18], [19].
VSFP. This metadata makes the results reproducible and
helps with efficient manual triage.                               Applications. For applications measurement, we sample
    Stage III produces a searchable database of pattern-          public GitHub repositories created between 2015 and 2025,
matched and validated cases, linking real repositories to con-    restricted to original (non-fork), active (archiving disabled)
crete HNP exploit chains. For each framework, HALO re-            projects with at least one commit in the past 12 months, a
ports metrics such as how many projects contain unguarded         primary language among our nine targets, and ≥100 stars.
host flows, how VSFPs are distributed, and how often vali-        These filters emphasize maintained, non-trivial projects and
dation succeeds. By combining VSFPs, HAGPs, and corpus-           align with prior large-scale mining practices using popular-
scale validation, this stage summarizes the practical impact      ity and activity as validity signals [19].
of Host Name Poisoning and provides an ecosystem-level
view of how often these issues occur and what consequences        4.2. HALO Implementation
they can produce.
                                                                      HALO is implemented as a unified framework that
4. Implementation                                                 combines dynamic composition testing, static taint analy-
                                                                  sis, and large-scale repository scanning. The prototype is
                                                                  written in Python and QL, using CodeQL v2.23.3 with
    We implemented HALO as a measurement pipeline that
                                                                  Python 3.12 [20]. Because CodeQL does not support PHP,
follows the design in Section §3. In this section, we describe
                                                                  we use Semgrep in taint mode with custom rules that en-
how we built the pipeline in practice.
                                                                  code our API–guard indicator (HAGP) model [21]. Semgrep
                                                                  outputs are normalized to the same schema as CodeQL
4.1. Dataset Selection                                            results so that VSFPs and HAGPs remain consistent across
                                                                  languages. We further extend CodeQL’s dataflow libraries
    HALO’s dataset consists of web servers paired with            with rules tailored to host-handling behavior.
major frameworks, together with a large GitHub corpus                 Host-related operations are modeled as taint steps that
for ecosystem-scale analysis. The selection follows simple,       track host accessors, server-side guards, and authority-
                            TABLE 4: [RQ1] Representative zero-day HNP cases across languages.

 Project                Language   Stars   Source → Sink                        Consequence                      CVE ID

                                           get_redirect_url()
 webssh                 Python      5K                                          HTTPS redirect hijack        CVE-2025-65455
                                           → self.redirect()
                                           url_for(..., _externalT̄rue)
 flask-base             Python     3.1K                                         Authentication Bypass        CVE-2025-63771
                                           → mail.send()
                                           req.headers.host
 carbon                   JS       35.8K                                        SSRF                         CVE-2025-65461
                                           → https://$host/api
                                           ctx.request.origin
 easy-mock                JS       9.03K                                        Resource URLs Corruption            –
                                           → ctx.body.path
                                           req.get("host")
 apihub                   JS       8.5K                                         Open Redirect                CVE-2025-69892
                                           → link()
                                           req.get(’host’)
 BrowserBox               JS       3.7K                                         Link hijacking               CVE-2025-63773
                                           → makeLoginLink()
                                           $_SERVER[’HTTP_HOST’]
 WDScanner               PHP       2.1K                                         SSRF                         CVE-2025-65452
                                           → url()
                                           $_SERVER[’REQUEST_URI’]
 wordpress-12factor      PHP       274                                          Stored HNP                          –
                                           → header("Location: $url")
                                           DomainUtils.getCookieDomain()
 DataSphereStudio        Java      3.2K                                         Cookie Manipulation          CVE-2025-65447
                                           → Set-Cookie: Domain
                                           Request.Host
 url-shortener-app        C#       150                                          Persisted Link Hijack        CVE-2025-65460
                                           → ShortenUrls.Add()
                                           r.Header.Get
 traefik-forward-auth     Go       2.3K                                         OAuth Redirect               CVE-2025-63774
                                           → AuthCallbackHandler()
                                           req.connection_info().host()
 actix-web-lab           Rust      122                                          Open Redirect                       –
                                           → https://{hostname}{path}
                                           request.host_with_port
 Hunt3r                  Ruby      170                                          Authentication Bypass        CVE-2025-63764
                                           → meshs.url()


bearing sinks. Stage II performs static analysis on each           and manual review. All components interoperate through
framework using CodeQL and Semgrep for PHP, with inter-            versioned JSON schemas that record flow patterns, VSFPs,
procedural rules and flow-state annotations to identify paths      HAGPs, and provenance information, ensuring consistent
where host values reach security-sensitive APIs without vali-      and reproducible integration across dynamic, static, and
dation. Stage II produces structured flow patterns describing      documentation-based analyses. The full implementation and
sources, guards, sinks, and context.                               workflow are available in our anonymous artifact repository
    Stage III applies static analysis to applications.             (https://anonymous.4open.science/r/halo-demo-7D50).
Framework-level sinks found in Stage II become new taint
sources, and we track how applications reuse them across           5. Evaluation
thousands of repositories. This stage automates repository
retrieval, database construction, taint-query execution, and          We evaluate HALO to understand the prevalence, causes,
result aggregation in a distributed workflow. Stage I pro-         and real-world impact of HNP across modern web ecosys-
vides configuration context for forwarded-header behavior,         tems, and to examine where false positives arise in our
and Stage II patterns are serialized as JSON guides for            analysis. This section reports our measurement results and
application-level analysis. To preserve realistic call relation-   addresses five research questions.
ships, HALO extends CodeQL’s resolution logic to account           RQ1 [Zero-day]. How many previously unknown HNP vul-
for framework abstractions such as middleware chains, de-          nerabilities can HALO uncover, and what attack scenarios
pendency injection, and routing contexts. We use a large           do they represent?
language model (GPT-5) in two narrowly scoped auxiliary
tasks. First, given official framework documentation, the          RQ2 [Root Cause]. What cross-layer inconsistencies be-
model acts as a reading assistant to locate and summarize          tween servers and frameworks give rise to HNP?
host and proxy handling semantics (e.g., forwarded header          RQ3 [Framework Measurement]. How do mainstream
processing). These outputs only support rule implementa-           frameworks process host metadata, and how many expose
tion, are cross-checked against code, and are not treated          host-bearing APIs?
as vulnerability evidence. Second, in Stage III, given static
flow context, the model labels whether a candidate sink            RQ4 [Ecosystem Distribution]. How is HNP distributed
corresponds to a security-relevant consequence under our           across languages, frameworks, and real-world project?
threat model, with a short rationale. This signal is used          RQ5 [False Positives]. When HALO flags a host-related
only for triage. HALO does not rely on LLM output alone;           flow, how often does it not constitute a real vulnerability,
all reported vulnerabilities are validated by the pipeline         and what causes these false positives?
5.1. RQ1: Zero-day Vulnerabilities                                 or issuing backend requests, causing internal actions to be
                                                                   steered by attacker-controlled input.
    HALO analyzes nine languages, 32 frameworks, and
                                                                   Resource-URL Corruption. Some services reconstruct
9,860 open-source repositories, uncovering 361 potential
                                                                   storage paths or API endpoints from a derived origin. In
HNP vulnerabilities. From a manual review of 100 top-
                                                                   easy-mock, the system combined a base origin with a file
ranked cases, we confirmed 82 exploitable zero-days. To ex-
                                                                   path to form an upload URL. A forged host replaced the
plain how these vulnerabilities arise in practice, we organize
                                                                   origin entirely, so the application served attacker-controlled
the confirmed cases into three categories based on how ap-
                                                                   URLs as if they were its own resources, causing asset
plications consume the host value: user-driven flows, which
                                                                   breakage and enabling malicious file delivery in downstream
directly affect links or redirects shown to users; server-driven
                                                                   workflows.
flows, where the poisoned host influences backend decisions;
and persistent or cross-request flows, where the forged value      Server-side Request Forgery (SSRF). In WDScanner,
persists beyond the triggering request.                            PHP superglobals containing the host value were fed directly
                                                                   into backend scanning logic. A forged host changed where
5.1.1. User-driven Flows. These cases change links or redi-        the scanner sent its internal requests. Because these scanners
rects that users see and follow. A forged host directly poison     often run with elevated privileges or have access to internal
the URLs that applications present to users, so the impact         networks, the forged value exposed internal admin panels
emerges immediately when a victim clicks the generated             and diagnostic endpoints that were never meant to handle
link.                                                              user-controlled input.
Authentication Bypass. Framework helpers that generate
                                                                   5.1.3. Persistent and Cross-request Flows. These cases
absolute URLs for password resets or invitation flows often
                                                                   persist across requests, so a single forged host can influence
rely on the request host. In several Flask and FastAPI
                                                                   future interactions or affect users who never saw the original
projects, a forged Host header caused these helpers to
                                                                   spoof.
construct reset or login links that pointed to attacker do-
mains. The application believes it is producing a valid            Persistent Host Name Poisoning. Some applications store
callback target, so no further checks are triggered. When          generated URLs in databases, logs, or content fields. In
users follow these links, their reset tokens or login callbacks    wordpress-12factor, poisoned URLs written into post
are sent directly to the attacker, allowing account takeover       content or metadata reappeared when other users viewed
even though the underlying reset logic remains unchanged.          or edited the entry. This turned one spoofed request into a
                                                                   durable redirect or content-modification issue that survived
OAuth and Callback Manipulation. OAuth handlers
                                                                   restarts and caching layers.
frequently reconstruct the origin to check redirect
parameters or to issue authorization callbacks. In                 Cookie-domain Manipulation. Some enterprise systems
traefik-forward-auth, forwarded headers are                        derive the Domain= attribute of cookies from the re-
used as provided, allowing an attacker to replace the              quest’s host value to support multi-tenant deployments. In
origin used when completing the OAuth flow. This causes            DataSphereStudio, a forged Host header caused the
the framework to send the authorization callback to an             server to emit a session cookie whose domain matched the
attacker-controlled endpoint, exposing authorization codes         attacker-controlled hostname. Because browsers store this
or tokens without requiring any additional interaction from        cookie and send it on any later request to that domain, the
the victim.                                                        attacker only needs the victim to visit the attacker domain
                                                                   at any point—no crafted link is required. The browser then
Link Hijacking and Open Redirects. In several JavaScript
                                                                   attaches the mis-issued session cookie to the attacker’s site,
and Rust middlewares that generate absolute redirect URLs
                                                                   giving the attacker direct access to the victim’s session [22].
the target is constructed from connection metadata such as
Forwarded, X-Forwarded-Host, or Host. If proxy-                    Persistent Link Hijack. Link-management systems that
trust settings are misconfigured, the resulting Location           store absolute URLs are vulnerable at creation time. In
header can be influenced by an attacker-controlled origin          url-shortener-app, submitting a request with a forged
by simply appending the request path. When applications            host caused the system to record a poisoned origin inside the
surface such URLs to users like login links, confirmation          shortlink entry. All subsequent users who followed that short
pages, or notification emails, this behavior creates a practical   link were redirected to attacker pages until the entry was
open-redirect and phishing vector. Developers should prefer        manually corrected, creating a long-lived phishing surface.
relative redirects when possible, and otherwise enforce an             These cases illustrate how reusing the host without
allowlist for the canonical origin while configuring trusted-      validation leads to different consequences depending on
proxy settings correctly.                                          where the value is consumed. They also show that unsafe
                                                                   host handling arises across many parts of the stack, includ-
5.1.2. Server-driven Flows. Here the poisoned host influ-          ing utilities, dashboards, authentication modules, AI panels,
ences internal server behavior rather than user-facing links.      and infrastructure components. All confirmed vulnerabilities
The request appears normal to the user, but the server later       were reported to maintainers under coordinated responsible
relies on the forged value when generating resource URLs           disclosure.
TABLE 5: [RQ2] Vulnerable scenarios and triggering test cases. Each row lists a scenario (SC) that exhibited HNP, the
number of distinct test cases (TC) that triggered it, and the corresponding TC identifiers.
 Scenario (SC)     #Polluted Cases    Triggering Test Cases (TC)
                     (TC Count)
 SC-001-D                27           TC-001–002, 005–010, 012–013, 016–018, 026–036, 039–041, 042–045
 SC-004-D                33           TC-001–005, 006–011, 012, 014–018, 026–027, 031–035, 037, 039–043, 045–046, 054
 SC-005-D                30           TC-001–012, 013–018, 026–027, 031–035, 037, 039–043, 045–046, 054
 SC-001-A/N              32           TC-001–002, 005–010, 012–013, 016–018, 026–036, 039–041, 045, 048, 051–053, 055
 SC-005-A/N              29           TC-001–003, 005–012, 014–018, 026–027, 031–035, 037, 039–041, 045, 048–049, 051
 SC-006-A/N              29           TC-001–003, 005–012, 014–018, 026–027, 031–035, 037, 039–041, 045, 048–049, 051
 SC-009-A/N               7           TC-003, 011, 015, 037, 046, 049, 054
 SC-012-A/N              30           TC-001–002, 005–010, 012–013, 016–018, 026–036, 039–041, 045, 048, 051–052
 SC-015-N                 7           TC-003, 011, 015, 037, 046, 049, 054
 SC-007-A                31           TC-001–002, 005–010, 012, 016–018, 026–030, 031–036, 039–041, 043–045, 048, 051–053, 055
 SC-010-A                31           TC-001–002, 005–010, 012, 016–018, 026–030, 031–036, 039–041, 043–045, 048, 051–053, 055
 SC-013-A                31           TC-001–002, 005–010, 012, 016–018, 026–030, 031–036, 039–041, 043–045, 048, 051–053, 055
 SC-014-A                31           TC-001–002, 005–010, 012, 016–018, 026–030, 031–036, 039–041, 043–045, 048, 051–053, 055
 SC-015-A                31           TC-001–002, 005–010, 012, 016–018, 026–030, 031–036, 039–041, 043–045, 048, 051–053, 055



5.2. RQ2: Cross-Layer Inconsistency                                 tion 5.3 then analyzes how these inconsistencies propagate
                                                                    into framework APIs and application logic.
    We investigate how interactions between web servers
and frameworks introduce inconsistent host authority se-            5.3. RQ3: Framework Measurement
mantics that can enable HNP. Stage I systematically pairs
each framework configuration with 108 deployment variants,
replays 55 canonical requests, and observes whether the                 We examine how mainstream web frameworks handle
framework accepts a forged host as authoritative. Across all        host metadata using the eight defense dimensions and the
combinations, HALO identifies 19 recurring scenarios with           two API-level metrics introduced earlier. Table 6 summa-
authority drift, which are summarized as distinct VSFPs in          rizes the results across 32 frameworks.
Table 5. These 19 scenarios represent the intersection of all           FW-D1 and FW-D2 capture the basic boundary checks
tested frameworks and serve as representative results: each         applied to the Host header. Many frameworks offer a
authority-drift pattern appears in at least one framework, but      validation function or an allowlist, but these mechanisms
some frameworks expose fewer variants due to missing or             are often optional and must be enabled by developers. Only
disabled proxy-aware modes.                                         a few frameworks, such as Django and Play, enforce trusted-
    We find three structural causes of cross-layer incon-           host policies by default, and these systems show noticeably
sistency. First, trust assumptions differ across layers. In         lower exposure [23], [24].
our evaluated deployments, servers and frameworks do not                FW-D3 and FW-D4 describe how frameworks process
always treat forwarded host bearing inputs the same way:            host input before reuse. Most frameworks preserve the host
some server configurations pass such values downstream              value as received and perform only minimal normaliza-
with limited interpretation, while some framework modes             tion; lowercasing or port stripping typically occurs only
may use them when deriving the effective request host.              when explicitly implemented by the framework or enabled
This mismatch can allow a client supplied value to become           through configuration [25], [26]. Default handling of for-
authoritative at the framework layer. Second, layers differ in      warded headers also varies widely across ecosystems. Some
what host bearing information they preserve and how they            frameworks ignore forwarded headers unless proxy-related
resolve precedence among it. When multiple values such              settings are enabled, while others expose middleware or
as Host, X-Forwarded-Host, or :authority remain                     configuration options that enable proxy-aware behavior. [27],
visible downstream, host validation and host resolution may         [28], [29]. These differences determine whether upstream
consult different fields, creating ambiguity and enabling           proxies participate in reconstructing the effective host name
authority drift. In other deployments, host information is          or whether the framework trusts incoming headers directly.
collapsed earlier, which reduces the opportunity for drift              FW-D5 and FW-D6 measure how frameworks control
to accumulate across layers. Third, proxy related behavior          and check forwarded headers. Although several frame-
varies across stacks. In some deployments, protocol and             works allow trusted-proxy configuration, deeper verifi-
proxy metadata can influence the host value ultimately ex-          cation of forwarded fields remains uncommon. In our
posed to the application; in others, the effective host remains     evaluated settings, most accept X-Forwarded-Host,
more stable unless the framework explicitly trusts forwarded        X-Forwarded-Proto, and related headers without veri-
host bearing headers.                                               fying their provenance, leaving safety dependent on deploy-
    Overall, deployments that enforce a single precedence           ment choices [30], [31], [32], [33]. Go and Rust frameworks
and a validated proxy chain can remove authority drift. Sec-        generally expose fewer controls and rely more heavily on
TABLE 6: Framework-level evaluation across 32 frameworks, scored as Yes ( ), Partial (G
                                                                                      #), or No (#). Host-name API
Exposure columns are AE1 (API count) and AE2 (Unvalidated), both as counts.
                   Framework Info                                        Defense Dimensions (D1–D8)                   API Exposure
                                       Stars   Forks
  #   Name                Lang.                        D1        D2       D3     D4      D5      D6     D7      D8     AE1    AE2
                                        (k)     (k)
 1    FastAPI             Python       91.4     8.1              #        #              #       #                      16      4
 2    Django              Python       85.6    33.2                                      G
                                                                                         #       #                      19      3
 3    Flask               Python       70.7    16.6              #                       #       #                      15      4
 4    Tornado             Python       22.3     5.5    #         #                               #       #      #       18     18
 5    Sanic               Python       18.5     1.6    #         #        #              #               #      G
                                                                                                                #       11     11
 6    aiohttp             Python       16.1     2.1    #         #        #              #       #       #      G
                                                                                                                #        7      7
 7    Starlette           Python       11.6     1.1              #        #              #       #                      16      4
 8    Laravel             PHP          34.2    11.6              #                       #                              50      2
 9    Symfony             PHP          30.7     9.7              #                       #                              20      4
 10   Yii                 PHP          14.3     6.9              #        #              #                              21      4
 11   Slim                PHP          12.2     2.0    #         #                       #       #       #      #       17     17
 12   NestJS              JS           73.3     8.1    #         #        #                              #      #       13     13
 13   Express             JS           68.1    21.4    #         #        #                              #      #        6      6
 14   Koa                 JS           35.7     3.2    #         #        #                      G
                                                                                                 #       #      G
                                                                                                                #       17     17
 15   Fastify             JS           34.9     2.5    #         #        #                      G
                                                                                                 #       #      G
                                                                                                                #        7      7
 16   Sails               JS           22.9     1.9    #         #        #                              #      #        8      8
 17   Hapi                JS           14.7     1.4    #         #        #              #       #       #      #        9      9
 18   Rails               Ruby         57.8    22.0              G
                                                                 #        #       #      #       G
                                                                                                 #                      18      2
 19   Sinatra             Ruby         12.4     2.1              G
                                                                 #        #       #      #       G
                                                                                                 #                      17      2
 20   Rocket              Rust         25.5     1.6              #        #              #       G
                                                                                                 #       #              15     13
 21   Actix Web           Rust         23.8     1.8    #         #        #       #      #       #       #      G
                                                                                                                #       18     18
 22   Axum                Rust         23.6     1.3    #         #        #       #      #       #       #      G
                                                                                                                #       44     44
 23   ASP.NET Core        C#           37.3    10.5              #                                                      34      4
 24   Spring Boot         Java         78.8    41.6    #         #        #       G
                                                                                  #                      #      G
                                                                                                                #        3      3
 25   Spring MVC          Java         59.1    38.8    #         #        #                      #       #              21     21
 26   Play Framework      Java         12.6     4.1                                      #                              14      2
 27   Play Framework      Scala        12.6     4.1                                      #                              14      2
 28   Gin                 Go           86.8     8.5    #         #        #       #      #               #      G
                                                                                                                #       14     14
 29   Fiber               Go           38.3     1.9    #         #        #       #                      #      G
                                                                                                                #       17     11
 30   Beego               Go           32.3     5.6    #         #        #       #      #       #       #      #       19     19
 31   Echo                Go           31.7     2.3    #         #        #       #      #       G
                                                                                                 #       #      G
                                                                                                                #       16     16
 32   Iris                Go           25.6     2.5    #         #        #              #       G
                                                                                                 #       #      G
                                                                                                                #       14     14

upstream servers, which leads to predictable patterns in their        as ASP.NET Core exposes a broader but more consistently
exposure.                                                             protected host-flow surface, while Spring Boot exposes a
    FW-D7 reflects whether host flows pass through a re-              narrower API surface. Across ecosystems, host-handling
quired guard. Mandatory coverage is unusual: middleware               remains inconsistent and mostly opt-in. JavaScript, Go, and
chains, route-specific logic, and optional components often           Rust frameworks rely on incomplete mechanisms and per-
create bypasses that let untrusted host values reach URL              missive defaults, while PHP, C#, and Scala exhibit clearer
builders, redirection helpers, or authentication code even            defenses and more explicit security policies [38], [39],
when a guard exists elsewhere.                                        [40]. Python, Java, and Ruby fall between these extremes:
    FW-D8 captures whether documentation warns develop-               each avoids some parsing issues through different protective
ers about host-handling risks. Documentation quality varies           mechanisms but seldom enforce canonicalization or proxy
markedly across ecosystems. Some frameworks provide                   checks. As a result, similar patterns appear within ecosys-
clear guidance on host validation and proxy configuration,            tems but differ sharply across them.
while others describe defaults that appear safer than what the
implementation actually enforces [34], [35], [36], [37]. No-          Insights. Viewed as a whole, these results reveal deeper
tably, Ruby on Rails offers detailed and prominently surfaced         structural reasons for why HNP persists across frameworks.
guidance on both Host header validation and trusted-proxy             Modern ecosystems were built on different assumptions
configuration. This clarity helps reduce misconfiguration             about where trust should begin, and those assumptions
risk and is consistent with fewer observed host related issues        continue to shape host-handling behavior. Some frameworks
in Rails based projects.                                              treat the host name as part of their security boundary and
    The API-level metrics reinforce these trends. Across              route all flows through a central authority, while others fol-
all frameworks, HALO identifies 548 APIs that reuse host              low lighter middleware-first designs that expose raw request
metadata, and more than half propagate host values with-              fields and leave trust to the surrounding environment [41],
out a guard. Python, JavaScript, PHP, and Go account for              [42], [43]. Once these patterns took hold, they propagated
most of this unvalidated surface, while frameworks such               through the helpers that applications rely on: functions
like request.host or req.headers.host became                     feature prominently, as they routinely return absolute URLs
the default way to construct absolute URLs, redirects, or        to browsers or automation scripts, making host misuse more
callback links, and applications inherited their assumptions     visible and more likely to propagate. These application-level
without revisiting them. Forwarded headers introduce fur-        patterns align with broader ecosystem signals. Frameworks
ther variation, as different frameworks interpret them differ-   with permissive proxy defaults or limited documentation on
ently and documentation often suggests safer defaults than       host handling tend to expose more projects, while frame-
the implementation provides. Taken together, these structural    works with large dependency networks, for example Express,
choices explain the uneven defenses observed in D1–D8 and        FastAPI, Rails, and Gin, spread these assumptions widely
the concentration of unguarded flows in AE1 and AE2. HNP         across downstream repositories.
persists because the abstractions that carry host metadata           Overall, the data show that HNP arises from shared
were never designed around a common trust model, and             assumptions about how host metadata is handled across
applications continue to rely on them without a clear sense      many ecosystems, and HALO reveals how these assumptions
of where authority should be established.                        are carried through languages, frameworks, and application
                                                                 types, shaping the distribution of HNP in real-world code.
5.4. RQ4: Ecosystem-Scale Distribution
                                                                 5.5. RQ5: False Positives
    Most HNP cases come from JavaScript and Python,
which together account for over 81% of the affected reposi-          To understand how often HALO produces false pos-
tories. This skew reflects both the scale of these ecosystems    itives, we validated 100 representative repositories. Each
and the way their frameworks handle host metadata. Express,      project was deployed in a controlled local environment using
Hapi, Flask, and FastAPI often read host fields directly and     its documented configuration. We exercised the running
reuse them when constructing redirects, absolute URLs, or        instance with the Stage I request templates and checked
authentication links, making unvalidated hosts surface easily    whether forged host values appeared in boundary-visible
in common application flows [44], [45], [46]. PHP shows          outputs. All tests were performed in isolated sandboxes, and
a similar pattern in account-recovery and login logic that       only public code was used.
assembles links from host-related server variables.                  Among the 100 cases, 82 reproduced the expected HNP
    Smaller ecosystems appear less often, but for different      behavior. The remaining 18 propagated the host value cor-
reasons. In Java, C#, and Rust, frameworks such as Play          rectly but reached sinks that fall outside our attacker model.
and ASP.NET Core provide clearer guidance and stricter           16 cases required capabilities we do not assume, such as
defaults, which reduces the number of unvalidated host           observing victim traffic or accessing internal responses, and
flows that reach application code [47], [48]. In Go and          2 cases could not be fully exercised due to setup constraints.
Rust, host handling is often concentrated in gateway or          We therefore do not count these flows as vulnerabilities even
infrastructure components rather than in general-purpose         though HALO extracted their host paths correctly.
applications, and many frameworks provide only minimal               These results indicate that the false positives come
validation by default. Scala stands out because its primary      mainly from how consequences are classified. HALO con-
web framework, Play, enforces strict host filtering by de-       sistently identifies the code paths through which host data
fault, and projects built on top of it rarely expose host-       moves, and the filtering step keeps its outputs aligned with
dependent logic; as a result, no Scala applications in our       the threat model. The validation confirms that HALO gives
dataset exhibited HNP issues. As a result, these ecosystems      a reliable view of HNP without overstating risk.
show fewer cases not because they are inherently safer, but
because host reconstruction is concentrated in a narrower        6. Discussion
class of projects. The ten most frequent match rules account
for more than half of all cases, and most of them come from      Mitigation Principles. HNP reflects a fundamental incon-
familiar helpers, such as request.host and url_for               sistency in how different parts of the web stack reconstruct
in Flask or req.headers.host in Express [49], [50].              and trust host names. Effective mitigation requires unified
These helpers appear in templates, starter kits, and routine     and consistent semantics at every layer, including servers
development patterns, so the same assumptions about host         that forward requests, frameworks that rebuild origins, and
trust are reproduced across many projects.                       applications that use the host name. Frameworks should
    Once these patterns are present, the type of application     provide built-in host validation, disable forwarded-header
determines how the issue shows up in practice. A large           trust by default, and define clear precedence among Host,
share of recent cases comes from AI agent interfaces and         :authority, X-Forwarded-Host and Forwarded
automation consoles, where frameworks such as FastAPI            fields. Validation should occur early in the request path,
and Hapi often echo request.headers.host in API                  with proxy scopes explicitly bounded by allowlists or trusted
responses or status pages [44], [46]. Because these tools        network ranges. Developers need to keep configuration con-
present absolute URLs directly to users or scripts, any          sistent across servers, frameworks, and applications. All
poisoned host is immediately visible and easy to follow.         external URLs, such as redirects, OAuth callbacks, password
    High-star consumer-facing tools like code-sharing ser-       resets, and resource links, should come from verified con-
vices, visualization dashboards, and modern AI UIs also          figuration values rather than from request headers. Enabling
and testing built-in validation or trusted-proxy mechanisms        front ends, and CDN deployments, leading to origin confu-
as part of deployment helps ensure deterministic authority         sion and redirection abuse [51], [52], [53]. These efforts
reconstruction and prevents the propagation of unverified          demonstrate real security failures but focus on a limited set
host data across layers.                                           of consequences. Broader effects, including open redirect,
Ethics and Disclosure. We ensure that our study complies           OAuth link hijacking, SSRF, and authentication bypass,
with established ethical standards for security research. All      remain less explored, as do the cross-layer conditions that
analyzed code was obtained from publicly available sources,        enable them. Our work addresses this gap by systematically
such as open-source GitHub repositories, in accordance with        measuring host-handling semantics across server, frame-
the platforms’ terms of service. At no point did our analysis      work, and application layers, and by characterizing when
access private data, credentials, or user information. For         and why Host Name Poisoning becomes exploitable in real
vulnerability disclosure, we followed responsible reporting        deployments. Compared with prior studies that focus on
practices and notified affected maintainers of all identified      individual manifestations, HALO provides a broader con-
HNP vulnerabilities prior to any public disclosure.                sequence space and a principled cross-layer explanation of
                                                                   the underlying trust inconsistencies.
Prompt Sensitivity Experiments. Since HALO uses GPT-
                                                                   Security Studies on Web Frameworks. Prior work on
5 for final sink classification, its outputs may in principle
                                                                   web framework security spans several directions. Oliveira
be sensitive to prompt wording. To mitigate this risk, we
                                                                   et al. benchmark frameworks under DoS attacks, produc-
treat LLM predictions as auxiliary signals and manually
                                                                   ing a resilience ranking [54]. Salas-Zárate et al. compare
review all labels before reporting vulnerabilities. We conduct
                                                                   frameworks and their design choices [55]. Duisebekova et
a small sanity check using three representative sink examples
                                                                   al. analyze Django’s built-in protections, including CSRF
(redirect, URL generation, and non-sensitive local operation)
                                                                   defenses and ALLOWED_HOSTS validation [56]. Other stud-
and three semantically equivalent prompt variants, resulting
                                                                   ies examine isolated mechanisms such as proxy handling
in nine test instances. Across all cases, the model produces
                                                                   or URL construction, but remain framework-specific and
consistent sensitivity labels, indicating limited sensitivity to
                                                                   lack cross-stack comparison. Our work complements these
modest prompt variation in this setting. For reproducibil-
                                                                   directions by analyzing how frameworks interpret and reuse
ity, we include the prompt variants and example inputs in
                                                                   host information across stacks. We study their handling
Appendix C.
                                                                   of Host and X-Forwarded-*, identify dependent APIs,
Limitations. Our study provides a large-scale view of Host         and measure how server signals influence URL construction
Name Poisoning across modern web stacks; yet several               and callbacks. This cross-framework view connects host-
limitations remain. First, our dataset covers applications built   handling behavior to downstream consequences and clarifies
with 32 mainstream web frameworks across nine major                the server–framework conditions under which they emerge.
programming languages. While this scope captures much
of today’s open-source web ecosystem, smaller languages,           8. Conclusion
niche frameworks, and non-framework-based applications
fall outside our measurement scope and may exhibit different           We introduced HALO, a system that measures how
host-handling behaviors. Second, the dynamic validation            inconsistencies in host handling across servers, frameworks,
stage reproduces realistic proxy and framework composi-            and applications lead to Host Name Poisoning. By com-
tions but does not include proprietary deployments, com-           bining dynamic tests with static dataflow analysis, HALO
mercial appliances, or multi CDN infrastructures that are          exposes where host values are reconstructed, trusted, and
inaccessible for testing. Moreover, deployment models are          reused. Applied to 9,860 open-source projects, it surfaces 82
inferred from repository-visible artifacts (e.g., code, config-    previously unknown vulnerabilities, 52 of which have been
uration, and documentation), which may not fully reflect           assigned CVEs, with consequences such as open redirects,
external infrastructure settings.                                  OAuth hijacking, SSRF, and authentication bypasses. Our
                                                                   findings clarify the root causes of host-name trust drift
7. Related Work                                                    and offer guidance for building safer defaults in servers,
                                                                   frameworks, and applications.

Host-Header Security. Prior work has examined individual           Ethics considerations
symptoms of improper host handling. Chen et al. systemati-
cally mapped ambiguities in how servers and frameworks                 We follow standard ethical guidelines for security re-
process Host and related authority fields, showing how             search. All analyzed code came from publicly available
multiple or malformed values surface as routing inconsis-          open-source repositories in compliance with platform terms
tencies, cache poisoning, and origin confusion [5]. At the         of service. No private data, credentials, or production sys-
application layer, Innocenti et al. measured password-reset        tems were accessed. Dynamic testing was conducted in
workflows at scale and found that reset links constructed          isolated environments with rate-limited traffic. Identified
from unvalidated Host values can be redirected to attacker         vulnerabilities were responsibly disclosed to affected main-
domains, enabling account takeover [4]. Additional studies         tainers before any public release, and all artifacts were
show that host metadata can affect redirect handlers, HTTPS        anonymized to preserve review anonymity.
LLM Usage Considerations                                                            [12] F. Yamaguchi, N. Golde, D. Arp, and K. Rieck, “Modeling and
                                                                                         discovering vulnerabilities with code property graphs,” in Proc. IEEE
                                                                                         Symp. on Security and Privacy (S&P), 2014.
     LLMs were used in this study to support methodological
and editorial tasks, and all outputs were reviewed and ver-                         [13] G. Gousios and D. Spinellis, “Ghtorrent: GitHub’s data from a fire-
                                                                                         hose,” in Proc. Int’l Working Conf. on Mining Software Repositories
ified by the authors. Methodologically, an LLM assisted in                               (MSR), 2012.
summarizing framework documentation and helping prior-
                                                                                    [14] W3Techs, “Usage statistics and market share of nginx,” https://
itize potential sink APIs for further analysis. LLMs were                                w3techs.com/technologies/details/ws-nginx, 2025, statistics page for
used for editorial purposes in this manuscript, and all                                  Nginx usage, accessed Nov. 10, 2025.
outputs were inspected by the authors to ensure accuracy                            [15] ——, “Usage statistics and market share of apache,” https://w3techs.
and originality. All technical decisions, classifications, and                           com/technologies/details/ws-apache, 2025, statistics page for Apache
measurements were independently validated by the authors.                                usage, accessed Nov. 10, 2025.
No private data was provided to any model, and no model                             [16] Netcraft, “October 2025 web server survey,” https://news.netcraft.
training was involved.                                                                   com/archives/category/web-server-survey/, 2025, monthly web server
                                                                                         market share report, accessed Nov. 10, 2025.
                                                                                    [17] W3Techs, “Usage statistics of server-side programming languages for
Acknowledgment                                                                           websites,” https://w3techs.com/technologies/overview/programming_
                                                                                         language, 2025, server-side language distribution, accessed Nov. 10,
    We would like to thank anonymous reviewers and the                                   2025.
shepherd for their helpful comments and feedback. This                              [18] Google Open Source Insights, “deps.dev: Api and public dataset,”
work was supported in part by the National Science Founda-                               https://deps.dev/, 2025, database and official documentation, accessed
tion (NSF) under grants CNS-21-54404 and CNS-20-46361.                                   Nov. 10, 2025.
The views and conclusions contained herein are those of                             [19] S. Koch, D. Klein, and M. Johns, “The fault in our stars: An analysis
the authors and should not be interpreted as necessarily                                 of github stars as an importance metric for web source code,” in Proc.
                                                                                         MADWeb Workshop (co-located with NDSS), 2024.
representing the official policies or endorsements, either
expressed or implied, of NSF.                                                       [20] P. Avgustinov, O. de Moor, M. P. Jones, and M. Schäfer, “Ql: Object-
                                                                                         oriented queries on relational data,” in Proc. European Conf. on
                                                                                         Object-Oriented Programming (ECOOP), 2016.
References                                                                          [21] G. Bennett, T. Hall, E. Winter, and S. Counsell, “Semgrep*: Im-
                                                                                         proving the limited performance of static application security testing
[1]   R. T. Fielding, M. Nottingham, and J. Reschke, “Http/1.1,” IETF,                   (sast) tools,” in Proc. 28th International Conference on Evaluation
      Tech. Rep. RFC 9112, 2022.                                                         and Assessment in Software Engineering (EASE ’24), 2024.
[2]   M. Thomson and C. Benfield, “Http/2,” IETF, Tech. Rep. RFC 9113,              [22] M. Steffens, C. Rossow, M. Johns, and B. Stock, “Don’t trust the
      2022.                                                                              locals: Investigating the prevalence of persistent client-side cross-
                                                                                         site scripting in the wild,” in Proc. Network and Distributed System
[3]   M. Bishop, “Http/3,” IETF, Tech. Rep. RFC 9114, 2022.                              Security Symposium (NDSS), 2019.
[4]   T. Innocenti, S. A. Mirheidari, A. Kharraz, B. Crispo, and E. Kirda,          [23] Django Software Foundation, “Allowed_hosts — django settings ref-
      “You’ve got (a reset) mail: A security analysis of email-based pass-               erence,” https://docs.djangoproject.com/en/5.2/ref/settings/#allowed-
      word reset procedures,” in Proc. Int’l Conf. on Detection of Intrusions,           hosts, 2025, official documentation, accessed Nov. 10, 2025.
      Malware, and Vulnerability Assessment (DIMVA), 2021.
                                                                                    [24] Lightbend,   “Allowedhostsfilter     —     play   framework     3.0
[5]   J. Chen, J. Jiang, H. Duan, N. Weaver, T. Wan, and V. Paxson, “Host                documentation,” https://www.playframework.com/documentation/3.
      of troubles: Multiple host ambiguities in http implementations,” in                0.x/AllowedHostsFilter, 2025, official documentation, accessed Nov.
      Proc. ACM Conf. on Computer and Communications Security (CCS),                     10, 2025.
      2016.
                                                                                    [25] Sanic Framework, “Sanic documentation: Core api,” https://sanic.
[6]   A. Petersson and M. Nilsson, “Forwarded http extension,” IETF, Tech.               readthedocs.io/en/stable/sanic/api/core.html, 2025, official documen-
      Rep. RFC 7239, 2014.                                                               tation, accessed Nov. 10, 2025.
[7]   K. Saric, F. Savins, G. S. Ramachandran, R. Jurdak, and S. Nepal,             [26] The Tornado Authors, “Tornado documentation: httputil module,”
      “Hyperlink hijacking: Exploiting erroneous URL links to phantom                    https://www.tornadoweb.org/en/stable/_modules/tornado/httputil.
      domains,” in Proc. The Web Conference (WWW), 2024.                                 html, 2025, official documentation, accessed Nov. 10, 2025.
[8]   S. Khodayari, K. Glauber, and G. Pellegrino, “Do (not) follow the             [27] Gin maintainers, “Gin documentation: Deployment guide,” https:
      white rabbit: Challenging the myth of harmless open redirection,” in               //gin-gonic.com/en/docs/deployment/, 2025, official documentation,
      Proc. Network and Distributed System Security Symposium (NDSS),                    accessed Nov. 10, 2025.
      2025.
                                                                                    [28] Microsoft, “Asp.net core documentation: Proxy and load balancer
[9]   T. Innocenti, M. Golinelli, K. Onarlioglu, B. Crispo, and E. Kirda,                scenarios,” https://learn.microsoft.com/en-us/aspnet/core/host-and-
      “Oauth 2.0 redirect uri validation falls short, literally,” in Proc. Annual        deploy/proxy-load-balancer?view=aspnetcore-9.0#other-proxy-
      Computer Security Applications Conf. (ACSAC), 2023.                                server-and-load-balancer-scenarios, 2025, official documentation,
[10] K. Shen, J. Lu, Y. Yang, J. Chen, M. Zhang, H. Duan, J. Zhang,                      accessed Nov. 10, 2025.
     and X. Zheng, “Hdiff: A semi-automatic framework for discovering               [29] Fastify Project, “Fastify documentation: Server reference —
     semantic gap attack in http implementations,” in Proc. IEEE/IFIP                    trustproxy option,” https://fastify.dev/docs/latest/Reference/Server/
     Int’l Conf. on Dependable Systems and Networks (DSN), 2022.                         #trustproxy, 2025, official documentation, accessed Nov. 10, 2025.
[11] S. Muralee, I. Koishybayev, A. Nahapetyan, G. Tystahl, B. Reaves,              [30] Django       Software    Foundation,    “Django      documentation:
     A. Bianchi, W. Enck, A. Kapravelos, and A. Machiry, “Argus: A                       Use_x_forwarded_host setting,” https://docs.djangoproject.com/en/5.
     framework for staged static taint analysis of github workflows and                  2/ref/settings/#use-x-forwarded-host, 2025, official documentation,
     actions,” in Proc. USENIX Security Symposium, 2023.                                 accessed Nov. 10, 2025.
[31] The Tornado Authors, “Tornado documentation: httpserver module,”           [49] Pallets Projects, “Flask api reference: url_for,” https://flask.
     https://www.tornadoweb.org/en/latest/_modules/tornado/httpserver.               palletsprojects.com/en/stable/api/#flask.Flask.url_for, 2025, official
     html, 2025, official documentation, accessed Nov. 10, 2025.                     documentation, accessed Nov. 10, 2025.
[32] Koa.js Project, “Koa documentation: Application settings,” https://        [50] ——, “Flask api reference: Request.host,” https://flask.palletsprojects.
     koajs.com/#settings, 2025, official documentation, accessed Nov. 10,            com/en/stable/api/#flask.Request.host, 2025, official documentation,
     2025.                                                                           accessed Nov. 10, 2025.
[33] Spring Framework Team, “Spring documentation: For-                         [51] A. Delignat-Lavaud and K. Bhargavan, “Network-based origin con-
     wardedheaderfilter,”        https://docs.enterprise.spring.io/spring-           fusion attacks against HTTPS virtual hosting,” in WWW, 2015.
     framework/docs/6.0.24/javadoc-api/org/springframework/web/filter/
     ForwardedHeaderFilter.html, 2025, official documentation, accessed         [52] S. Hao, Y. Zhang, H. Wang, and A. Stavrou, “End-users get maneu-
     Nov. 10, 2025.                                                                  vered: Empirical analysis of redirection hijacking in cdns,” in USENIX
                                                                                     Security, 2018.
[34] Pallets Team, “Flask documentation: Host header validation,”
     https://flask.palletsprojects.com/en/stable/web-security/#host-header-     [53] S. Pletinckx, C. Kruegel, and G. Vigna, “A large-scale measurement
     validation, 2025, official documentation, accessed Nov. 10, 2025.               study of the proxy protocol and its security implications,” in Proc.
                                                                                     Network and Distributed System Security Symposium (NDSS), 2025.
[35] FastAPI Project, “Fastapi documentation: Trustedhostmiddle-
     ware,”         https://fastapi.tiangolo.com/advanced/middleware/?h=        [54] R. A. Oliveira, M. M. Raga, N. Laranjeiro, and M. Vieira, “An
     trustedhostmiddleware#trustedhostmiddleware,       2025,     official           approach for benchmarking the security of web service frameworks,”
     documentation, accessed Nov. 10, 2025.                                          Future Generation Computer Systems, 2020.
[36] Gin Web Framework Team, “Gin documentation: Deployment                     [55] M. del Pilar Salas-Zárate, G. Alor-Hernández, R. Valencia-García,
     configuration options,” https://gin-gonic.com/en/docs/deployment/               L. Rodríguez-Mazahua, A. Rodríguez-González, and J. L. L.
     #configuration-options, 2025, official documentation, accessed Nov.             Cuadrado, “Analyzing best practices on web development frame-
     10, 2025.                                                                       works: The lift approach,” Science of Computer Programming, 2015.
[37] Actix Web Project, “Actix web documentation: Connectioninfo,”              [56] K. Duisebekova, R. Khabirov, and A. Zholzhan, “Django as secure
     https://mozilla-services.github.io/merino/rustdoc/actix_web/dev/                web-framework in practice,” The Bulletin of Kazakh Academy of
     struct.ConnectionInfo.html, 2025, official documentation, accessed              Transport and Communications named after M. Tynyshpayev, 2021.
     Nov. 10, 2025.
[38] Starlette Project, “Starlette documentation: Other middleware,” https:
     //starlette.dev/middleware/#other-middleware, 2025, official docu-
                                                                                Appendix A.
     mentation, accessed Nov. 12, 2025.                                         Scenario Matrix
[39] aiohttp Developers, “aiohttp documentation: Forwarded header sup-
     port,” https://docs.aiohttp.org/en/stable/web_advanced.html#aiohttp-           This appendix lists all Stage I deployment scenarios.
     web-forwarded-support, 2025, official documentation, accessed Nov.         They cover all combinations of framework trust settings
     12, 2025.
                                                                                (A0–A4) and proxy modes (B0–B2). We separate direct
[40] Microsoft, “Asp.net core documentation: Host filtering and                 baselines (suffix D) with no proxy from behind-proxy con-
     allowedhosts,”         https://learn.microsoft.com/en-us/aspnet/core/
     fundamentals/servers/kestrel/host-filtering?view=aspnetcore-9.0,           figurations (suffix N/A) tested with Nginx (N) and Apache
     2025, official documentation, accessed Nov. 12, 2025.                      (A). Table 7 gives the direct baselines, and Table 8 gives the
[41] Ruby on Rails Team, “Rails security guide: Dns rebinding and               Nginx and Apache variants, together forming the full set of
     host header attacks,” https://guides.rubyonrails.org/security.html#dns-    60 scenarios.
     rebinding-and-host-header-attacks, 2025, official documentation, ac-
     cessed Nov. 10, 2025.                                                      TABLE 7: Direct scenarios and their corresponding SC-IDs.
[42] Pallets Team, “Flask documentation: Web security guide,” https:
                                                                                  D-ID → SC-ID                         D-ID → SC-ID
     //flask.palletsprojects.com/en/stable/web-security/, 2025, official doc-
     umentation, accessed Nov. 10, 2025.                                          SC-001-D → SC-001                    SC-007-D → SC-019
[43] Django Software Foundation, “Django security topics: Host header             SC-002-D → SC-002                    SC-008-D → SC-022
     validation,”   https://docs.djangoproject.com/en/5.2/topics/security/        SC-003-D → SC-003                    SC-009-D → SC-025
     #host-header-validation, 2025, official documentation, accessed Nov.         SC-004-D → SC-005                    SC-010-D → SC-028
     10, 2025.                                                                    SC-005-D → SC-006                    SC-011-D → SC-031
                                                                                  SC-006-D → SC-016                    SC-012-D → SC-045
[44] HapiJS Project, “Hapi documentation: request.url,” https://hapi.dev/
     api/?v=21.4.3#request.url, 2025, official documentation, accessed
     Nov. 10, 2025.
[45] Pallets Team, “Flask api reference: Request.url,”                 https:   Appendix B.
     //flask.palletsprojects.com/en/stable/api/#flask.Request.url,     2025,
     official documentation, accessed Nov. 10, 2025.                            Request Templates
[46] FastAPI Project, “Fastapi documentation: Using request di-
     rectly,” https://fastapi.tiangolo.com/advanced/using-request-directly/,       Table 9 and Table 10 summarizes all 55 crafted HTTP
     2025, official documentation, accessed Nov. 10, 2025.                      request templates used in Stage I. Each row lists the test case
[47] Lightbend, “Play framework documentation: Allowedhosts-                    ID, short category, illustrative header fields (or absolute-
     filter,”       https://www.playframework.com/documentation/3.0.x/          form request line), and a concise explanation. The full
     AllowedHostsFilter?#Enabling-the-allowed-hosts-filter,     2025,
     official documentation, accessed Nov. 10, 2025.
                                                                                expanded catalog is included in our artifact.
[48] Microsoft, “Asp.net core documentation: Host filtering and
     allowedhosts,”         https://learn.microsoft.com/en-us/aspnet/core/
     fundamentals/servers/kestrel/host-filtering?view=aspnetcore-10.0,
     2025, official documentation, accessed Nov. 10, 2025.
                       TABLE 8: 48 behind-proxy scenarios shared by Nginx (N) and Apache (A).
ID          Name                                                                       Brief explanation
SC-001      NoAppConfig+NoOverride                                                     Transparent edge; no validation.
SC-002      TRUSTED_HOSTS+NoOverride                                                   Allowlist filters hosts.
SC-003      SERVER_NAME+NoOverride                                                     Canonical host enforced.
SC-004      NoAppConfig+HostWhitelist                                                  Proxy whitelist only; misalignment possible.
SC-005      ProxyFixNoValidation+NoOverride                                            Trusts any X-Forwarded-*.
SC-006      ProxyFixWithValidation+NoOverride                                          Checks exist; proxy scope absent.
SC-007      ProxyFixNoValidation+XFHOverride                                           Proxy injects host; unscoped trust.
SC-008      SERVER_NAME+XFHOverride                                                    Canonical host wins if proxy not trusted.
SC-009      ProxyFixNoValidation+HostWhitelist                                         Proxy filters; unscoped trust may override.
SC-010      ProxyFixWithValidation+XFHOverride                                         Proxy injects host; scope decides.
SC-011      TRUSTED_HOSTS+XFHOverride                                                  Allowlist blocks injected host.
SC-012      NoAppConfig+XFHOverride                                                    No guards; forwarded host accepted.
SC-013      TRUSTED_HOSTS+HostWhitelist                                                Dual allowlists; mismatch risk.
SC-014      SERVER_NAME+HostWhitelist                                                  Canonical + proxy lists must align.
SC-015      ProxyFixWithValidation+HostWhitelist                                       Filters both ends; scope decides.
SC-016      SERVER_NAME+TRUSTED_HOSTS+NoOverride                                       Two guards, no proxy.
SC-017      SERVER_NAME+TRUSTED_HOSTS+XFHOverride                                      Guards active; forwarded host ignored.
SC-018      SERVER_NAME+TRUSTED_HOSTS+HostWhitelist                                    Three filters; alignment needed.
SC-019      SERVER_NAME+ProxyFixNoValidation+NoOverride                                Forwarded host overrides canonical.
SC-020      SERVER_NAME+ProxyFixNoValidation+XFHOverride                               Proxy injects host; unscoped trust.
SC-021      SERVER_NAME+ProxyFixNoValidation+HostWhitelist                             Filtering partial; unscoped wins.
SC-022      SERVER_NAME+ProxyFixWithValidation+NoOverride                              Nominal checks only.
SC-023      SERVER_NAME+ProxyFixWithValidation+XFHOverride                             Proxy injects host; scope matters.
SC-024      SERVER_NAME+ProxyFixWithValidation+HostWhitelist                           Filters both; consistent config needed.
SC-025      TRUSTED_HOSTS+ProxyFixNoValidation+NoOverride                              Unscoped proxy bypasses allowlist.
SC-026      TRUSTED_HOSTS+ProxyFixNoValidation+XFHOverride                             Proxy injects host; unscoped trust.
SC-027      TRUSTED_HOSTS+ProxyFixNoValidation+HostWhitelist                           Dual filters; unscoped override.
SC-028      TRUSTED_HOSTS+ProxyFixWithValidation+NoOverride                            Nominal checks; no scoping.
SC-029      TRUSTED_HOSTS+ProxyFixWithValidation+XFHOverride                           Scoped trust keeps allowlist intact.
SC-030      TRUSTED_HOSTS+ProxyFixWithValidation+HostWhitelist                         Two filters; scope alignment required.
SC-031      SERVER_NAME+TRUSTED_HOSTS+ProxyFix+NoOverride                              All guards; proxy order matters.
SC-032      SERVER_NAME+TRUSTED_HOSTS+ProxyFix+XFHOverride                             Scoped forwarding preserves authority.
SC-033      SERVER_NAME+TRUSTED_HOSTS+ProxyFix+HostWhitelist                           Fully filtered; consistency needed.
SC-034      NoAppConfig+XFHOverride+HostWhitelist                                      Proxy injects + filters; no guards.
SC-035      TRUSTED_HOSTS+XFHOverride+HostWhitelist                                    Proxy injects host; allowlist blocks.
SC-036      SERVER_NAME+XFHOverride+HostWhitelist                                      Proxy injects host; canonical wins.
SC-037      ProxyFixNoValidation+XFHOverride+HostWhitelist                             Proxy injects host; unscoped wins.
SC-038      ProxyFixWithValidation+XFHOverride+HostWhitelist                           Proxy injects host; scope decides.
SC-039      SERVER_NAME+TRUSTED_HOSTS+XFHOverride+HostWhitelist                        Guards prevent drift.
SC-040      SERVER_NAME+ProxyFix+XFHOverride+HostWhitelist                             Scoped proxy needed.
SC-041      TRUSTED_HOSTS+ProxyFix+XFHOverride+HostWhitelist                           Scoped proxy + allowlist safe.
SC-042      SERVER_NAME+TRUSTED_HOSTS+ProxyFix+XFHOverride+HostWhitelist               Fully guarded; misalignment risky.
SC-043      SERVER_NAME+ProxyFixNoValidation+XFHOverride+HostWhitelist                 Proxy injects host; unscoped overrides.
SC-044      TRUSTED_HOSTS+ProxyFixNoValidation+XFHOverride+HostWhitelist               Proxy injects host; unscoped defeats allowlist.
SC-045      SERVER_NAME+TRUSTED_HOSTS+ProxyFixNoValidation+NoOverride                  Unscoped forwarding dominates.
SC-046      SERVER_NAME+TRUSTED_HOSTS+ProxyFixNoValidation+XFHOverride                 Proxy injects host; unscoped wins.
SC-047      SERVER_NAME+TRUSTED_HOSTS+ProxyFixNoValidation+HostWhitelist               Unscoped forwarding overrides filter.
SC-048      SERVER_NAME+TRUSTED_HOSTS+ProxyFixNoValidation+XFHOverride+HostWhitelist   Max config; strict scoping required.




Nginx scenario IDs (48).                                            Apache scenario IDs (48).
SC-001-N, SC-002-N, SC-003-N, SC-004-N, SC-005-N,                   SC-001-A, SC-002-A, SC-003-A, SC-004-A, SC-005-A,
SC-006-N, SC-007-N, SC-008-N, SC-009-N, SC-010-N,                   SC-006-A, SC-007-A, SC-008-A, SC-009-A, SC-010-A,
SC-011-N, SC-012-N, SC-013-N, SC-014-N, SC-015-N,                   SC-011-A, SC-012-A, SC-013-A, SC-014-A, SC-015-A,
SC-016-N, SC-017-N, SC-018-N, SC-019-N, SC-020-N,                   SC-016-A, SC-017-A, SC-018-A, SC-019-A, SC-020-A,
SC-021-N, SC-022-N, SC-023-N, SC-024-N, SC-025-N,                   SC-021-A, SC-022-A, SC-023-A, SC-024-A, SC-025-A,
SC-026-N, SC-027-N, SC-028-N, SC-029-N, SC-030-N,                   SC-026-A, SC-027-A, SC-028-A, SC-029-A, SC-030-A,
SC-031-N, SC-032-N, SC-033-N, SC-034-N, SC-035-N,                   SC-031-A, SC-032-A, SC-033-A, SC-034-A, SC-035-A,
SC-036-N, SC-037-N, SC-038-N, SC-039-N, SC-040-N,                   SC-036-A, SC-037-A, SC-038-A, SC-039-A, SC-040-A,
SC-041-N, SC-042-N, SC-043-N, SC-044-N, SC-045-N,                   SC-041-A, SC-042-A, SC-043-A, SC-044-A, SC-045-A,
SC-046-N, SC-047-N, SC-048-N.                                       SC-046-A, SC-047-A, SC-048-A.
                                                                 TABLE 10: Crafted Request Templates (TC-029–TC-055)
                                                                 ID       Category              Headers
TABLE 9: Crafted Request Templates (TC-001–TC-028)                                                  X-Forwarded-Host:
                                                                 TC-029   Repeated XFH
                                                                                                    attacker.com, localhost
ID       Category                  Headers                                                          raw x-forwarded-host vs
                                                                 TC-030   Case-mixed XFH
                                                                                                    X-FORWARDED-HOST
TC-001   Host manipulation         Host: example.com                                                raw X-Forwarded-Host:
                                   Host: example.com; XFH:       TC-031   Whitespace XFH
                                                                                                    \tattacker.com
TC-002   Host + XFH
                                   attacker.com                                                     XFH: example.com,
                                   X-Forwarded-Host:             TC-032   Mixed multi-value         attacker.com; Forwarded:
TC-003   XFH-only
                                   attacker.com                                                     host="evil.com:8080"
TC-004   Empty Host + XFH          Host: ; XFH: attacker.com                                        Host: example.com;
TC-005   Port injection            Host: example.com:80
                                                                 TC-033   X-Original-Host           X-Original-Host:
                                   Host: example.com;
TC-006   Routing bypass                                                                             attacker.com
                                   X-Real-IP: 192.168.1.100
                                                                 TC-034   XFS + X-Host              X-Forwarded-Server / X-Host
TC-007   Subdomain bypass          Host: evil.example.com
                                                                                                    Forwarded:
                                   Host: example.com; XFH:
TC-008   Default vhost                                           TC-035   Forwarded IPv6            for="[2001:db8::1]";
                                   attacker.com; XFF: 10.0.0.1
                                   Host: example.com; XFH:                                          host="evil.com"
TC-009   Apache-specific                                                                            Host: example.com; XFH:
                                   attacker.com; XFP: http
                                   Host: example.com; XFH:       TC-036   Host priority test        localhost; Forwarded:
TC-010   Nginx-specific            attacker.com;                                                    host=benign
                                                                                                    Host: localhost; XFH:
                                   X-Original-Host: localhost
                                   Host: localhost; XFH:         TC-037   XFH priority test         attacker.com; Forwarded:
TC-011   Priority confusion
                                   attacker.com                                                     host=benign
TC-012   Alt port                  Host: example.com:8080                                           Host: localhost; XFH:
TC-013   User-info Host            Host: localhost@example.com   TC-038   Forwarded priority test   localhost; Forwarded:
                                   Host: 127.0.0.1; XFH:                                            host=evil.com
TC-014   IP Host + XFH
                                   attacker.com                                                     Forwarded: for=1.1.1.1;
                                   Host: LoCaLhOsT; XFH:         TC-039   Forwarded chain           host=evil.com, for=2.2.2.2;
TC-015   Case confusion                                                                             host=benign
                                   attacker.com
                                   Host: example.com; XFS:                                          Forwarded: HOST=evil;
TC-016   XFS compare                                             TC-040   Forwarded casing
                                   attacker.com                                                     host=benign; Host=example
                                   Host: example.com; X-Host:                                       Forwarded:
TC-017   X-Host variant                                          TC-041   Forwarded quoted port
                                   attacker.com                                                     host="evil.com:443"
                                   Host: example.com; XFH:       TC-042   Control characters        raw XFH: \tattacker.com\r
TC-018   Env pollution
                                   attacker.com; XFF: 1.1.1.1                                       X-Forwarded-Host:
                                                                 TC-043   User-info XFH
                                   Host: localhost; XFH:                                            attacker.com@localhost
TC-019   XFH spoofing              attacker.com; XFF:                                               X-Forwarded-Host:
                                                                 TC-044   Percent-encoded XFH
                                   127.0.0.1                                                        attacker%2ecom
                                   Host: localhost; XFH:                                            XFH: attacker; Forwarded:
                                                                 TC-045   Dual override
TC-020   XFH + proto conflict
                                   attacker.com; XFP: https                                         host=evil
                                   X-Forwarded-Host:                                                X-Original-Host/XFH/Forwarded
                                                                 TC-046   Triple override
TC-021   XFH + XRI                 attacker.com; X-Real-IP:                                         all attacker
                                   192.168.1.1                                                      X-Forwarded-Server:
                                   Host: localhost; XFF:         TC-047   Server-header fallback    attacker; Forwarded:
TC-022   XFF spoofing              192.168.1.100; XFH:                                              host=evil
                                   attacker.com                  TC-048   HTTP/2 authority override :authority: attacker.com
                                   Host: localhost; XFP:                                            :authority: localhost; XFH:
                                                                 TC-049   HTTP/2 vs XFH
TC-023   XFP alteration
                                   https; XFH: attacker.com                                         attacker.com
                                   Host: localhost; XFH:                                            :authority: localhost;
                                                                 TC-050   HTTP/2 vs Forwarded
TC-024   Multi-value XFH
                                   example.com, attacker.com                                        Forwarded: host=evil.com
                                   Host: example.com;                                               :authority: attacker.com;
                                                                 TC-051   HTTP/2 Forwarded chain
TC-025   Full X-Forwarded set      XFH/XFF/XFP/XRI all                                              Forwarded: for=1.1.1.1; ...
                                                                                                    :authority: attacker.com;
                                   attacker                      TC-052   HTTP/2 duplicate
TC-026   Forwarded host override   Forwarded: host=evil.com                                         XFH: localhost
                                                                          authority
                                   Forwarded: proto=https;                                          GET
TC-027   Forwarded proto+host
                                   host=evil.com; for=1.2.3.4    TC-053   Absolute URI override     http://attacker.com/...;
                                   Forwarded: host=evil.com;                                        Host: localhost
TC-028   Forwarded vs XFH
                                   XFH: localhost                                                   GET http://localhost/...;
                                                                 TC-054   Absolute URI + XFH
                                                                                                    XFH: attacker.com
                                                                                                    Host: localhost; Forwarded:
                                                                 TC-055   Absolute URI +
                                                                                                    host=evil.com
                                                                          Forwarded
Appendix C.                                                        Non-sensitive examples include local
Prompt Variants for Sensitivity Check                              string processing, logging, error
                                                                   construction, or utility helpers with no
                                                                   redirect, authentication, or network side
     This appendix documents the three semantically equiv-         effects.
alent prompt variants used in our sink classification sensi-       Return exactly one of:
tivity check for the final sink filtering step.                    - SECURITY_SENSITIVE: the sink falls into
Input. Each prompt receives lightweight information already        a sensitive class above.
available from our static analysis: the programming frame-         - NOT_SECURITY_SENSITIVE: no externally
work, the candidate sink symbol, the callsite code with            observable security effect is evident.
line numbers, and a small amount of local context from             - UNCERTAIN: the effect is unclear (e.g.,
surrounding code. We do not provide full taint traces, broad       due to wrappers or aliases).
                                                                   Reason silently. Output valid JSON only,
interprocedural summaries, or external documentation at this
                                                                   following the schema above.
stage, since the goal is only to help filter candidate sinks
rather than to confirm end-to-end vulnerabilities.             Representative example. All prompt variants use the same
Output. The model returns a JSON object with the follow-       few-shot examples. For brevity, we show one representative
ing structure.                                                 example here.
1 {   "sink_name": "<sink symbol>",                                Language/Framework: Express
2     "effect_category": "<category>",                             Sink symbol: express.Response.redirect
3     "is_security_sensitive": "<                                  Callsite code (with line numbers):
        ↩→ SECURITY_SENSITIVE |                                    67:   return res.redirect(avatarUrl);
        ↩→ NOT_SECURITY_SENSITIVE |                                Local context from nearby lines:
4           UNCERTAIN>",                                           62: async function
5     "effect_explanation": "<brief                                finishAvatarUpload(req, res) {
        ↩→ explanation>",                                          63:   const user = await
6     "evidence_lines": ["Lx", "Ly-Lz"],                           Users.findById(req.session.userId);
7     "confidence": "<high|medium|low>"                            64:   const fileName =
                                                                   ‘${user.id}/${Date.now()}-
Prompt Variants (A/B/C). The three variants differ in              ${req.file.filename}‘;
role description, decision phrasing, and terminology, while        65:   const avatarHost = user.profileHost
preserving the same task semantics.                                || config.assetHost;
    [A] You are a neutral security reviewer.                       66:   const avatarUrl =
    Decide whether a cited API invocation is a                     ‘https://${avatarHost}/avatars/${fileName}‘;
    final sink with externally observable                          67:   return res.redirect(avatarUrl);}
    impact.                                                    Representative exemplar output.
    [B] You are an impartial security                          1 {   "sink_name": "express.Response.redirect"
    analyst. Determine whether the cited API                           ↩→ ,
    call is a terminal sink with externally                    2     "effect_category": "REDIRECT",
    observable security impact.                                3     "is_security_sensitive": "
                                                                       ↩→ SECURITY_SENSITIVE",
    [C] You are a security triage reviewer.                    4     "effect_explanation": "Redirect issues a
    Judge whether the referenced API                                   ↩→ response whose destination is
    invocation is the final sink and has                               ↩→ derived from avatarUrl, which is
    externally observable impact.                                      ↩→ constructed using avatarHost and
                                                                       ↩→ fileName.",
    Externally observable = any action whose                   5     "evidence_lines": ["L65-L67"],
    result escapes the current process or                      6     "confidence": "high"
    request.
    Consider the following common sensitive                    Across prompt variants, the model consistently assigns the
    classes (examples, not exhaustive):                        same sensitivity label to this example, with only minor
    - REDIRECT: HTTP redirects, client                         wording differences in the explanation.
    navigation helpers, and Location setters.
    - URL_GENERATION: APIs used to create
    externally reachable URLs (e.g., signed
    or presigned links, object URLs, helpers
    with ‘_external=True‘).
    - AUTHENTICATION: APIs that issue or
    validate credentials, mutate sessions, or
    change login state.
    - EXTERNAL_REQUEST: APIs that initiate
    outbound network I/O
      (e.g., HTTP(S), gRPC, WebSocket, DNS).
Appendix D.
Meta-Review
    The following meta-review was prepared by the program
committee for the 2026 IEEE Symposium on Security and
Privacy (S&P) as part of the review process as detailed in
the call for papers.

D.1. Summary

    The paper studies host name poisoning which exploits
how different servers reconstruct and reuse the host name.
The HALO framework presented in the paper focuses on
how host values are reconstructed and trusted across servers,
frameworks, and applications, covering both direct and
behind-proxy deployments and how clients can manipulate
host names to trigger vulnerabilities.

D.2. Scientific Contributions

   •    Creates a New Tool to Enable Future Science.
   •    Identifies an Impactful Vulnerability.
   •    Provides a Valuable Step Forward in an Established
        Field.

D.3. Reasons for Acceptance

   1)    The HALO framework proposed in the paper com-
         bines static analysis with dynamic testing to detect
         Host Name Poisoning (HNP) attacks. The value of
         this framework is evidenced in the number of CVEs
         that this work has identified (19 so far) especially
         in popular open source software.
   2)    The HNP attack surface is under-researched and the
         this paper is a valuable step forward in a principled
         analysis of how different layers of the modern web
         can interact with each other inconsistently to pro-
         vide an opening for attacks.

D.4. Noteworthy Concerns

   None.
