Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
Go 関連の個人的おもしろCVE 5選 2024/06/18 Go Bash !
Slide 2
Slide 2 text
自己紹介 @convto 株式会社LayerX所属 レイヤ低めの技術などに興味がありま す (読みはこんぶとです)
Slide 3
Slide 3 text
はなすこと - Go の脆弱性情報を調べたいとき - おもしろ CVE 紹介 - 脆弱性をみつけたら - まとめ
Slide 4
Slide 4 text
Go の脆弱性情報を調べたいとき
Slide 5
Slide 5 text
脆弱性を調べてなにがうれしいの? - どういう問題がおきてどう修正されているか知れる - ふだんの業務に生きてくる知見もあったりする - どういう傾向の脆弱性が報告されているか雰囲気を掴める - ネットワークとか外界との接点はやっぱ多いな〜とか - そのへんは自分でも気をつけよ!となったり
Slide 6
Slide 6 text
その1 メーリスに入る - https://groups.google.com/g/golang-announce にリリース情報が 流れてくる - `[security]` prefix がついてるのが脆弱性の対応リリース
Slide 7
Slide 7 text
その1 メーリスに入る 最近のだけでもわりとある
Slide 8
Slide 8 text
その2 レポートページを見る - https://pkg.go.dev/vuln/list に Vulnerability Reports がある - Go 本体, std packages だけじゃなくてよく使われる OSS についての脆 弱性も整理されてる
Slide 9
Slide 9 text
その2 レポートページを見る
Slide 10
Slide 10 text
go vuln 管理の全体像はこんなかんじ https://go.dev/doc/security/vuln/
Slide 11
Slide 11 text
go vuln 管理の全体像はこんなかんじ https://go.dev/doc/security/vuln/ じつは API もある
Slide 12
Slide 12 text
その3 API たたく - Go Security Team が管理してる vuln database は API もある - かんたんなドキュメントとかは https://go.dev/doc/security/vuln/database
Slide 13
Slide 13 text
その3 API たたく
Slide 14
Slide 14 text
その3 API たたく
Slide 15
Slide 15 text
おもしろ CVE 紹介
Slide 16
Slide 16 text
CVE-2021-3538 - https://github.com/satori/go.uuid に見つかった脆弱性 - 当時よく使われていたライブラリなので対応した方も多いのでは - だいぶ昔のものなんですが好きなので紹介します
Slide 17
Slide 17 text
CVE-2021-3538 どういうやつ
Slide 18
Slide 18 text
CVE-2021-3538 どういうやつ
Slide 19
Slide 19 text
CVE-2021-3538 どういうやつ version, variant のぞくと 先頭2byteしかrand読めてない
Slide 20
Slide 20 text
CVE-2021-3538 修正CL
Slide 21
Slide 21 text
CVE-2021-3538 修正CL ReadFull つけてまわっただけ Read は大体指定byteを読み切るこ とを保証してない
Slide 22
Slide 22 text
CVE-2021-3538 余談 - じつはいまは crypto/rand#Read 側にいい感じの対応が入ってるの で、unix 環境ならそれを使ってる限りは発生しない - Go 1.19 くらいのときぜんぜん違う文脈のパッチ入れるついでに追加して た https://go-review.googlesource.com/c/go/+/390038
Slide 23
Slide 23 text
CVE-2021-3538 余談
Slide 24
Slide 24 text
CVE-2021-3538 感想 - 報告された issue の例にめちゃめちゃ圧があった - uuid v4 が衝突したら大抵 rand source から引っ張るところがバグって るので気をつけよう - 後追いでしれっといい感じの対応が入っていていい話だった
Slide 25
Slide 25 text
CVE-2024-24786 - google.golang.org/protobuf/encoding/protojson に見つかった脆 弱性 - 特定ケースの invalid JSON を Unmarshal しようとすると無限ループ になる - `google.protobuf.Any` を含むメッセージ、または `UnmarshalOptions.DiscardUnknown` が指定されていると発生
Slide 26
Slide 26 text
CVE-2024-24786 どういうやつ test の CL がわかりやすい
Slide 27
Slide 27 text
CVE-2024-24786 修正CL
Slide 28
Slide 28 text
CVE-2024-24786 感想 - encoding 系はこういう CPU リソースを想定外に使っちゃうのがちょい ちょいある - 修正はかなり簡単ぽかった こういう問題は修正より発見が難しそう
Slide 29
Slide 29 text
CVE-2022-32189 - math/big の脆弱性 - 前提として標準パッケージの独自の型などは GobEncoder/GobDecoder interface を実装していることがおおい - bit#Float, big#Rat で特定の入力を GobDecode に食わせると panic がおきる挙動になっていたbit#Float, big#Rat で特定ケースで panic になる入力を作れた
Slide 30
Slide 30 text
CVE-2022-32189 どういうやつ CL の test みるとわかりやすい 想定より短いバイト列がきたとき panic が返ってきちゃってた
Slide 31
Slide 31 text
CVE-2022-32189 どういうやつ - 正常に GobEncode されたやつは少なくとも持っている値がいくつかある - version, sign などの情報とか - big#Float は 6byte, big#Rat は 5byte 情報が少なくとも必要 - GobDecode の実装で, len check せずにそれらの情報がある前提で アクセスしていた
Slide 32
Slide 32 text
CVE-2022-32189 修正CL (big#Rat)
Slide 33
Slide 33 text
CVE-2022-32189 感想 - math/big は結構好きで, 過去の問題とか眺めてたら発見した - 正常に encode されてない期待しない入力を食べたときも error をちゃ んと返す必要があるのは気をつけよう - 悪意のある外部入力で panic を狙えるのは可用性に影響がでる可 能性がある - ぼくらが書くソフトウェアでも同じ注意が必要
Slide 34
Slide 34 text
CVE-2024-24788 - net package の脆弱性 - DNS response が不正な形式のとき無限ループに陥る可能性がある - ぼくは DNS client の具体的な実装に詳しいわけではないが、CLをみる とアカンねと言うのが一発でわかり面白かったので紹介
Slide 35
Slide 35 text
CVE-2024-24788 修正CL
Slide 36
Slide 36 text
CVE-2024-24788 感想 - エラーハンドリングもれだしめっちゃ悪いことはしてないのにCVEついてて なるほどとなった - コンピューティングリソースを過度に消費する可能性があり可用性に 影響あたえうる - こういうコード全然書いちゃうことあるので気をつけましょう
Slide 37
Slide 37 text
CVE-2020-26160 - だいぶ昔のやつ - https://github.com/dgrijalva/jwt-go の脆弱性 - aud に配列がくることは jwt の仕様で許可されている - しかし実際 aud を配列で渡されると中身を取り出せず, また自身が含ま れるかの検証もスキップされてしまっていた
Slide 38
Slide 38 text
CVE-2020-26160 修正CL (抜粋)
Slide 39
Slide 39 text
CVE-2020-26160 修正CL (抜粋)
Slide 40
Slide 40 text
CVE-2020-26160 感想 - 仕様として valid な一部の形式を食ったときの挙動が壊れてた - unset を許容するかどうかを制御できる, けど渡されときはちゃんと見る, みたいなデザインなのでそもそもちょっと難しい - validation logic とかは柔軟になりがちなので気をつけよう
Slide 41
Slide 41 text
脆弱性をみつけたら
Slide 42
Slide 42 text
どういう挙動が脆弱性ありと評価されるの? - ざっくり機密性、完全性、可用性に影響を与えるもの - よくある具体例 - 任意の入力で panic させられる - 必要以上にコンピューティングリソースを消費させられる - 見せちゃいけないものが見られちゃう - 期待する乱数が取れない
Slide 43
Slide 43 text
Go には脆弱性報告窓口があるよ - Go 標準/準標準パッケージなどについては security\@golang.org に 報告する - その他のソフトウェアの場合メンテナが指定している窓口に報告!
Slide 44
Slide 44 text
まとめ
Slide 45
Slide 45 text
まとめ - Go は関連する脆弱性の情報がよくまとめられている - いくつか脆弱性の具体例を紹介しました - 専門的な知識がなくても発見できそうなものもある! - 脆弱性を発見したら適切な窓口に報告しよう!
Slide 46
Slide 46 text
まとめ - Go は関連する脆弱性の情報がよくまとめられている - いくつか脆弱性の具体例を紹介しました - 専門的な知識がなくても発見できそうなものもある! - 脆弱性を発見したら適切な窓口に報告しよう! - この発表きっかけの CVE 発見者が出現したらご飯を奢ります
Slide 47
Slide 47 text
宣伝
Slide 48
Slide 48 text
layerx.go #1 やります! https://layerx.connpass.com/event/319314/
Slide 49
Slide 49 text
layerx.go #1 やります! https://layerx.connpass.com/event/319314/
Slide 50
Slide 50 text
超おまけ
Slide 51
Slide 51 text
Go Conference 2024 のアンケートだそう!
Slide 52
Slide 52 text
Go Conference 2024 のアンケートだそう!
Slide 53
Slide 53 text
ご清聴ありがとうございました