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
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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
850
Mapのパフォーマンス向上のために検討されているSwissTableを理解する
replu
2
2.4k
Other Decks in Technology
See All in Technology
AmplifyHostingConstructからSSRフレームワークのためのホスティング設計を考察する/amplify-hosting-construct
fossamagna
1
300
Playwright × AI Agent でE2Eテストはどう変わるか AI駆動テストの可能性と実用検証の結果
taiga7543
2
780
人とエージェントが高め合う協業設計
kintotechdev
0
740
ファミコンでPHPを動かす / PHP on the Famicom
tomzoh
2
600
AIコード生成×サプライチェーン攻撃 — PHPが直面する“二重の信頼問題
shinyasaita
0
450
Devsumi 2026 Summer 人もAIも使える共通基盤を事業の加速装置にする~デザインシステム運用に学ぶ組織レバレッジ~ 渡辺 凌央
legalontechnologies
PRO
1
280
テックカンファレンス三大ステークホルダーの文化人類学 ─ 違いを認め合う関係性作り
bash0c7
0
120
[Droidcon Orlando '26] The Android Lens: Applying Mobile Forensics to AI Performance
amanda_hinchman
1
110
GoでCコンパイラを作った話
repunit
0
150
「休む」重要さ
smt7174
6
1.6k
AI工学特論: MLOps・継続的評価
asei
4
540
そのドキュメント、自動化しませんか?
yuksew
1
400
Featured
See All Featured
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
470
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
460
Making Projects Easy
brettharned
120
6.7k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
Designing for Timeless Needs
cassininazir
1
390
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Context Engineering - Making Every Token Count
addyosmani
9
1k
Become a Pro
speakerdeck
PRO
31
6k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.9k
The Limits of Empathy - UXLibs8
cassininazir
1
530
The Invisible Side of Design
smashingmag
301
52k
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を使いたくない理由がない限り デフォルト値で問題なし
ご清聴ありがとうございました