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 関連の個人的おもしろCVE 5選 / my favorite go cve
Search
convto
June 18, 2024
3
360
Go 関連の個人的おもしろCVE 5選 / my favorite go cve
convto
June 18, 2024
Tweet
Share
More Decks by convto
See All by convto
gob バイナリが Go バージョンによって 出力が変わることについて調べてみた / Investigating How gob Binary Output Changes Across Go Versions
convto
0
71
バイナリを眺めてわかる gob encoding の仕様と性質、適切な使い方 / understanding gob encoding
convto
6
2.2k
みんなでたのしむ math/big / i love math big
convto
0
210
Go1.22からの疑似乱数生成器について/go-122-pseudo-random-generator
convto
2
550
Go1.20からサポートされるtree構造のerrの紹介と、treeを考慮した複数マッチができるライブラリを作った話/introduction of tree structure err added since go 1_20
convto
0
950
byte列のbit表現を得るencodingライブラリ作った
convto
1
1.1k
Go runtimeの歩き方/how to follow go runtime function
convto
1
920
入出金ドメインの苦労話と解決へのアプローチ/funds in/out difficulties and solutions
convto
2
1.3k
rsa_understanding_memo
convto
0
570
Featured
See All Featured
Product Roadmaps are Hard
iamctodd
PRO
49
11k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.5k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
32
2.7k
Building Better People: How to give real-time feedback that sticks.
wjessup
365
19k
Gamification - CAS2011
davidbonilla
80
5.1k
The Pragmatic Product Professional
lauravandoore
32
6.3k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.7k
Side Projects
sachag
452
42k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
Transcript
Go 関連の個人的おもしろCVE 5選 2024/06/18 Go Bash !
自己紹介 @convto 株式会社LayerX所属 レイヤ低めの技術などに興味がありま す (読みはこんぶとです)
はなすこと - Go の脆弱性情報を調べたいとき - おもしろ CVE 紹介 - 脆弱性をみつけたら
- まとめ
Go の脆弱性情報を調べたいとき
脆弱性を調べてなにがうれしいの? - どういう問題がおきてどう修正されているか知れる - ふだんの業務に生きてくる知見もあったりする - どういう傾向の脆弱性が報告されているか雰囲気を掴める - ネットワークとか外界との接点はやっぱ多いな〜とか -
そのへんは自分でも気をつけよ!となったり
その1 メーリスに入る - https://groups.google.com/g/golang-announce にリリース情報が 流れてくる - `[security]` prefix がついてるのが脆弱性の対応リリース
その1 メーリスに入る 最近のだけでもわりとある
その2 レポートページを見る - https://pkg.go.dev/vuln/list に Vulnerability Reports がある - Go
本体, std packages だけじゃなくてよく使われる OSS についての脆 弱性も整理されてる
その2 レポートページを見る
go vuln 管理の全体像はこんなかんじ https://go.dev/doc/security/vuln/
go vuln 管理の全体像はこんなかんじ https://go.dev/doc/security/vuln/ じつは API もある
その3 API たたく - Go Security Team が管理してる vuln database
は API もある - かんたんなドキュメントとかは https://go.dev/doc/security/vuln/database
その3 API たたく
その3 API たたく
おもしろ CVE 紹介
CVE-2021-3538 - https://github.com/satori/go.uuid に見つかった脆弱性 - 当時よく使われていたライブラリなので対応した方も多いのでは - だいぶ昔のものなんですが好きなので紹介します
CVE-2021-3538 どういうやつ
CVE-2021-3538 どういうやつ
CVE-2021-3538 どういうやつ version, variant のぞくと 先頭2byteしかrand読めてない
CVE-2021-3538 修正CL
CVE-2021-3538 修正CL ReadFull つけてまわっただけ Read は大体指定byteを読み切るこ とを保証してない
CVE-2021-3538 余談 - じつはいまは crypto/rand#Read 側にいい感じの対応が入ってるの で、unix 環境ならそれを使ってる限りは発生しない - Go
1.19 くらいのときぜんぜん違う文脈のパッチ入れるついでに追加して た https://go-review.googlesource.com/c/go/+/390038
CVE-2021-3538 余談
CVE-2021-3538 感想 - 報告された issue の例にめちゃめちゃ圧があった - uuid v4 が衝突したら大抵
rand source から引っ張るところがバグって るので気をつけよう - 後追いでしれっといい感じの対応が入っていていい話だった
CVE-2024-24786 - google.golang.org/protobuf/encoding/protojson に見つかった脆 弱性 - 特定ケースの invalid JSON を
Unmarshal しようとすると無限ループ になる - `google.protobuf.Any` を含むメッセージ、または `UnmarshalOptions.DiscardUnknown` が指定されていると発生
CVE-2024-24786 どういうやつ test の CL がわかりやすい
CVE-2024-24786 修正CL
CVE-2024-24786 感想 - encoding 系はこういう CPU リソースを想定外に使っちゃうのがちょい ちょいある - 修正はかなり簡単ぽかった
こういう問題は修正より発見が難しそう
CVE-2022-32189 - math/big の脆弱性 - 前提として標準パッケージの独自の型などは GobEncoder/GobDecoder interface を実装していることがおおい -
bit#Float, big#Rat で特定の入力を GobDecode に食わせると panic がおきる挙動になっていたbit#Float, big#Rat で特定ケースで panic になる入力を作れた
CVE-2022-32189 どういうやつ CL の test みるとわかりやすい 想定より短いバイト列がきたとき panic が返ってきちゃってた
CVE-2022-32189 どういうやつ - 正常に GobEncode されたやつは少なくとも持っている値がいくつかある - version, sign などの情報とか
- big#Float は 6byte, big#Rat は 5byte 情報が少なくとも必要 - GobDecode の実装で, len check せずにそれらの情報がある前提で アクセスしていた
CVE-2022-32189 修正CL (big#Rat)
CVE-2022-32189 感想 - math/big は結構好きで, 過去の問題とか眺めてたら発見した - 正常に encode されてない期待しない入力を食べたときも
error をちゃ んと返す必要があるのは気をつけよう - 悪意のある外部入力で panic を狙えるのは可用性に影響がでる可 能性がある - ぼくらが書くソフトウェアでも同じ注意が必要
CVE-2024-24788 - net package の脆弱性 - DNS response が不正な形式のとき無限ループに陥る可能性がある -
ぼくは DNS client の具体的な実装に詳しいわけではないが、CLをみる とアカンねと言うのが一発でわかり面白かったので紹介
CVE-2024-24788 修正CL
CVE-2024-24788 感想 - エラーハンドリングもれだしめっちゃ悪いことはしてないのにCVEついてて なるほどとなった - コンピューティングリソースを過度に消費する可能性があり可用性に 影響あたえうる - こういうコード全然書いちゃうことあるので気をつけましょう
CVE-2020-26160 - だいぶ昔のやつ - https://github.com/dgrijalva/jwt-go の脆弱性 - aud に配列がくることは jwt
の仕様で許可されている - しかし実際 aud を配列で渡されると中身を取り出せず, また自身が含ま れるかの検証もスキップされてしまっていた
CVE-2020-26160 修正CL (抜粋)
CVE-2020-26160 修正CL (抜粋)
CVE-2020-26160 感想 - 仕様として valid な一部の形式を食ったときの挙動が壊れてた - unset を許容するかどうかを制御できる, けど渡されときはちゃんと見る,
みたいなデザインなのでそもそもちょっと難しい - validation logic とかは柔軟になりがちなので気をつけよう
脆弱性をみつけたら
どういう挙動が脆弱性ありと評価されるの? - ざっくり機密性、完全性、可用性に影響を与えるもの - よくある具体例 - 任意の入力で panic させられる -
必要以上にコンピューティングリソースを消費させられる - 見せちゃいけないものが見られちゃう - 期待する乱数が取れない
Go には脆弱性報告窓口があるよ - Go 標準/準標準パッケージなどについては security\@golang.org に 報告する - その他のソフトウェアの場合メンテナが指定している窓口に報告!
まとめ
まとめ - Go は関連する脆弱性の情報がよくまとめられている - いくつか脆弱性の具体例を紹介しました - 専門的な知識がなくても発見できそうなものもある! - 脆弱性を発見したら適切な窓口に報告しよう!
まとめ - Go は関連する脆弱性の情報がよくまとめられている - いくつか脆弱性の具体例を紹介しました - 専門的な知識がなくても発見できそうなものもある! - 脆弱性を発見したら適切な窓口に報告しよう!
- この発表きっかけの CVE 発見者が出現したらご飯を奢ります
宣伝
layerx.go #1 やります! https://layerx.connpass.com/event/319314/
layerx.go #1 やります! https://layerx.connpass.com/event/319314/
超おまけ
Go Conference 2024 のアンケートだそう!
Go Conference 2024 のアンケートだそう!
ご清聴ありがとうございました