Skip to content

transport: reject requests missing :authority and host headers - #9365

Merged
eshitachandwani merged 2 commits into
grpc:masterfrom
eshitachandwani:secfix
Aug 25, 2026
Merged

transport: reject requests missing :authority and host headers#9365
eshitachandwani merged 2 commits into
grpc:masterfrom
eshitachandwani:secfix

Conversation

@eshitachandwani

@eshitachandwani eshitachandwani commented Aug 25, 2026

Copy link
Copy Markdown
Member

Fixes : #9354

This PR updates the HTTP/2 transport layer to reject requests missing both :authority and Host headers early. Also adds a defensive check in xds server to ensure authority header is present.

RELEASE NOTES:

  • server: Reject requests missing both :authority and Host headers with HTTP 400 and status Internal

Co-authored-by: Madan Kumar <winklemad@outlook.com>
@eshitachandwani eshitachandwani added this to the 1.84 Release milestone Aug 25, 2026
@eshitachandwani eshitachandwani added Type: Bug Area: Transport Includes HTTP/2 client/server and HTTP server handler transports and advanced transport features. labels Aug 25, 2026
@codecov

codecov Bot commented Aug 25, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 87.51%. Comparing base (9d1988d) to head (ff11d11).

Additional details and impacted files
@@            Coverage Diff             @@
##           master    #9365      +/-   ##
==========================================
+ Coverage   87.45%   87.51%   +0.05%     
==========================================
  Files         425      425              
  Lines       30297    30303       +6     
==========================================
+ Hits        26496    26519      +23     
+ Misses       3801     3784      -17     
Files with missing lines Coverage Δ
internal/transport/http2_server.go 93.27% <100.00%> (-0.36%) ⬇️
internal/xds/server/routing.go 91.17% <100.00%> (+0.26%) ⬆️
test/servertester.go 75.00% <100.00%> (+0.17%) ⬆️

