Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Go Getでのchecksum不一致に遭遇した話とその対応
Search
natsumi
December 01, 2023
Technology
1.1k
0
Share
Go Getでのchecksum不一致に遭遇した話とその対応
Go Conference mini 2023 Winter IN KYOTOで発表したLTの資料
natsumi
December 01, 2023
More Decks by natsumi
See All by natsumi
Go Conference mini in Sendai 2026: database/sql/driverを理解してカスタムデータベースドライバーを作る
replu
0
800
Mapのパフォーマンス向上のために検討されているSwissTableを理解する
replu
2
2.4k
Other Decks in Technology
See All in Technology
脅威をエンジニアリングの糧にして:恐怖を乗り越えた先にあったもの / Turn threats into fuel for engineering: what lay beyond overcoming fear
nrslib
1
340
long-running-tasks
cipepser
2
430
20260528_生成AIを専属DSに_Howの次にすべきことを考える
doradora09
PRO
0
250
さきさん文庫の書籍ができるまで
sakiengineer
0
300
OpenID Connectによるサービス間連携
takesection
0
140
Spring Boot における AOT Cache 活用テクニックと 起動時間改善事例
ntt_dsol_java
0
170
Anthropic AIネイティブ・スタートアップ構築のプレイブック を理解する
nagatsu
0
210
Strands Agents超入門
kintotechdev
1
130
コードレビューを制するチームがソフトウェアデリバリーのフローを制す / Beyond Code Review: Distributing Its Responsibilities Across the SDLC
mtx2s
1
310
A Harness for Behaviour: how to get AI to generate code that does what we intend, or "TDD in the age of AI"
xpmatteo
0
490
イベントで大活躍する電子ペーパー名札 〜その3〜 / ビジュアルプログラミングIoTLT vol.23
you
PRO
0
160
シンデレラなんかになりたくない!ガラスの靴が割れた時代にどう歩く?
nomizone
0
220
Featured
See All Featured
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
190
30 Presentation Tips
portentint
PRO
1
300
Agile that works and the tools we love
rasmusluckow
331
21k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
180
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.7k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
710
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
130
Documentation Writing (for coders)
carmenintech
77
5.3k
Transcript
Go Getでのchecksum不一致 に遭遇した話とその対応 Go Conference mini 2023 Winter, DEC 02
2023 Natsumi Kojima ANDPAD Inc. @replu5
小島 夏海 • 株式会社アンドパッド ◦ 最近は社内向けの通知プラットフォームの開発・運用 : replu : replu5
自己紹介
go getでのchecksum不一致
go get コマンドでモジュールを取得する時にchecksumの 不一致のエラーに遭遇したことある人いますか? 遭遇したことがない人は下記コマンドで確認できます GOPROXY=direct go get github.com/replu/
[email protected]
遭遇したエラーについて checksum server の checksum と一致してないのは わかるがここからどうすればいいのかわからなかった
go get時にどういう動作をしているか モジュール配布元 checksum server go get xxx 1 :
モジュールダウンロード 2 : checksum ダウンロード 3 : 計算したchecksum とダウンロードした checksumと比較 4 : go.modとgo.sum更新
go get時にどういう動作をしているか モジュール配布元 checksum server go get xxx 1 :
モジュールダウンロード 2 : checksum ダウンロード 3 : 計算したchecksum とダウンロードした checksumと比較 4 : go.modとgo.sum更新
エラーの原因 エラーメッセージに考えられる理由が2つ書かれている • オリジンサーバが上書きされている (The bits may have been replaced
on the origin server) • ダウンロードが攻撃者に傍受された可能性がある (An attacker may have intercepted the download attempt) オリジンサーバが上書きされているかがわかればよさそう
checksumを確認する オリジンサーバで上書きがあったならダウンロードして checksumを計算し、checksum serverのchecksumと比較した 時に異なるはずなので、実際に比較してみる checksumは https://pkg.go.dev/golang.org/x/mod/sumdb/dirhash を使用することで計算可能
fileのハッシュを求める open := func(fn string) (io.ReadCloser, error) { return os.Open(fn)
} filePath := "go.mod" s, err := dirhash.Hash1([]string{filePath}, open) if err != nil { fmt.Println(err.Error()) } fmt.Println(s) https://go.dev/play/p/7aEARvckJjD
directoryのハッシュを求める dir := "
[email protected]
" prefix := "github.com/replu/
[email protected]
" s, err :=
dirhash.HashDir(dir, prefix, dirhash.DefaultHash) if err != nil { fmt.Println(err.Error()) } fmt.Println(s) https://go.dev/play/p/UofHVjffeuy
ツールを使ってchecksumを求める ツールを利用してもchecksumを確認できる https://github.com/vikyd/go-checksum ディレクトリのchecksumを求める例
checksum serverのchecksumを取得する checksum serverに保存されているchecksumは $base/lookup/$module@version で取得でき、デフォルトのchecksum serverの場合 $base = sum.golang.org
checksumが一致しないことが確認できたら • checksum serverのchecksumは更新できない ◦ そのバージョンは利用しないようにする ▪ GONOSUMDB を指定することで checksum
の確認をしない ようにできるが、攻撃を受けた時に気付けないのでおすすめは しない ◦ 開発者に連絡して、新バージョンをリリースしてもらう ▪ そのライブラリを利用している他ライブラリが新バージョンを 使っていないなら、そちらも更新してもらう必要がある 自分の場合は新バージョンがでていたが、他ライブラリが 新バージョンを使ってなかったので、そちらにissueを作成して連絡 した
どうして発生するのか
go get時の動作(再喝) モジュール配布元 checksum server go get xxx 1 :
モジュールダウンロード 2 : checksum ダウンロード 3 : 計算したchecksum とダウンロードした checksumと比較 4 : go.modとgo.sum更新
go get時の動作(再喝) モジュール配布元 checksum server go get xxx 1 :
モジュールダウンロード 2 : checksum ダウンロード 3 : 計算したchecksum とダウンロードした checksumと比較 4 : go.modとgo.sum更新 この2つの仕様の違いが原因
ダウンロード元とchecksum serverの指定 • GOPROXY ◦ モジュールのダウンロード元を指定する ◦ デフォルトだと proxy.golang.org,direct ▪
directを指定した場合は直接アクセスになる ▪ カンマ区切りまたはパイプ区切りで指定し、前のものから 使用される • GOSUBDB ◦ checksum serverを指定する ▪ デフォルトではsum.golang.org ◦ offを指定した場合は検証を無効化できる
proxy.golang.orgとsum.golang.org • proxy.golang.org ◦ 明示的にキャッシュを削除することはできない ▪ 無限に保存されるわけではなく適切なライセンスを 検出できない場合などは一定時間でキャッシュが削除される • sum.golang.org
◦ 一度記録されたら更新・削除されることはない sum.golang.orgに記録された後にオリジンサーバが上書き された場合、proxy.golang.orgのキャッシュが更新される or directでアクセスしているとchecksumが不一致になる
まとめ • checksum不一致のエラーに遭遇したらchecksumを確認 して、オリジンサーバに上書きがあったのか確認する ◦ 上書きがあった場合は新バージョンをリリースして もらう必要ある • sum.golang.orgに記録された後で上書きすると問題が 発生するので、一度公開した後は上書きしないように
すべき • checksumは https://pkg.go.dev/golang.org/x/mod/sumdb/dirhash を用いることで計算できる
参考文献 • Go Module Mirror, Index, and Checksum Database :
https://sum.golang.org/ • Go Modules Reference : https://go.dev/ref/mod
おまけ
アクセス制限しているモジュールの場合 • GOPRIVATE環境変数を設定する ◦ GOPRIVATEに設定されているモジュールの場合 ▪ モジュールプロキシは利用されず、直接アクセス (GOPROXY=direct相当) ▪ checksumの確認は実施されない
環境変数に設定する値まとめ • GOPRIVATE ◦ プライベートモジュールのパスの接頭辞を指定 • GOPROXY ◦ 公式のプロキシサーバを使いたくない理由がない限り デフォルトで問題なし
• GOSUMDB ◦ 公式のchecksum serverを使いたくない理由がない限り デフォルト値で問題なし
ご清聴ありがとうございました