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
890
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
1.9k
Other Decks in Technology
See All in Technology
KubeCon + CloudNativeCon Japan 2025 Recap
ren510dev
1
300
LangSmith×Webhook連携で実現するプロンプトドリブンCI/CD
sergicalsix
1
150
Fabric + Databricks 2025.6 の最新情報ピックアップ
ryomaru0825
1
160
Connect 100+を支える技術
kanyamaguc
0
150
無意味な開発生産性の議論から抜け出すための予兆検知とお金とAI
i35_267
0
860
変化する開発、進化する体系時代に適応するソフトウェアエンジニアの知識と考え方(JaSST'25 Kansai)
mizunori
1
260
ネットワーク保護はどう変わるのか?re:Inforce 2025最新アップデート解説
tokushun
0
150
「良さそう」と「とても良い」の間には 「良さそうだがホンマか」がたくさんある / 2025.07.01 LLM品質Night
smiyawaki0820
1
430
2025-06-26_Lightning_Talk_for_Lightning_Talks
_hashimo2
2
110
ビギナーであり続ける/beginning
ikuodanaka
1
190
作曲家がボカロを使うようにPdMはAIを使え
itotaxi
0
380
React開発にStorybookとCopilotを導入して、爆速でUIを編集・確認する方法
yu_kod
1
100
Featured
See All Featured
It's Worth the Effort
3n
185
28k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
48
2.9k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Adopting Sorbet at Scale
ufuk
77
9.4k
The Invisible Side of Design
smashingmag
300
51k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
How GitHub (no longer) Works
holman
314
140k
Code Review Best Practice
trishagee
69
18k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.9k
For a Future-Friendly Web
brad_frost
179
9.8k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
30
2.1k
The Cost Of JavaScript in 2023
addyosmani
51
8.5k
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を使いたくない理由がない限り デフォルト値で問題なし
ご清聴ありがとうございました