... and 22 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Comment thread internal/xds/server/routing_test.go Outdated
if status.Code(err) != codes.Internal {
t.Fatalf("RouteAndProcess() returned error code %v, want %v", status.Code(err), codes.Internal)
}
if !strings.Contains(status.Convert(err).Message(), "no :authority header present") {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: Just use the error as is

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

@eshitachandwani
eshitachandwani merged commit 93e31b4 into grpc:master Aug 25, 2026
21 checks passed
eshitachandwani added a commit that referenced this pull request Aug 25, 2026
Original PR : #9365

RELEASE NOTES: 
- server: Reject requests missing both :authority and Host headers with
HTTP 400 and status Internal

Co-authored-by: Madan Kumar <winklemad@outlook.com>
eshitachandwani added a commit that referenced this pull request Aug 25, 2026
Original PR : #9365

RELEASE NOTES:
- server: Reject requests missing both :authority and Host headers with
HTTP 400 and status Internal

Co-authored-by: Madan Kumar <winklemad@outlook.com>
eshitachandwani added a commit that referenced this pull request Aug 25, 2026
Original PR : #9365

RELEASE NOTES: 
- server: Reject requests missing both `:authority` and `Host` headers
with HTTP 400 and status `Internal`

Co-authored-by: Madan Kumar <winklemad@outlook.com>
ArangoGutierrez added a commit to NVIDIA/k8s-test-infra that referenced this pull request Sep 1, 2026
Consolidates six Dependabot PRs into one signed, CI-verified change.

- github/codeql-action (init, analyze, upload-sarif) 4.37.8 -> 4.37.9
- anchore/sbom-action 0.24.0 -> 0.24.2
- k8s.io/{api,apiextensions-apiserver,apimachinery,client-go,kubelet} 0.36.3 -> 0.37.0
- google.golang.org/grpc 1.83.1 -> 1.83.2

The grpc bump is a security fix: requests missing both :authority and Host
headers are now rejected (grpc/grpc-go#9365).

codeql-action init and analyze had to move together. Split across #764 and #766
neither could pass, since the action refuses to run mismatched versions in the
same job.

Where #755 and #754 disagreed on shared indirect modules, the newest of each was
kept (golang.org/x/mod 0.38.0, x/net 0.58.0, x/text 0.41.0, x/tools 0.48.0) and
the vendored trees taken whole from the winning PR rather than line-merged.

Supersedes #764, #765, #766, #767, #754, #755.
pdettori added a commit to rossoctl/serverless-harness that referenced this pull request Sep 2, 2026
…Go modules

Bundles Dependabot PRs #209 and #210 into a single update.

Dependabot tracks /gen/go and /remote-worker as independent directories, so it
opens one PR per module. That cannot work here: remote-worker consumes gen/go
via a `replace` directive, and the `proto` CI job builds both modules in the
same job. #210 (gen/go -> protobuf 1.36.12) therefore left
remote-worker/go.mod pinning the stale indirect versions, and the job failed
with "updates to go.mod needed; to update it: go mod tidy".

This commit bumps both modules together and tidies remote-worker so the
indirect protobuf/x-net/x-text versions match gen/go.

- google.golang.org/grpc      1.83.1  -> 1.83.2 (security: reject requests
  missing both :authority and Host headers, grpc/grpc-go#9365)
- google.golang.org/protobuf  1.36.11 -> 1.36.12
- golang.org/x/net            0.57.0  -> 0.58.0 (indirect)
- golang.org/x/text           0.40.0  -> 0.41.0 (indirect)

Assisted-By: Claude (Anthropic AI) <noreply@anthropic.com>
Signed-off-by: Paolo Dettori <dettori@us.ibm.com>
nschloe pushed a commit to live-clones/forgejo that referenced this pull request Sep 3, 2026
…/forgejo) (#14216)

This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [google.golang.org/grpc](https://github.com/grpc/grpc-go) | `v1.82.1` → `v1.83.1` | ![age](https://developer.mend.io/api/mc/badges/age/go/google.golang.org%2fgrpc/v1.83.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/google.golang.org%2fgrpc/v1.82.1/v1.83.1?slim=true) |

---

> ⚠️ **Warning**
>
> Some dependencies could not be looked up. Check the [Dependency Dashboard](issues/2779) for more information.

---

### gRPC-Go: Heap Memory Exhaustion (OOM) via HTTP/2 DATA Frame Fragmentation
[CVE-2026-84304](https://nvd.nist.gov/vuln/detail/CVE-2026-84304) / [GHSA-vp52-pcj8-j9qc](GHSA-vp52-pcj8-j9qc)

<details>
<summary>More information</summary>

#### Details
##### Impact
An unauthenticated remote attacker can initiate a gRPC stream and purposefully fragment their payload into millions of tiny (e.g., 1-byte) HTTP/2 DATA frames. Even if the total payload volume falls within the configured connection and stream flow-control windows, each independent fragment incurs memory overhead due to internal tracking structures and queue allocation.

Repeated fragmentation massively inflates the heap space consumed by the stream. An attacker multiplexing multiple concurrent streams can exhaust the memory bounds of the runtime, forcing a runtime panic or OutOfMemory condition and leading to a remote Denial of Service (DoS).

##### Patches
The change to fix this issue is merged in `master` and a patch release, 1.83.1, has been published that contains this fix.

##### Workarounds
This vulnerability is mitigated by implementing receive buffer compaction. Consecutive small data buffers are automatically coalesced into larger buffers from a shared pool once the overhead is perceived to be excessive relative to actual payload data, drastically minimizing per-frame memory overheads.

This behavior is enabled by default. A temporary escape hatch is provided via the environment variable `GRPC_GO_EXPERIMENTAL_ENABLE_RECEIVE_BUFFER_COMPACTION=false` to disable the feature if unforeseen issues arise, but it will be removed in a future release.

#### Severity
- CVSS Score: 8.7 / 10 (High)
- Vector String: `CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N`

#### References
- [https://github.com/grpc/grpc-go/security/advisories/GHSA-vp52-pcj8-j9qc](https://github.com/grpc/grpc-go/security/advisories/GHSA-vp52-pcj8-j9qc)
- [https://nvd.nist.gov/vuln/detail/CVE-2026-84304](https://nvd.nist.gov/vuln/detail/CVE-2026-84304)
- [https://github.com/grpc/grpc-go/pull/9331](https://github.com/grpc/grpc-go/pull/9331)
- [https://github.com/grpc/grpc-go/pull/9333](https://github.com/grpc/grpc-go/pull/9333)
- [https://github.com/grpc/grpc-go/commit/7354d9c8debb4bcf2225bf429857078de310c176](https://github.com/grpc/grpc-go/commit/7354d9c8debb4bcf2225bf429857078de310c176)
- [https://github.com/grpc/grpc-go/commit/8cfeca0e1ee5ea0980dcc320e20240fa1079ec77](https://github.com/grpc/grpc-go/commit/8cfeca0e1ee5ea0980dcc320e20240fa1079ec77)
- [https://github.com/grpc/grpc-go](https://github.com/grpc/grpc-go)
- [https://github.com/grpc/grpc-go/releases/tag/v1.83.1](https://github.com/grpc/grpc-go/releases/tag/v1.83.1)

This data is provided by [OSV](https://osv.dev/vulnerability/GHSA-vp52-pcj8-j9qc) and the [GitHub Advisory Database](https://github.com/github/advisory-database) ([CC-BY 4.0](https://github.com/github/advisory-database/blob/main/LICENSE.md)).
</details>

---

### Release Notes

<details>
<summary>grpc/grpc-go (google.golang.org/grpc)</summary>

### [`v1.83.1`](https://github.com/grpc/grpc-go/releases/tag/v1.83.1): Release 1.83.1

[Compare Source](grpc/grpc-go@v1.83.0...v1.83.1)

### Security

- xds/rbac: Fix a bug where nested `Principal` or `Permission` rules with `:scheme` or `grpc-` prefixed header matchers were not rejected, which could cause DENY rules to fail open. ([#&#8203;9258](grpc/grpc-go#9258))
  - Special Thanks: [@&#8203;nvxbug](https://github.com/nvxbug)
- xds/rbac: Fix a bug where the `host` header matcher was not being replaced with `:authority` in nested `Principal` or `Permission` rules. ([#&#8203;9258](grpc/grpc-go#9258))
  - Special Thanks: [@&#8203;nvxbug](https://github.com/nvxbug)
- xds/rbac: Fix a bug where a header matcher whose name was not lowercase, such as `X-Role`, matched no header, which could cause DENY rules to fail open. ([#&#8203;9332](grpc/grpc-go#9332))
  - Special Thanks: [@&#8203;alimony](https://github.com/alimony)
- xds/rbac: Fix a bug where a `:scheme` or `grpc-` prefixed header matcher was accepted when its name was not lowercase. ([#&#8203;9332](grpc/grpc-go#9332))
  - Special Thanks: [@&#8203;alimony](https://github.com/alimony)
- xds/rbac: Fix a bug where a `Host` header matcher was not replaced with `:authority`. ([#&#8203;9332](grpc/grpc-go#9332))
  - Special Thanks: [@&#8203;alimony](https://github.com/alimony)

### Performance

- transport: Restrict memory overhead of buffering small data frames. ([#&#8203;9331](grpc/grpc-go#9331))

### [`v1.83.0`](https://github.com/grpc/grpc-go/releases/tag/v1.83.0): Release 1.83.0

[Compare Source](grpc/grpc-go@v1.82.2...v1.83.0)

### Security

- server: Stop reading from connections when flooded by HTTP/2 frames to mitigate resource exhaustion. The default value for this limit is 100 frames, excluding DATA and HEADERS, and may be changed by setting environment variable `GRPC_GO_EXPERIMENTAL_CONTROL_BUFFER_THROTTLE_LIMIT`.
- xds/rbac: Support `Metadata` and `RequestedServerName` permissions matcher fields.  If present in a DENY rule, previously these would be ignored and fail-open.
- xds/rbac: Fix panic when parsing unsupported fields in `NotRule`/`NotId` permissions.
- xds/rbac: Support the deprecated `source_ip` principal identifier by treating it as equivalent to `direct_remote_ip`.
- xds: Fix panic when parsing route header matchers configured with empty `exact_match`, `prefix_match`, or `suffix_match` strings. ([#&#8203;9223](grpc/grpc-go#9223))

### New Features

- xds/googlec2p: Enable DirectPath over Interconnect support for on-premises clients via the `force-xds` target URI query parameter. ([#&#8203;9133](grpc/grpc-go#9133))
- xds: Enable xDS configuration to control which fields get propagated from ORCA backend metric reports to LRS load reports. ([#&#8203;9145](grpc/grpc-go#9145))
- authz: Add `OnPolicyUpdate` callback to `FileWatcherOptions` to notify when an authz policy is loaded or updated. ([#&#8203;9142](grpc/grpc-go#9142))
  - Special Thanks: [@&#8203;hnefatl](https://github.com/hnefatl)
- xds: Add support for the GCP Authentication HTTP Filter, which automatically fetches and attaches GCP Service Account Identity JWT tokens to outgoing RPCs.
  - This feature can be enabled by setting environment variable `GRPC_EXPERIMENTAL_XDS_GCP_AUTHENTICATION_FILTER=true`. ([#&#8203;9119](grpc/grpc-go#9119))
- xds: Add support for xDS-based HTTP CONNECT proxies.
  - This feature can be enabled by setting environment variable `GRPC_EXPERIMENTAL_XDS_HTTP_CONNECT=true`. ([#&#8203;9151](grpc/grpc-go#9151))
- xds: Add support for `contains_match` in route header matchers. ([#&#8203;9223](grpc/grpc-go#9223))

### Bug Fixes

- credentials/alts: Fix panic when processing malformed frames by validating that the message frame length exceeds the message type field size. ([#&#8203;9197](grpc/grpc-go#9197))
- grpc: Fix compilation on Plan 9 targets (`GOOS=plan9`), broken since v1.81.0. ([#&#8203;9255](grpc/grpc-go#9255))
  - Special Thanks: [@&#8203;Yusufihsangorgel](https://github.com/Yusufihsangorgel)

### [`v1.82.2`](https://github.com/grpc/grpc-go/releases/tag/v1.82.2): Release 1.82.2

[Compare Source](grpc/grpc-go@v1.82.1...v1.82.2)

### Security

- server: Reject requests missing both `:authority` and `Host` headers with HTTP 400 and status `Internal`. ([#&#8203;9365](grpc/grpc-go#9365))
  - Special Thanks: [@&#8203;winklemad](https://github.com/winklemad)

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - Between 12:00 AM and 03:59 AM (`* 0-3 * * *`)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC41Mi4wIiwidXBkYXRlZEluVmVyIjoiNDQuNTIuMCIsInRhcmdldEJyYW5jaCI6InYxNi4wL2Zvcmdlam8iLCJsYWJlbHMiOlsiZGVwZW5kZW5jeS11cGdyYWRlIiwidGVzdC9ub3QtbmVlZGVkIl19-->

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/14216
Reviewed-by: Mathieu Fenniak <mfenniak@noreply.codeberg.org>
onesyue added a commit to onesyue/Xray-core that referenced this pull request Sep 4, 2026
grpc-go v1.83.2(2026-08-25)的 release notes 只有一节 `# Security`:
"server: Reject requests missing both `:authority` and `Host` headers with
HTTP 400 and status `Internal`"(grpc/grpc-go#9365)。修复点在通用服务端
传输层 `internal/transport/http2_server.go` 的 `operateHeaders`,不是 xDS 专有。

🚨 这一条没有任何公告 ID,所有扫描器都看不见:
  · OSV 查 `google.golang.org/grpc@1.83.1` → `{}`(零条)
  · 反向对照查 1.60.0 → 5 条,证明查询通路是好的,空是真阴性
  · `GHSA-2v4p-qf9q-27wj` 在 OSV 与 GitHub Advisory DB 双双 404
所以 govulncheck / OSV / Trivy 在升级前后都报绿;判据只能是上游 release
notes 加 vendor diff,不能是"扫描器没报"。

暴露面延续 `61ad1638` 那次的实测口径:面板库里
`protocol_settings ilike '%grpc%'` 命中 0 —— 今天没有节点开 grpc 传输,
所以这是硬化不是止血;但代码路径在,配置一变就接上。

上一版的 `61ad1638`(1.82.1 → 1.83.1)在这次 rebase 中被 `--skip` 掉了,
因为 upstream/main 的 `5fe6d621` 已经自己升到了 1.83.1,两者内容重复。
审计链没有丢:那次评审的推理保留在被 skip 的提交里,本提交继承它并前进一版。

验证:`go build ./...` 通过;`go test ./...` 82 个包 ok,唯二两条失败
(`app/dns TestTCPLocalNameServerWithIPv6Override`、`transport/internet/tls`
的 ECH 用例)都是要真实 DNS 出网的用例,已用 rebase 前的 `61ad1638` 做对照。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GMrMS6gBdeS8wXY4m1mV4P
otc-zuul-prod Bot pushed a commit to opentelekomcloud/terraform-provider-opentelekomcloud that referenced this pull request Sep 7, 2026
#3538)

Bumps the go_modules group with 1 update in the / directory: google.golang.org/grpc.
Updates google.golang.org/grpc from 1.82.1 to 1.83.1

Release notes
Sourced from google.golang.org/grpc's releases.

Release 1.83.1
Security

xds/rbac: Fix a bug where nested Principal or Permission rules with :scheme or grpc- prefixed header matchers were not rejected, which could cause DENY rules to fail open. (#9258)

Special Thanks: @​nvxbug


xds/rbac: Fix a bug where the host header matcher was not being replaced with :authority in nested Principal or Permission rules. (#9258)

Special Thanks: @​nvxbug


xds/rbac: Fix a bug where a header matcher whose name was not lowercase, such as X-Role, matched no header, which could cause DENY rules to fail open. (#9332)

Special Thanks: @​alimony


xds/rbac: Fix a bug where a :scheme or grpc- prefixed header matcher was accepted when its name was not lowercase. (#9332)

Special Thanks: @​alimony


xds/rbac: Fix a bug where a Host header matcher was not replaced with :authority. (#9332)

Special Thanks: @​alimony



Performance

transport: Restrict memory overhead of buffering small data frames. (#9331)

Release 1.83.0
Security

server: Stop reading from connections when flooded by HTTP/2 frames to mitigate resource exhaustion. The default value for this limit is 100 frames, excluding DATA and HEADERS, and may be changed by setting environment variable GRPC_GO_EXPERIMENTAL_CONTROL_BUFFER_THROTTLE_LIMIT.
xds/rbac: Support Metadata and RequestedServerName permissions matcher fields.  If present in a DENY rule, previously these would be ignored and fail-open.
xds/rbac: Fix panic when parsing unsupported fields in NotRule/NotId permissions.
xds/rbac: Support the deprecated source_ip principal identifier by treating it as equivalent to direct_remote_ip.
xds: Fix panic when parsing route header matchers configured with empty exact_match, prefix_match, or suffix_match strings. (#9223)

New Features

xds/googlec2p: Enable DirectPath over Interconnect support for on-premises clients via the force-xds target URI query parameter. (#9133)
xds: Enable xDS configuration to control which fields get propagated from ORCA backend metric reports to LRS load reports. (#9145)
authz: Add OnPolicyUpdate callback to FileWatcherOptions to notify when an authz policy is loaded or updated. (#9142)

Special Thanks: @​hnefatl


xds: Add support for the GCP Authentication HTTP Filter, which automatically fetches and attaches GCP Service Account Identity JWT tokens to outgoing RPCs.

This feature can be enabled by setting environment variable GRPC_EXPERIMENTAL_XDS_GCP_AUTHENTICATION_FILTER=true. (#9119)


xds: Add support for xDS-based HTTP CONNECT proxies.

This feature can be enabled by setting environment variable GRPC_EXPERIMENTAL_XDS_HTTP_CONNECT=true. (#9151)


xds: Add support for contains_match in route header matchers. (#9223)

Bug Fixes

credentials/alts: Fix panic when processing malformed frames by validating that the message frame length exceeds the message type field size. (#9197)
grpc: Fix compilation on Plan 9 targets (GOOS=plan9), broken since v1.81.0. (#9255)

Special Thanks: @​Yusufihsangorgel



Release 1.82.2
Security

server: Reject requests missing both :authority and Host headers with HTTP 400 and status Internal. (grpc/grpc-go#9365)



... (truncated)


Commits

1550d9e Change version to 1.83.1 (#9336)
ebba6f3 Cherry-pick #9258 and #9332 into v1.83.x (#9335)
8cfeca0 Cherry-pick #9331 to v1.83.x (#9333)
dec6951 Change version to 1.83.1-dev (#9229)
4c226da Change version to 1.83.0 (#9228)
c198988 Cherrypick 9223 into v1.83.x (#9279)
8ce3ebf Cherrypick PR 9255 into v1.83.x (#9263)
e393849 Cherry-pick recent changes from master (#9240)
2a112a8 authz: add onPolicyUpdate callback to authz file watcher (#9142)
1a80fca vet: adds a check to disallow usage of regex.Compile in xDS code (#9216)
Additional commits viewable in compare view




Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

@dependabot rebase will rebase this PR
@dependabot recreate will recreate this PR, overwriting any edits that have been made to it
@dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
@dependabot ignore <dependency name> major version will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)
@dependabot ignore <dependency name> minor version will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)
@dependabot ignore <dependency name> will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)
@dependabot unignore <dependency name> will remove all of the ignore conditions of the specified dependency
@dependabot unignore <dependency name> <ignore condition> will remove the ignore condition of the specified dependency and ignore conditions
You can disable automated security fix PRs for this repo from the Security Alerts page.

Reviewed-by: Anton Sidelnikov
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Area: Transport Includes HTTP/2 client/server and HTTP server handler transports and advanced transport features. Type: Bug

Projects

None yet

Development

Successfully merging this pull request may close these issues.

xds: server crashes with 'index out of range' when a request omits :authority

2 participants