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
0
1k
Go Getでのchecksum不一致に遭遇した話とその対応
Go Conference mini 2023 Winter IN KYOTOで発表したLTの資料
natsumi
December 01, 2023
Tweet
Share
More Decks by natsumi
See All by natsumi
Mapのパフォーマンス向上のために検討されているSwissTableを理解する
replu
2
2.2k
Other Decks in Technology
See All in Technology
Building Serverless AI Memory with Mastra × AWS
vvatanabe
0
610
アプリにAIを正しく組み込むための アーキテクチャ── 国産LLMの現実と実践
kohju
0
230
Bedrock AgentCore Memoryの新機能 (Episode) を試してみた / try Bedrock AgentCore Memory Episodic functionarity
hoshi7_n
2
1.9k
Connection-based OAuthから学ぶOAuth for AI Agents
flatt_security
0
390
Agentic AIが変革するAWSの開発・運用・セキュリティ ~Frontier Agentsを試してみた~ / Agentic AI transforms AWS development, operations, and security I tried Frontier Agents
yuj1osm
0
100
障害対応訓練、その前に
coconala_engineer
0
200
Cloud WAN MCP Serverから考える新しいネットワーク運用 / 20251228 Masaki Okuda
shift_evolve
PRO
0
100
ESXi のAIOps だ!2025冬
unnowataru
0
390
LayerX QA Night#1
koyaman2
0
270
MySQLとPostgreSQLのコレーション / Collation of MySQL and PostgreSQL
tmtms
1
1.3k
Agent Skillsがハーネスの垣根を超える日
gotalab555
6
4.5k
[Data & AI Summit '25 Fall] AIでデータ活用を進化させる!Google Cloudで作るデータ活用の未来
kirimaru
0
4k
Featured
See All Featured
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
520
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
10
760
A Tale of Four Properties
chriscoyier
162
23k
We Are The Robots
honzajavorek
0
120
ラッコキーワード サービス紹介資料
rakko
0
1.8M
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.6k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
7.9k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
94
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を使いたくない理由がない限り デフォルト値で問題なし
ご清聴ありがとうございました