こんにちは。 テクノロジー部門プロダクト基盤本部の大橋(@nal_6295)です。
この記事は STORES Advent Calendar 2022 の7日目となります。
はじめに
このプロダクトブログで過去2回、Goの社内勉強会を実施していることについて書いてきました。また、その中でID基盤の開発にGoを利用していることについて触れています。
その活動の中で、私が実施している内容の1つとしてGoのマイナーアップデートがあるたびに、マイナアップデートの内容についての概要と、セキュリティフィックスについてまとめています。
今回は、普段どうのようにマイナーアップデートに気づいて情報を整理しているのかについて紹介します。 今回は、少し前になりますが1.18.6および1.19.1の時の内容を例として進めていきます。
アップデートに気づくための手段
マイナーアップデートが出たときに反応する方法としては、以下を活用しています。
GoのTwitterアカウント
いつもGoのTwitterアカウントの投稿内容をslackのチャンネルに流しているので、だいたいそこで気づくことが多いです。
以下の投稿のような感じでアナウンスされます。
🎊 Go 1.19.1 and 1.18.6 are released!
— Go (@golang) 2022年9月6日
🔐 Security: Includes security fixes for net/http (CVE-2022-27664) and net/url (CVE-2022-32190).
🗣 Announcement: https://t.co/fp6xlWulU5
⬇️ Download: https://t.co/Jvhnu5BxAA#golang pic.twitter.com/GyFYeZr3t4
Announcementのリンクは golang-announce Google Group の投稿へのリンクとなっています。
Google Group
TwitterのAnnouncementのリンクにもありますが、google-announceの Google Group に入っていて、そちらのアナウンスも確認しています。
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にアクセスして内容を確認します。
相対パスが後続に来るJoinPathのときに、相対パスの部分が消えないので、結果的にディレクトリトラバーサルができてしまうことがわかります。
次に、どのような修正がされているのかを確認します。
該当のIssueを確認していくと、それぞれバックポートするIssueがリンクされています。
1.18.6
1.19.1
1.18.6の方は、コメントにThis API was introduced in 1.19, thus the backport does not apply.
とあるように、1.19からの機能だからということがわかり、特にCherryPickされることなくクローズされていることがわかります。
1.19.1の方を見に行くと、cherrypickされたコミットがリンクされているので、それを見に行きます。
実際に修正された内容を確認して、解釈した内容についてマイナーアップデートをまとめているドキュメントに整理します。 時間があるときにローカルでテストを利用して再現させることもあります。
最後に、CVE-2022-32190を確認してリンクを貼っておきます。
アップデート時点でスコアが出ていることはないですが、12月1日時点では7.5というスコアになっています。
それぞれのFixについて開発しているプロダクトに影響がないのかを確認します。
今回、詳細を説明することはしませんが以下で説明されている、govulncheck
を利用してみても良いですね。
最後に
Goのマイナーアップデートを追っている方法の紹介は、以上となります。
このように追い続けていると、マイナーアップデートごとの特色などもわかります。 たとえば stack exhaustion がまとめて修正されているアップデートがあったり、同じような内容でも、それぞれのIssueで修正方針の違いに気づいたりできます。
このようなことに個人的な面白みを感じて、実益をかねて毎回まとめています。