V言語net.httpがHTTPS証明書を検証しない脆弱性、修正あり
V言語の標準ライブラリnet.httpは、既定でサーバー証明書を検証せず、通信経路上の第三者にHTTPS通信を盗み見られ、書き換えられるおそれがあります。Vで書いたツールを運用する組織は、修正を含むVで再ビルドし、validateの設定も確認してください。
急ぎ度: 早めに
CVSS v3は7.4、v4は9.1で、通信経路に入られることが条件のため即時の緊急対応とまでは言えませんが、修正コミットが公開されており、既定値の変更だけで直せます。
関係があるか
Vで書いたプログラムが、net.httpのhttp.get・http.post・http.fetchで外部のHTTPSサービスやAPIを呼んでいる組織が対象です。認証トークンやCookieを付けて通信するツールは、とくに影響が大きくなります。
| 製品 | 影響を受ける版 | 修正版 |
|---|---|---|
| V(vlang/v)の標準ライブラリnet.http | 0.5.2以前、および修正コミット前のmaster | コミット4077484以降のソース |
| net.httpを使うgRPCとvpm | net.httpと同じ(0.5.2以前、修正コミット前のmaster) | コミット4077484以降のソース |
確かめ方
- 1
v versionで、使っているVの版を確認します。0.5.2以前、または修正コミットより前のソースからビルドしたVなら対象です。 - 2ソースコードを
grep -rn "net.http" .などで検索し、net.httpを使う箇所を洗い出します。 - 3洗い出した箇所で
validate: trueが明示されているかを見ます。明示がなければ、証明書は検証されていません。 - 4Vの標準ライブラリはプログラムに組み込まれます。以前にビルドした実行ファイルも対象になるため、本番で動いているものを一覧にします。
何が起きたか
Vの標準ライブラリnet.httpは、HTTPSで通信していても、接続先サーバーの証明書を既定では検証していませんでした。通信経路の途中に入った第三者が本物のサーバーになりすましても、プログラムは気づかず接続を成立させます。
原因は、SSLConnectConfig.validateとFetchConfig.validateの既定値がfalseだったことです。mbedtlsとOpenSSLのどちらのバックエンドでも、証明書を確かめずにTLSのハンドシェイクを終えます。期限切れ、自己署名、ホスト名の不一致、信頼されないルート証明書のいずれでも、http.get・http.post・http.fetchの接続が通ります。
修正では、validateの既定値をtrueに変え、HTTP、CONNECT、SOCKS5、gRPC、vpmで不正な証明書を拒否するようにしました。身分証を見せてもらわずに荷物を渡していたところを、受け渡しのたびに確認する形に改めたことになります。
攻撃の流れ
-
1
経路に入る
攻撃者がV製プログラムと接続先サーバーの通信経路の途中に入ります。
-
2
偽の証明書を提示
期限切れや自己署名など、本来は拒否すべき証明書を提示します。
-
3
検証されず接続
validateがfalseのため、証明書を確かめないままTLS接続が成立します。
-
4
盗み見・改ざん
トークン、Cookie、メッセージ本文が読み取られたり、書き換えられたりします。
どう悪用されるか
悪用には、V製プログラムと接続先サーバーのあいだの通信経路に入れる位置が必要です。ログイン情報などの権限や、利用者の操作は要りません。経路に入る難しさがあるため、CVSS v3では攻撃の複雑さが高と評価されています。
悪用されると、トークン、Cookie、メッセージ本文が漏れたり、改ざんされたりするおそれがあります。可用性への影響は評価されておらず、サービス停止ではなく、通信内容の機密性と完全性が問題になる脆弱性です。
今すぐやること
-
1
Vの版とnet.httpの使用箇所を洗い出す
開発機、CI、本番で使っているVの版を確認し、net.httpやgRPC、vpmを使うプログラムを一覧にします。
v version -
2
修正コミット以降のVに更新して再ビルドする
コミット4077484以降のVに更新し、net.httpを使うプログラムをすべて再ビルドして入れ替えます。標準ライブラリは実行ファイルに組み込まれるため、Vを更新しただけでは、すでにビルドしたプログラムは直りません。
-
3
社内CAや自己署名の接続先を設定し直す
更新後は、社内の認証局や自己署名の証明書を使う接続先への通信が失敗することがあります。その場合は、http.fetchやRequestで
verify: '/path/ca.pem'を指定するか、環境変数SSL_CERT_FILEを設定します。検証を無効に戻して済ませないでください。 -
4
WSSとnet.sslの直接利用を確認する
今回の修正はnet.httpとその利用側(gRPCとvpm)が対象で、WSSとnet.sslを直接使う経路は修正の対象外で、従来のままです。該当するコードがあれば、
validate: trueを明示しているかを確認します。 -
5
漏れた可能性のある認証情報を見直す
公衆Wi-Fiなど信頼できない回線を経由して、V製のツールが外部サービスに接続していた場合は、そのツールで使ったトークンやAPIキーの再発行を検討します。
すぐ更新できないとき
すぐに更新できない場合は、net.httpを使う各所で validate: true を明示的に設定すると、証明書が検証されます。WSSやnet.sslを直接使う箇所も同様です。あわせて、信頼できないネットワークからV製ツールで外部へ接続する運用は、更新が済むまで避けてください。
背景
Vは、ネイティブの実行ファイルにコンパイルする静的型付けの言語です。net.httpは、http.getやhttp.postで外部のAPIやWebサービスを呼ぶときの標準の入口で、社内の小さなCLIツールや定期実行のバッチが、認証トークンを付けて外部と通信する場面で使われます。パッケージ管理のvpmとgRPCも、この仕組みの上でHTTPS通信をします。
通信を暗号化していても、相手が本物かどうかを証明書で確かめなければ、なりすましを防げません。今回の脆弱性は、暗号化の強さではなく、検証が既定で無効だったことが原因です。つまり、コードを書いた側が validate: true を意識して加えない限り、HTTPSを使っているつもりでも守られていない状態でした。
よくある質問
Q.公的な認証局の証明書だけを使っている場合、更新後に設定の変更は要りますか。
まだ分かっていないこと
- 修正を含むVのリリース版の番号は示されておらず、修正はコミット4077484で示されています。
- 実際の攻撃で悪用されたかどうかは、示されていません。
この記事は、取得元の公開情報をもとに、人が監修しながらAIを活用して執筆しています。執筆と監修は佐々木 航が担い、公開したあとも人が内容を確認しています。誤りに気づいたときは直し、記事の末尾に訂正の行を残します。対応を決める前に、下の原文と参照先も確認してください。
影響パッケージ
| パッケージ | 影響を受ける版 → 修正版 | |
|---|---|---|
| vlangv |
0.5.2 以前→ 記載なし |
記載なし |
この記録には修正版の版が載っていません。修正版の有無と版は、本文か参照URLのベンダーの勧告で確かめてください。
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
V programming language standard library net.http through version 0.5.2 prior to commit 4077484 contains a TLS certificate validation bypass vulnerability that allows on-path attackers to intercept HTTPS traffic by exploiting the default false value of SSLConnectConfig.validate and FetchConfig.validate, which completes TLS handshakes without verifying certificates in both the mbedtls and OpenSSL backends. Attackers can present an expired, self-signed, wrong-hostname, or untrusted-root certificate to successfully complete the handshake via http.get, http.post, or http.fetch, enabling interception or modification of HTTPS traffic unless validate: true is explicitly configured.
出典: CVE.org (CVE Program・cvelistV5) NVD GitHub Advisory
参照URL
- web github.com
- web github.com
- web vulncheck.com
- web nvd.nist.gov
- web github.com