STORES Product Blog

こだわりを持ったお商売を支える「STORES」のテクノロジー部門のメンバーによるブログです。

Goのマイナーアップデートを追っている方法の紹介

こんにちは。 テクノロジー部門プロダクト基盤本部の大橋(@nal_6295)です。

この記事は STORES Advent Calendar 2022 の7日目となります。

はじめに

このプロダクトブログで過去2回、Goの社内勉強会を実施していることについて書いてきました。また、その中でID基盤の開発にGoを利用していることについて触れています。

product.st.inc

product.st.inc

その活動の中で、私が実施している内容の1つとしてGoのマイナーアップデートがあるたびに、マイナアップデートの内容についての概要と、セキュリティフィックスについてまとめています。

今回は、普段どうのようにマイナーアップデートに気づいて情報を整理しているのかについて紹介します。 今回は、少し前になりますが1.18.6および1.19.1の時の内容を例として進めていきます。

アップデートに気づくための手段

マイナーアップデートが出たときに反応する方法としては、以下を活用しています。

GoのTwitterアカウント

twitter.com

いつもGoのTwitterアカウントの投稿内容をslackのチャンネルに流しているので、だいたいそこで気づくことが多いです。

以下の投稿のような感じでアナウンスされます。

Announcementのリンクは golang-announce Google Group の投稿へのリンクとなっています。

Google Group

TwitterのAnnouncementのリンクにもありますが、google-announceの Google Group に入っていて、そちらのアナウンスも確認しています。

groups.google.com

Twitterではリリース時の投稿のみされます。 しかしgoogle-announceでは、以下の Security Plicyにあるように、Tracksの分類がPRIVATEのときは1週間前に予告があります。

Three to seven days before the release, a pre-announcement is sent to golang-announce, announcing the presence of a security fix in the upcoming releases, and whether the issue affects the standard library, the toolchain, or both (but not disclosing any more details).

Go Security Policy - The Go Programming Language

参考までに、1.19.1リリースの時のpre announcementへのリンクを貼ります。

[security] Go 1.19.1 and Go 1.18.6 pre-announcement

内容を確認する

Annnoncementの内容を確認する

まずはAnnouncementの内容を確認します。

以下に、1.19.1リリースの時のリンクを貼ります。

[security] Go 1.19.1 and Go 1.18.6 are released

内容を見ていただくと、2つのセキュリティフィックスの概要と、それぞれのIssueへのリンク、発行されているCVEの番号などがわかります。

また、リリースノートへのリンクも貼られています。

Release History - The Go Programming Language

マイルストーンを見に行ってそれぞれの件数についてざっくりと知る

1.18.6および 1.19.1のケースの場合以下のマイルストーンが用意されています。

1.18.6 github.com

1.19.1 github.com

1.18.6は全部で19のissueがcloseされており、そのうちSecurity Fixはアナウンスと違い1つでnet/httpの方のSecurity Fixのみが対象とわかります。

1.19.1は全部で21のissueがcloseされており、そのうちSecurity Fixはアナウンスどおり2つあります。

Security Fixについて確認をする

最後にSecurity Fixについて確認をします。

まずは、AnnouncementからそれぞれのIssueを参照します。

今回は参考までに、net/urlの方のIssueで何をしているのかを説明します。

最初に該当のIssueにアクセスして内容を確認します。

go.dev

相対パスが後続に来るJoinPathのときに、相対パスの部分が消えないので、結果的にディレクトリトラバーサルができてしまうことがわかります。

次に、どのような修正がされているのかを確認します。

該当のIssueを確認していくと、それぞれバックポートするIssueがリンクされています。

1.18.6

github.com

1.19.1

github.com

1.18.6の方は、コメントにThis API was introduced in 1.19, thus the backport does not apply.とあるように、1.19からの機能だからということがわかり、特にCherryPickされることなくクローズされていることがわかります。

1.19.1の方を見に行くと、cherrypickされたコミットがリンクされているので、それを見に行きます。

github.com

実際に修正された内容を確認して、解釈した内容についてマイナーアップデートをまとめているドキュメントに整理します。 時間があるときにローカルでテストを利用して再現させることもあります。

最後に、CVE-2022-32190を確認してリンクを貼っておきます。

nvd.nist.gov

アップデート時点でスコアが出ていることはないですが、12月1日時点では7.5というスコアになっています。

それぞれのFixについて開発しているプロダクトに影響がないのかを確認します。

今回、詳細を説明することはしませんが以下で説明されている、govulncheckを利用してみても良いですね。

go.dev

最後に

Goのマイナーアップデートを追っている方法の紹介は、以上となります。

このように追い続けていると、マイナーアップデートごとの特色などもわかります。 たとえば stack exhaustion がまとめて修正されているアップデートがあったり、同じような内容でも、それぞれのIssueで修正方針の違いに気づいたりできます。

このようなことに個人的な面白みを感じて、実益をかねて毎回まとめています。