[インデックス 16181] ファイルの概要
このコミットは、Go言語の標準ライブラリ net/http/cookiejar
パッケージにおいて、PublicSuffixList
インターフェースの実装に関する重要な情報、具体的には code.google.com/p/go.net/publicsuffix
パッケージの存在をドキュメントに追加するものです。これにより、開発者が安全なクッキー管理を行う上で、パブリックサフィックスリストの概念と、そのGo言語での実装の利用を促し、セキュリティ上の脆弱性を回避することを目的としています。
コミット
- コミットハッシュ:
83b7b0e24f6060259a4837017e2f9d51cbd01aec
- Author: Shenghou Ma minux.ma@gmail.com
- Date: Tue Apr 16 04:29:55 2013 +0800
- Subject: net/http/cookiejar: mention go.net/publicsuffix.
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/83b7b0e24f6060259a4837017e2f9d51cbd01aec
元コミット内容
commit 83b7b0e24f6060259a4837017e2f9d51cbd01aec
Author: Shenghou Ma <minux.ma@gmail.com>
Date: Tue Apr 16 04:29:55 2013 +0800
net/http/cookiejar: mention go.net/publicsuffix.
R=golang-dev, r, gary.burd, dr.volker.dobler
CC=golang-dev
https://golang.org/cl/8660046
---
src/pkg/net/http/cookiejar/jar.go | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/pkg/net/http/cookiejar/jar.go b/src/pkg/net/http/cookiejar/jar.go
index 5d1aeb87fd..5977d48b63 100644
--- a/src/pkg/net/http/cookiejar/jar.go
+++ b/src/pkg/net/http/cookiejar/jar.go
@@ -28,6 +28,9 @@ import (
// An implementation that always returns "" is valid and may be useful for
// testing but it is not secure: it means that the HTTP server for foo.com can
// set a cookie for bar.com.
+//
+// A public suffix list implementation is in the package
+// code.google.com/p/go.net/publicsuffix.
type PublicSuffixList interface {
// PublicSuffix returns the public suffix of domain.
//
変更の背景
このコミットの背景には、HTTPクッキーのセキュリティ上の重要な課題があります。ウェブブラウザやHTTPクライアントがクッキーを扱う際、あるドメインが別のドメインのためにクッキーを設定することを防ぐ必要があります。例えば、example.com
が co.uk
のためにクッキーを設定できてしまうと、co.uk
ドメイン下のすべてのサイトに影響を与える可能性があります。これは、co.uk
のようなトップレベルドメイン(TLD)や、それに準ずるドメイン(例: .com
, .org
, .net
など)が、実際には多くの異なる組織によって共有されている「パブリックサフィックス」であるためです。
net/http/cookiejar
パッケージは、HTTPクライアント側でクッキーを管理するための機能を提供しますが、そのセキュリティを確保するためには、どのドメインが「登録可能なドメイン」(つまり、クッキーを設定できる最小単位のドメイン)であるかを正確に判断する必要があります。この判断を誤ると、悪意のあるサイトが他のサイトのクッキーを乗っ取ったり、セッション固定攻撃を行ったりするリスクが生じます。
このコミットは、PublicSuffixList
インターフェースのコメントに code.google.com/p/go.net/publicsuffix
パッケージへの言及を追加することで、開発者に対して、このセキュリティ上の課題を解決するための公式な推奨実装があることを明確に示しています。これにより、開発者が安全なクッキー管理を実装する際の指針を提供し、潜在的なセキュリティ脆弱性を未然に防ぐことを目的としています。
前提知識の解説
HTTP クッキー (HTTP Cookies)
HTTPクッキーは、ウェブサイトがユーザーのブラウザに保存する小さなデータ片です。主にセッション管理(ログイン状態の維持)、パーソナライゼーション(ユーザー設定の記憶)、トラッキング(ユーザー行動の追跡)などに利用されます。クッキーは、HTTPレスポンスヘッダーの Set-Cookie
フィールドによってサーバーからクライアントに送信され、以降のHTTPリクエストでは Cookie
ヘッダーとしてクライアントからサーバーに送信されます。
クッキーのドメイン属性 (Domain Attribute of Cookies)
クッキーには Domain
属性があり、これはそのクッキーがどのドメインに送信されるべきかを指定します。例えば、Domain=example.com
と設定されたクッキーは、example.com
およびそのサブドメイン(例: www.example.com
, sub.example.com
)に送信されます。しかし、この Domain
属性の解釈には注意が必要です。特に、Domain=.com
のように設定することは、セキュリティ上の理由から許可されていません。クッキーは、パブリックサフィックスに対して設定することはできず、登録可能なドメイン(eTLD+1)に対してのみ設定できます。
パブリックサフィックスリスト (Public Suffix List, PSL)
パブリックサフィックスリスト(PSL)は、インターネット上のドメイン名の中で、「登録可能なドメイン」の基盤となる部分(パブリックサフィックス)を列挙したリストです。例えば、.com
, .org
, .co.uk
, .jp
などがパブリックサフィックスです。このリストは、Mozillaによって管理されており、ブラウザや他のアプリケーションが、あるドメインが「登録可能なドメイン」(Effective TLD + 1, eTLD+1)であるかどうかを判断するために使用されます。
なぜPSLが必要か?
PSLがない場合、foo.co.uk
というドメインが co.uk
に対してクッキーを設定できてしまう可能性があります。しかし、co.uk
は多くの異なる組織が共有するパブリックサフィックスであり、もしこれが可能になると、bar.co.uk
のような別のサイトのクッキーを foo.co.uk
が読み取ったり、上書きしたりするセキュリティ上の問題が発生します。PSLを使用することで、ブラウザやアプリケーションは co.uk
がパブリックサフィックスであることを認識し、co.uk
に対して直接クッキーを設定することを禁止し、example.co.uk
のような「登録可能なドメイン」に対してのみクッキーを設定するように強制します。
go.net/publicsuffix
パッケージ
go.net/publicsuffix
は、Go言語でパブリックサフィックスリストを扱うためのパッケージです。このパッケージは、Mozilla Public Suffix Listのデータを利用して、与えられたドメイン名からパブリックサフィックスを抽出したり、登録可能なドメインを判断したりする機能を提供します。net/http/cookiejar
パッケージの PublicSuffixList
インターフェースは、この go.net/publicsuffix
パッケージの実装を利用することを想定しています。
技術的詳細
net/http/cookiejar
パッケージの Jar
型は、HTTPクッキーを安全に保存および取得するための http.CookieJar
インターフェースの実装です。この Jar
型がクッキーのドメインを適切に処理するためには、PublicSuffixList
インターフェースの実装が必要です。
PublicSuffixList
インターフェースは以下のメソッドを定義しています。
type PublicSuffixList interface {
// PublicSuffix returns the public suffix of domain.
//
// For example:
// - "example.com" returns "com"
// - "foo.example.com" returns "com"
// - "bar.foo.example.com" returns "com"
// - "example.co.uk" returns "co.uk"
// - "foo.example.co.uk" returns "co.uk"
PublicSuffix(domain string) string
// PublicSuffix returns the public suffix of domain.
//
// For example:
// - "example.com" returns "example.com"
// - "foo.example.com" returns "example.com"
// - "bar.foo.example.com" returns "example.com"
// - "example.co.uk" returns "example.co.uk"
// - "foo.example.co.uk" returns "example.co.uk"
//
// This method is used to determine the "registrable domain" for a given domain.
// A cookie can only be set for a registrable domain or its subdomains.
// Setting a cookie for a public suffix (e.g., ".com", ".co.uk") is forbidden.
PublicSuffix(domain string) string
}
このインターフェースの目的は、与えられたドメイン名から「パブリックサフィックス」を正確に特定することです。これにより、cookiejar
はクッキーが設定されるドメインが、パブリックサフィックスではない「登録可能なドメイン」(eTLD+1)であることを検証できます。
コミットが追加したコメントは、この PublicSuffixList
インターフェースの実装として、code.google.com/p/go.net/publicsuffix
パッケージが利用可能であることを明示しています。このパッケージは、Mozilla Public Suffix Listの最新のデータに基づいて、正確なパブリックサフィックスの判断を提供します。
もし PublicSuffixList
の実装が適切でない場合(例えば、常に空文字列を返すような実装の場合)、foo.com
のHTTPサーバーが bar.com
のためにクッキーを設定できてしまうというセキュリティ上の脆弱性が発生します。これは、cookiejar
がドメインの境界を正しく認識できないためです。このコミットは、この潜在的な危険性を強調し、開発者に安全な実装の利用を促すことで、Go言語のHTTPクライアントアプリケーションのセキュリティを向上させることに貢献しています。
コアとなるコードの変更箇所
変更は src/pkg/net/http/cookiejar/jar.go
ファイルの PublicSuffixList
インターフェースの定義部分にあります。
--- a/src/pkg/net/http/cookiejar/jar.go
+++ b/src/pkg/net/http/cookiejar/jar.go
@@ -28,6 +28,9 @@ import (
// An implementation that always returns "" is valid and may be useful for
// testing but it is not secure: it means that the HTTP server for foo.com can
// set a cookie for bar.com.
+//
+// A public suffix list implementation is in the package
+// code.google.com/p/go.net/publicsuffix.
type PublicSuffixList interface {
// PublicSuffix returns the public suffix of domain.
//
具体的には、以下の3行が追加されました。
//
// A public suffix list implementation is in the package
// code.google.com/p/go.net/publicsuffix.
コアとなるコードの解説
追加されたコメントは、PublicSuffixList
インターフェースの既存のコメントの直後に挿入されています。既存のコメントは、PublicSuffixList
の実装が常に空文字列を返す場合、それがテストには役立つかもしれないが、セキュリティ上は安全ではない(例: foo.com
が bar.com
のクッキーを設定できてしまう)と警告しています。
新たに追加されたコメントは、このセキュリティ上の懸念に対する具体的な解決策を提示しています。それは、code.google.com/p/go.net/publicsuffix
パッケージがパブリックサフィックスリストの実装を提供しているという情報です。
この変更はコードの振る舞いを直接変更するものではなく、ドキュメントの改善です。しかし、このドキュメントの改善は非常に重要です。なぜなら、net/http/cookiejar
を利用する開発者が、安全なクッキー管理のために PublicSuffixList
をどのように実装すべきか、あるいはどの既存のパッケージを利用すべきかについて、明確な指針を与えるからです。これにより、開発者が誤った実装を選択し、セキュリティ上の脆弱性を導入するリスクを低減できます。
関連リンク
- RFC 6265 - HTTP State Management Mechanism - HTTPクッキーの仕様を定義するRFC。特にセクション5.3「Domain Matching」とセクション5.4「Cookie Storage and Retrieval」が関連します。
- Mozilla Public Suffix List - パブリックサフィックスリストの公式ウェブサイト。リストの目的、構造、および最新のリストデータが提供されています。
- GoDoc: net/http/cookiejar package - Go言語の
net/http/cookiejar
パッケージの公式ドキュメント。 - GoDoc: golang.org/x/net/publicsuffix package -
code.google.com/p/go.net/publicsuffix
は現在golang.org/x/net/publicsuffix
に移行しています。このパッケージの公式ドキュメント。