要約

  • RFC 3741 は、要素名や属性名に実際に現れる接頭辞を中心に名前空間宣言を出力し、切り出した XML フラグメントの署名が祖先の無関係な文脈に左右されにくくした。
  • ただし、継承された xml: 属性や値の中にだけ現れる接頭辞まで文脈依存を消すわけではない。再包絡後に署名バイトが同じでも、アプリケーションの解釈は変わり得る。

外側の包絡で内側の署名を書き換えない

大きな XML メッセージ内の小さな要素に署名するプロトコルを考える。ゲートウェイが外側を取り除き、別のサービスが同じ要素を新しいメッセージに入れる。Inclusive Canonical XML では、祖先の名前空間宣言や一部の xml: 属性が、フラグメント自身に使われていなくても正規化されたオクテット列に入ることがある。外側だけを変えた結果、内容は同じなのにダイジェスト入力が変わり、署名検証が失敗する。

2004 年 3 月に公表された RFC 3741 は、この摩擦を対象にした。XPath ノード集合を独占的にシリアライズし、祖先の名前空間の大半は引き継がず、要素名または属性名で接頭辞が見える場合を中心に宣言を出力する。例外的に残したい接頭辞は InclusiveNamespaces PrefixList に列挙できる。狙いは、署名済みサブ文書を元の包絡から切り離して別の場所へ移しても、無関係な輸送ラッパーが正規形に入り込まないようにすることだった。

これは境界の選び方であり、意味まで文脈から独立する保証ではない。RFC 自身が制約を明記している。RFC 3075 は XML Signature が何を対象にするかを扱い、RFC 3076 は解析後のノード集合をどう正規化するかを説明する。RFC 3741 の焦点は、そのノード集合を移動する際に何の文脈を残すかだ。

「見える」という判定は便利だが狭い

判定基準は XML の名前である。要素名または属性名が n1 を使えば、名前空間バインディングを出力する。祖先が宣言したものの、こうした名前に現れない接頭辞は省略できる。SOAP などの包絡には、メッセージ外枠には必要でも抽出対象には関係ない宣言がある。独占正規化はそのノイズを除き、異なる包絡にある同じペイロードから同じ正規化バイトを作りやすくする。

しかし、アプリケーションの意味はノード名から見えない情報に依存する場合がある。属性値の XPath 式が接頭辞を参照するかもしれない。xsi:type="xsd:decimal" のような文字列をアプリケーションが QName として扱う一方、XPath は単なる文字列と認識することもある。要素名・属性名で xsd が見えず、包括リストにも入っていなければ、そのバインディングは省略され得る。移動先ではアプリケーションがその値を別の意味に解釈するかもしれない。

RFC が挙げる対処は三つある。接頭辞の用途を XML 構造上で見える形にする、すべての解釈環境で同じバインディングを保証する、または接頭辞を InclusiveNamespaces PrefixList に追加する。いずれも事前の設計判断を要する。包括リストは、隠れた QName の意味を自動検出する仕組みではない。

署名バイトに含まれない文脈も読み手を左右する

独占正規化は、祖先の xml:lang、xml:space、xml:base を孤立したサブセットへコピーしない。これらは言語、空白処理、相対参照の解決に影響する。RFC は、必要な値をサブセット内に明示するか、どの解釈環境でも同等の値があることを保証するよう求める。

移動先の文脈に関する注意はさらに明確だ。異なるデフォルト名前空間を持つ新しい祖先の下へ移しても、フラグメントの正規化オクテットは変わらないことがある。それでも受信側のアプリケーションは、接頭辞のない要素を別の名前空間に属するものとして解釈し、別種のオブジェクトと扱い得る。署名は選択されたバイトが変わらないため検証に通るが、移動先の文脈が変わればアプリケーションの意味付けも変わる可能性がある。

RFC 3741 は切り出し、挿入、名前空間宣言の補正方法を規定せず、受信側の操作権限も判断しない。関連文脈をどう運ぶか、受信者が結果をどう扱うかはプロトコル側の責任である。暗号学的完全性は処理経路の一部分にすぎない。

署名の境界を狭めると統合作業が増える

独占正規化は、包絡への偶発的依存を減らす代わりに、意味上の依存関係を列挙する責任を明示した。署名済みフラグメントを転送する場合、検証結果だけでなく、接頭辞、xml: 属性、QName 値、相対参照が移動先でも同じ意味を持つかを確認する必要がある。契約が曖昧だと、署名の安定が意味の安定だと誤認される。

ここで述べているのは仕様上のリスク構造であり、特定の攻撃や実装障害の証拠ではない。RFC 3741 は Informational 文書で、アルゴリズムの狙いと制約を示す。普及率や特定サービスの取り扱いを示すものではない。文脈を署名バイトから除けば可搬性は上がるが、省略された文脈のうち何が解釈を左右し続けるかを把握できるのはアプリケーションだけだ。

出典