2026年5月20日、Ruby開発チームはセキュリティアップデートを含む最新バージョン「Ruby 4.0.5」を公開しました。
今回のアップデートでは、ネットワーク関連の標準ライブラリにおける重大な脆弱性(CVE-2026-46727)が修正されています。
特定の条件下でメモリが不正に参照される恐れがあるため、対象のバージョンを利用している開発者は速やかな対応が求められます。
脆弱性の概要(CVE-2026-46727)
本脆弱性は、Rubyのgetaddrinfoメソッドにおいて、タイムアウト処理に関連して発生するUse-after-free(解放後メモリ参照)の不具合です。
pthreadベースのタイムアウトハンドラ内に、レースコンディション(競合状態)が存在することが原因となっています。
具体的には、DNSレスポンスの遅延が発生し、指定されたタイムアウト時間に近いタイミングで処理が行われる場合に問題が生じます。
この状況において、Rubyプロセスがすでに解放されたメモリ領域をデリファレンス(参照)してしまい、プロセスがクラッシュする可能性があります。
リモートの攻撃者が意図的にDNSレスポンスを遅延させることで、この挙動を誘発させるリスクが指摘されています。
影響を受けるメソッド
この問題は、内部的にrb_getaddrinfoを使用している以下のメソッドに影響を与えます。
Addrinfo.getaddrinfoのtimeout:引数を利用している場合Socket.tcpのresolv_timeout:引数を利用している場合
影響を受けるバージョンと対策
今回の脆弱性は、Ruby 4.0シリーズが主な対象となっており、古い安定版シリーズには影響しません。
以下の表で、ご自身が利用している環境が対象かどうかを確認してください。
| ステータス | バージョン |
|---|---|
| 影響を受けるバージョン | Ruby 4.0.0 から 4.0.4 まで |
| 影響を受ける開発版 | Ruby 4.1.0-dev (修正前のmasterブランチ) |
| 影響を受けないバージョン | Ruby 3.4 以下のシリーズ |
最も推奨される対策は、Ruby 4.0.5 以降への速やかなアップグレードです。
脆弱性が修正された最新バージョンを導入することで、本リスクを根本から排除することが可能です。
回避策(ワークアラウンド)
直ちにアップグレードを実施できない環境では、プログラム側で一時的な回避策を講じることが可能です。
具体的には、脆弱性が存在するタイムアウトに関連する引数を使用しないようにコードを修正します。
# 修正前:タイムアウトを指定している場合
# この形式は脆弱性の影響を受ける可能性があります
Addrinfo.getaddrinfo("example.com", 80, timeout: 5)
# 修正後:タイムアウト引数を一時的に削除する
Addrinfo.getaddrinfo("example.com", 80)
同様に、Socket.tcpを利用している箇所でも、resolv_timeout:引数の使用を避けるようにしてください。
ただし、引数を削除するとネットワークの状況によっては名前解決の処理が長時間ブロックされる可能性がある点に注意が必要です。
あくまで恒久的な対策であるアップグレードが完了するまでの、暫定的な対応として検討してください。
まとめ
Ruby 4.0.5で修正されたCVE-2026-46727は、ネットワーク処理の安定性を脅かす重要な脆弱性です。
DNSレスポンスのタイミングに依存するレースコンディションは、予期せぬアプリケーションの停止を招く恐れがあります。
2026年5月20日に公開されたこのアップデートを早急に適用し、システムの安全性を確保することを強く推奨します。
開発環境および本番環境のバージョンを確認し、最新版へのメンテナンスを実施しましょう。
