Bundle: checker lists of one service defined in two configurations are merged by position, and a checker is silently lost
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 初心者へのやさしさ
- 48/100
調査の方向性
Start by reading the configuration tree definitions for checker aliases, algorithm lists, and serializer lists, then trace how ConfigurationHelper merges configuration from multiple sources. Reproduce the issue with the supplied when@prod configuration and compare debug:config jose checkers across environments. Done means repeated configuration preserves all intended checkers without accidental duplicates, while algorithm and serializer lists retain the safer last-list semantics described in the issue.
索引モデルが issue の本文から書いたものです。
説明
Version(s) affected
All released versions (3.4.x, 4.0.x, 4.1.x, 4.2.x), and the 4.3.x and 5.0.x branches.
Description
The bundle declares its lists of checker aliases with useAttributeAsKey('name'). When the jose configuration of one service comes from more than one place (a when@<env> block, a second file such as config/packages/prod/jose.yaml, or another bundle using ConfigurationHelper), Symfony merges two lists that carry a key attribute key by key. A YAML sequence is keyed by position, so the second list overwrites the first one index by index.
jose:
checkers:
claims:
api:
claims: ['exp', 'iat', 'nbf']
when@prod:
jose:
checkers:
claims:
api:
claims: ['aud_api']
In prod, jose.claim_checker.api is built from ['aud_api', 'iat', 'nbf']. The expiration check is gone there, while it runs in dev and test. The container compiles without any warning. The typ list of a header checker manager has no key attribute and is appended, so one manager definition merges its two lists in two different ways.
Lists concerned:
checkers.headers.<name>.headers,checkers.claims.<name>.claimsjws.loaders.<name>.header_checkers,jwe.loaders.<name>.header_checkersnested_token.loaders.<name>.jws_header_checkersandjwe_header_checkers- on 4.3.x,
selective_disclosure.verifiers.<name>.header_checkers,key_binding_header_checkersandclaim_checkers
The algorithm and serializer lists are declared the same way: ['RS256', 'HS256'] followed by ['ES256'] gives ['ES256', 'HS256'].
A checker added to a manager by another bundle through ConfigurationHelper::addHeaderChecker() or addClaimChecker() is lost the same way when the application also configures that manager.
Applications that configure each service in one place are not affected. Where a service is configured in two places with lists meant to add up, a check written in the configuration does not run in the environment that has the second configuration, and the tokens it would reject are accepted there.
How to reproduce
Configure the same checker manager in a when@prod block as above, then compare bin/console debug:config jose checkers --env=dev with --env=prod.
Possible Solution
- Remove
useAttributeAsKey('name')from the checker alias lists, so that a second configuration adds checkers and never removes one, and drop duplicate aliases after the merge (ConfigurationHelperprepends a copy of the firstjoseconfiguration, so the same alias can be seen twice). - For the algorithm and serializer lists, appending would widen what a service accepts:
performNoDeepMerging()(the last list wins) is the safer semantics there. - Changelog: a second list now adds to the first one instead of overwriting it by position. This can only add checks, but tokens accepted before may be rejected after the upgrade.
- Once the lists add up, one manager can receive two checkers for the same claim or header parameter, which #756 is about.
Additional Context
Found by the Anthropic OSS Scanner (ANT-2026-TNDTH33Z).
- 主要言語
- PHP
- スター
- 954
- フォーク
- 119
- 平均マージ
- 48分
- マージ済み PR(30日)
- 17
環境構築
このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
web-token/jwt-framework のほかの issue
-
enhancement
難易度 2/5 1〜3時間 初心者へのやさしさ 74/100
web-token/jwt-framework#757 ·
メンテナーはふだん 1 日以内に返信
-
bug
難易度 3/5 1〜2日 初心者へのやさしさ 68/100
web-token/jwt-framework#773 ·
メンテナーはふだん 1 日以内に返信
-
bug
難易度 4/5 3〜5日 初心者へのやさしさ 57/100
web-token/jwt-framework#772 ·
メンテナーはふだん 1 日以内に返信
-
enhancement
難易度 4/5 3〜5日 初心者へのやさしさ 55/100
web-token/jwt-framework#771 ·
メンテナーはふだん 1 日以内に返信
-
bug
難易度 4/5 3〜5日 初心者へのやさしさ 48/100
web-token/jwt-framework#770 ·
メンテナーはふだん 1 日以内に返信
web-token/jwt-framework の issue をすべて見る
似ている issue
-
enhancement priority Sales
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
novalo-dev/Prestashop-MCP-Server#201 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
メンテナーはふだん 1 日以内に返信
-
Include flows spanning the full report time window対応中かも @somethingwithproof が今日担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 77/100
Cacti/plugin_flowview#306 ·
メンテナーはふだん 1 日以内に返信
-
bug origin: upstream priority: low
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
mattytap/Mattytap-Sermons#105 ·
-
priority:low type:bug
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
crazy-goat/workerman-bundle#1189 ·
メンテナーはふだん 1 日以内に返信