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
クラウドセキュリティの進化 — AWSの20年を振り返る
kei4eva4
0
160
【Oracle Cloud ウェビナー】ランサムウェアが突く「侵入の隙」とバックアップの「死角」 ~ 過去の教訓に学ぶ — 侵入前提の防御とデータ保護 ~
oracle4engineer
PRO
2
220
re:Inventで見つけた「運用を捨てる」技術。
ezaki
1
140
AWS Network Firewall Proxyで脱Squid運用⁈
nnydtmg
1
160
持続可能な開発のためのミニマリズム
sansantech
PRO
4
570
The Engineer with a Three-Year Cycle - 2
e99h2121
0
190
KubeCon + CloudNativeCon NA ‘25 Recap, Extensibility: Gateway API / NRI
ladicle
0
120
VRTと真面目に向き合う
hiragram
1
480
「AIでできますか?」から「Agentを作ってみました」へ ~「理論上わかる」と「やってみる」の隔たりを埋める方法
applism118
5
4k
20260120 Amazon VPC のパブリックサブネットを無くしたい!
masaruogura
2
160
2026/01/16_実体験から学ぶ 2025年の失敗と対策_Progate Bar
teba_eleven
1
220
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
10k
Featured
See All Featured
Mobile First: as difficult as doing things right
swwweet
225
10k
Producing Creativity
orderedlist
PRO
348
40k
Deep Space Network (abreviated)
tonyrice
0
36
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.3k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.8k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
280
Amusing Abliteration
ianozsvald
0
87
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.7k
Code Reviewing Like a Champion
maltzj
527
40k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
2
310
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を使いたくない理由がない限り デフォルト値で問題なし
ご清聴ありがとうございました