GoAhead:失効済みクライアント証明書を受け入れるmTLS(CVE-2026-115881)
GoAheadはCRLを読み込むだけで検証しないため、失効済みクライアント証明書がmTLSを通過します。6.1.1で修正済みで、8月2日にデバイスビルダーへ提供されました。
要点
GoAheadは、メーカーが数億台の機器で動作すると述べる組込みWebサーバーで、適用するよう設定された証明書失効リストを黙って無視します。
- GoAheadのOpenSSL TLSバックエンドは、設定されたCRLを証明書ストアへ読み込みますが、OpenSSLがリストを参照する前に必要とする
X509_V_FLAG_CRL_CHECKを決して設定しません。失効したクライアント証明書は、有効であるかのようにmTLSハンドシェイクを完了します。CVE-2026-115881、CVSS v3.1 9.1(CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N、EmbedThis採点)、GoAhead 3.4.5~6.1.0が影響対象です。 - 同じ分析では、さらに2つのTLSバグも報告されています。LibreSSLレガシービルドでは、発行者検証が無効のとき10証明書の上限を超えるチェーンが受け入れられます(CVE-2026-115884、7.4)。
- Mbed TLSビルドでは、1バイトのDiffie-Hellmanパラメータにより、受動的な観察者がTLS 1.2 DHE_RSAセッションを復号できます(5.9、CVEなし)。
- 6.1.1リリースは、HTTP Basicとフォーム認証がBlowfish形式ハッシュのユーザーに任意のパスワードを受け入れるログインバイパス(CVE-2026-115888、9.8、6.1.0のみ)も修正します。
- 2026年8月2日にデバイスビルダーへ提供されたGoAhead 6.1.1が、これらをすべて修正します。その11件のアドバイザリは10月12日に公開されました。10月27日時点で攻撃の報告はなく、いずれかのメーカーが修正を提供済みかは不明です。
- 機器の所有者が修正を得られるのは、メーカーがファームウェア更新を提供したときだけです。それまでの間:GoAhead機器を特定し、影響を受けるビルドでは管理アクセスを信頼できるネットワークに制限してください。
影響を受けますか?
露出は、TLSバックエンドと機器にコンパイルされた設定次第であり、所有者は外部から読み取れません。CRLの欠陥の影響を受けるのは、次がすべて成り立つ場合です:
- ファームウェアがGoAhead 3.4.5~6.1.0を組み込み、OpenSSLバックエンド(
ME_COM_OPENSSL=1、プロジェクトのデフォルトかつ推奨バックエンド)でビルドされていること。Mbed TLSビルドは影響を受けません。失効確認は別のコードパスで行われます。 - mTLSが有効:
ME_GOAHEAD_SSL_VERIFY_PEER=1、信頼されたCAバンドル(ME_GOAHEAD_SSL_AUTHORITY)、発行者検証(ME_GOAHEAD_SSL_VERIFY_ISSUER=1)、そして失効リストが設定済み(ME_GOAHEAD_SSL_REVOKE)。 - 運用者が失効した機器を拒否するためにCRLに依存していること。それがCRLを設定する理由のすべてです。
| TLSビルドと欠陥 | 影響を受けるバージョン | 必要な設定 | 修正 |
|---|---|---|---|
| OpenSSLバックエンド、CRL未適用(CVE-2026-115881、9.1) | 3.4.5~6.1.0 | 発行者検証とCRLを設定したmTLS | 6.1.1。アドバイザリに暫定措置なし |
| LibreSSLレガシービルド、チェーン深度バイパス(CVE-2026-115884、7.4) | 6.1.0以前、LibreSSL 3.2.xまたは3.3.2-3.3.6上 | VERIFY_PEER=1、VERIFY_ISSUER=0 | 6.1.1。または信頼されたCAバンドルでVERIFY_ISSUER=1を有効化、もしくはOpenSSLまたはLibreSSL 4.xを使用 |
| Mbed TLS、DHパラメータの切り詰め(5.9、CVEなし) | 4.0.2~6.1.0 | 壊れたパラメータを受け入れるクライアントとTLS 1.2 DHE_RSAが合意されること | 6.1.1。または有限体DHEスイートを無効化、もしくはOpenSSLバックエンドを使用 |
| BF1パスワードチェックのバイパス(CVE-2026-115888、9.8) | 6.1.0のみ | HTTP Basicまたはフォーム認証、パスワードがBF1形式で保存された既知のユーザー名 | 6.1.1 |
保有環境のGoAheadサーバーを見つけるには、FoxIOがGoAhead 6.1.x向けに公開したJA4Scan-TLSフィンガープリントを使います。
| TLSバックエンド | ライブラリのバージョン | JA4Scan-TLSフィンガープリント |
|---|---|---|
| OpenSSL | 3.6.2 | 03100h0s00sn_1fe27f6025fb_d06dc4648d2f_sr00ss537461 |
| LibreSSL | 3.3.6 | 03100h0s00s0_9d52559f55bc_c64486648d2f_sr00sc24603c |
| LibreSSL | 4.3.1 | 03100h0r00s0_9d52559f55bc_c64486206461_sr00scc98ba1 |
一致すれば、それらのライブラリバージョン上のGoAhead 6.1.xを示します。一致しなくても、それより古いGoAheadのバージョンや他のビルドは除外できません。
Mbed TLSのDH欠陥については、TLSセッションログ(JA4S)にDHE_RSAスイートが含まれるか確認します。FoxIOの例はt120100_009f_1ca028f07214です。次のコマンドは、その分析が挙げる25個のDHE_RSAスイートコードに、大文字・小文字を問わず一致します:
# Find DHE_RSA handshakes against a host in JA4S session records
grep -iE "_(001[456]|003[39]|0045|006[7b]|0088|009[aef]|00be|00c4|c04[45]|c05[23]|c07[cd]|c09[ef]|c0a[23]|ccaa)_" ja4s.log
自社で保有またはビルドするファームウェアについては、権威ある確認はファームウェアのビルド設定とその中のGoAheadバージョンであり、外部からの見た目ではありません。
どう修復しますか?
GoAhead 6.1.1へ更新してください。リリースノートによれば、11件のアドバイザリをすべて修正し、CriticalまたはHighの所見を残しません。デバイスメーカーはそれに対してファームウェアを再ビルドして更新を提供します。所有者が受け取れるのはそのファームウェア更新経由のみです。更新後、EmbedThisはアクティブなセッションの終了またはサーバーの再起動と、BF1ユーザーのパスワードの変更を推奨しています。
まだ再ビルドできない場合、各欠陥には部分的な暫定措置があります:
- LibreSSLの深度欠陥については、信頼されたCAバンドルで発行者検証(
ME_GOAHEAD_SSL_VERIFY_ISSUER=1)を有効化するか、OpenSSLまたはLibreSSL 4.xでビルドします。 - Mbed TLSのDH欠陥については、有限体DHEスイートを無効化してECDHEとTLS 1.3のみを合意するか、OpenSSLバックエンドへ切り替えます。
- CRL欠陥についてアドバイザリに暫定措置はありません:再ビルドまで、以前信頼され今失効した機器資格情報はすべてまだ有効とみなし、管理インターフェイスに到達できる送信元を制限することでネットワーク層で補ってください。
- BF1ログインバイパスについて、攻撃者には有効なユーザー名だけで済みます。可能な場所ではBF1形式のパスワードを別の形式へ変更し、それらのユーザーの認証ログを監視してください。
根本原因は何ですか?
3つのTLSバグはすべて統合の欠陥です。GoAheadは、設定済みに見えるが強制されない形でTLSライブラリのAPIを呼び出しています。
CRL欠陥(CVE-2026-115881)。 src/openssl.cのsslOpen()で、GoAheadは設定された失効リストをOpenSSLの証明書ストアへ読み込みます:
if (ME_GOAHEAD_SSL_REVOKE && *ME_GOAHEAD_SSL_REVOKE) {
store = SSL_CTX_get_cert_store(sslctx);
if (!X509_STORE_load_locations(store, ME_GOAHEAD_SSL_REVOKE, 0)) {
error("Cannot load certificate revoke list: %s", ME_GOAHEAD_SSL_REVOKE);
sslClose();
return -1;
}
}
X509_STORE_load_locations()は成功し、起動時にエラーは出ないため、CRLを設定した運用者は失効確認が適用されていると信じる理由がすべて揃います。しかしOpenSSLは、check_revocation()がリストを参照する前にX509_V_FLAG_CRL_CHECKフラグを要求し、GoAheadはそれを決して設定しません。フラグなしでは、OpenSSL自身の確認はリストを見る前に成功を返します:
// OpenSSL 3.6.2 crypto/x509/x509_vfy.c, check_revocation()
int crl_check_enabled = (ctx->param->flags & X509_V_FLAG_CRL_CHECK) != 0;
...
if (!crl_check_enabled && !ocsp_check_enabled)
return 1;
FoxIOはGoAhead 6.1.0とOpenSSL 3.6.2でこの結果を実証しました。CA署名の失効済みクライアント証明書が発行者検証を有効にしたままmTLSハンドシェイクを完了し、検証コールバックはチェーン全体でエラー0を報告しました。
Mbed TLSのDH欠陥。 src/mbedtls.cで、GoAheadはRFC 3526の2048ビットDiffie-Hellmanグループを設定しますが、生成子の長さを法の長さとして渡します:
cuchar dhm_p[] = MBEDTLS_DHM_RFC3526_MODP_2048_P_BIN; // 256 bytes
cuchar dhm_g[] = MBEDTLS_DHM_RFC3526_MODP_2048_G_BIN; // 1 byte: 0x02
...
if ((rc = mbedtls_ssl_conf_dh_param_bin(conf, dhm_p, sizeof(dhm_g), dhm_g, sizeof(dhm_g))) < 0) {
sizeof(dhm_g)は1バイトのため、Mbed TLSは法の最初のバイト0xFFだけを読みます。ServerKeyExchangeは値255の1バイトDHパラメータを通知します。共有秘密は8通りの値しかなく、観察者は記録したトラフィックに対してそれぞれを試せます。FoxIOは5回の試行で共有秘密を再現し、セッションをオフラインで復号しました。このタイプミスは2018年、バイナリパラメータAPIへの移行時に混入し、2024年4月のTLSリファクタリングを生き延びました。テストしたOpenSSLクライアントはDH_check_params_ex: modulus too smallでパラメータを拒否しました。最小サイズ確認のない寛容なクライアントはそれを受け入れます。
LibreSSLのチェーン深度欠陥(CVE-2026-115884)。 GoAheadはSSL_CTX_set_verify_depth()で10証明書の上限を設定しますが、その検証コールバックは、検証器がまだ別のエラーを報告していない場合にのみ超過エラーを割り当てます:
// src/openssl.c
if (ok && VERIFY_DEPTH < depth) {
if (error == 0) {
error = X509_V_ERR_CERT_CHAIN_TOO_LONG;
}
}
コールバックはエラー22(CERT_CHAIN_TOO_LONG)を拒否しますが、発行者検証が無効のときはエラー20(UNABLE_TO_GET_ISSUER_CERT_LOCALLY)を許容します。LibreSSL 3.2.xおよび3.3.2-3.3.6のレガシービルドは、深度超過のチェーンの構築を停止しても深度エラーを記録せず、許容されるエラー20として報告します。LibreSSL 3.3.6のGoAhead 6.1.0では、攻撃者が制御する自己署名CAに根ざした17証明書のチェーンがハンドシェイクを完了しHTTP 200を得ました。LibreSSL 4.3.1に対する同じソースはエラー22を報告して拒否されました。
BF1ログインバイパス(CVE-2026-115888)、同じリリースで修正された関連欠陥。 websVerifyPasswordFromFile()のBF1ブランチはbcrypt結果を正しく計算してローカル変数に格納した後、共有される定時間比較器が格納ハッシュをそれ自身と比較するよう、送信された資格情報を格納ハッシュで上書きします。より新しいBlowfish(BF1:)形式でパスワードが保存されたユーザーには、任意のパスワードが受け入れられます。フォームベースのログインは推奨スキームであり、GoAheadの内蔵管理ページのデフォルトです。
どのように悪用されますか?
CRL欠陥に新しいツールは不要です。攻撃者は、有効に発行され今は失効した証明書、たとえば盗まれた、退役した、または侵害された機器の資格情報を提示し、その身分でmTLSハンドシェイクを完了します。サーバー自身の検証が成功を報告するため、攻撃の何も見えません。
Mbed TLS欠陥は受動的です。クライアントが1バイトのパラメータを受け入れたTLS 1.2 DHE_RSAセッションを記録した観察者は、8通りの共有秘密の値を記録したハンドシェイクとアプリケーションレコードに対して試し、復号できるものを特定してセッションを読みます。キャプチャ後、サーバーとの対話は不要です。
LibreSSL欠陥には細工された証明書チェーンが必要です。10を超える証明書、どこに根ざしてもよく、クライアント証明書が要求され発行者検証が無効なビルドに提示します。チェーンは認証済みクライアントとして受け入れられます。
BF1バイパスには、パスワードがBF1形式の既知または推測されたユーザー名と、任意のパスワード文字列だけで済みます。Basic認証のURLまたはフォームログインに対して使います。
攻撃の連鎖はどう進みますか?
CRL欠陥、失効した機器資格情報から許可されたアクセスまでの4ステップ:
クライアント証明書を提示"] --> B["GoAheadは起動時にCRLを
OpenSSLストアへ読み込む"] B --> C["X509_V_FLAG_CRL_CHECKは
決して設定されない"] C --> D["check_revocation()はリストを読まずに
成功を返す"] D --> E["mTLSハンドシェイクが失効した
身分で完了する"] style C fill:#f8d7da
攻撃者は何ができますか?
CRL欠陥は、失効した機器資格情報が持っていた権利へのアクセスを復活させます。その証明書が保護していた管理ページ、API、機器制御です。機器の盗難や鍵の侵害の後に意図的に失効させるデプロイメントにとって最も重要で、サーバー側では成功した検証として記録されるため、この隔たりは不可視です。
Mbed TLS欠陥は記録されたセッションを、その中で送信された資格情報やコマンドを含めて読めるようにしますが、クライアントが壊れたパラメータを受け入れた場合に限ります。標準的なクライアントは1バイトの法を拒否し、そのようなセッションは決して完了しません。最小サイズ確認のないカスタムおよび組込みクライアントが露出する母集団です。ECDHEとTLS 1.3セッションは影響を受けません。
LibreSSL欠陥は、信頼された鍵なしで攻撃者をクライアントとして認証させますが、発行者検証が無効のリストされたレガシーLibreSSLビルドのみです。その設定は自己署名クライアントを既に受け入れています。信頼されたクライアントCAを要求するデプロイメントはこれを拒否します。
BF1バイパスは、標的ユーザーの権限で攻撃者を機器の管理インターフェイスにログインさせます。GoAhead 6.1.0(2025年11月3日リリース)のみが影響を受け、パスワードがBF1形式へ移行されたユーザーのみです。
なぜ修正が有効なのですか?
CRL欠陥とDH欠陥の修正は一行の修正で、6.1.1の各修正は欠陥を狭めるのではなく完全に閉じます。CRL欠陥では、リスト読み込み直後にストアへフラグが設定されます:
if (!X509_STORE_load_locations(store, ME_GOAHEAD_SSL_REVOKE, 0)) {
error("Cannot load certificate revoke list: %s", ME_GOAHEAD_SSL_REVOKE);
sslClose();
return -1;
}
+ /*
+ Enable CRL checking on the leaf certificate. Without this flag OpenSSL loads the CRL but
+ never consults it, silently accepting revoked client certificates.
+ */
+ X509_STORE_set_flags(store, X509_V_FLAG_CRL_CHECK);
DH欠陥では、法の長さが法自身の長さになります:
- if ((rc = mbedtls_ssl_conf_dh_param_bin(conf, dhm_p, sizeof(dhm_g), dhm_g, sizeof(dhm_g))) < 0) {
+ if ((rc = mbedtls_ssl_conf_dh_param_bin(conf, dhm_p, sizeof(dhm_p), dhm_g, sizeof(dhm_g))) < 0) {
完全な2048ビットの法が送信されると、共有秘密は8候補の一つではなくなり、記録されたセッションは総当たりできません。LibreSSL深度欠陥については、6.1.1はエラーコードを確認する前に深度上限を無条件に適用するため、深すぎるチェーンは検証器がどのエラーを報告しても拒否されます。FoxIOは、LibreSSL 4.3.1に対する同じソースが既にエラー22を報告し17証明書のチェーンを拒否することを検証しました。
BF1バイパスについて、アドバイザリのパッチはwebsVerifyPasswordFromFile()を3つの独立したブランチに分け、それぞれが結果を一度だけ設定するようにし、送信されたパスワードを格納ハッシュで上書きしなくなりました:
- BF1ユーザーでは、bcryptの結果が最終的な判定になります。
- Digest認証では、クライアントのダイジェストを格納ハッシュと比較します。
- 従来のMD5形式のユーザーでは、エンコードされたパスワードを定時間で比較します。
リリースノートは、11件のアドバイザリとさらなる31件の内部所見を解決した同じ社内監査による関連する強化も挙げています。BF1保存ハッシュとDigest認証の組み合わせは明示的に拒否されるようになり、セッション識別子は毎回のログインでローテーションされます。
侵害されたかどうかを確認するには?
攻撃の報告がないため、攻撃インジケータは公開されていません。代わりに結果を確認します:
- CRL欠陥について、デプロイ以降に各GoAheadサーバーへ認証したクライアント証明書を現在のCRLの内容と比較します。失効リストに載っていて失効日以降も認証し続けた証明書は、サーバー側またはアクセスログで、この欠陥が影響したことを意味します。
- Mbed TLS欠陥について、記録トラフィックから1バイトDHパラメータを持つTLS 1.2 DHE_RSAハンドシェイク(ServerKeyExchangeのバイト
00 01 ff)を探し、それらのセッションを復号可能とみなします。FoxIOのJA4Sスイートリストが検索を絞り込みます。 - BF1バイパスについて、6.1.0機器の認証ログで、予期しない送信元からのBF1形式ユーザーの成功したログインを確認し、それらの資格情報が盗まれたとみなします。
タイムライン
- 2018年:バイナリパラメータAPIへの移行中にMbed TLSのDH長さのタイプミスが混入(FoxIOのコード履歴による)。2024年4月のTLSリファクタリングを生き延びました。
- 2025-11-03:GoAhead 6.1.0がリリースされ、その新しいパスワード形式とともにBF1ログインバイパスが導入されます。
- 2026-08-02:11件のアドバイザリとさらなる31件の監査所見を閉じるセキュリティリリースGoAhead 6.1.1が、デバイスビルダーへ提供されます。
- 2026-10-12:EmbedThisが11件のアドバイザリを公開。CVEの割り当てが要求済みで、10月27日時点では公開CVE・NVDデータベースにまだありません。
- 2026-10-26:FoxIOが概念実証コードとJA4Scanフィンガープリント付きの3つのTLSバグ分析を公開。
- 2026-10-27:Alan CoopersmithがFoxIOの3つのTLSバグとそのアドバイザリをoss-securityで紹介。The Hacker Newsは既知の攻撃なしと報じ、EmbedThisの、悪用されている場合は早期公開するという方針と整合します。
- 2026-10-29:本記事。
よくある質問
機器がファームウェア更新を受け取っていません。今何ができますか?
他人のファームウェアは再ビルドできません。GoAhead機器を特定し、メーカーにそのビルドが影響を受けるか、6.1.1をいつ提供するかを確認してください。それまでの間、管理アクセスを信頼できるネットワークに制限し、壊れたTLS確認が唯一の障壁にならないようにします。Mbed TLS欠陥については、DHEスイートの無効化は自分のビルドでのみ可能です。
標準的なクライアントはDiffie-Hellman欠陥の影響を受けますか?
いいえ。FoxIOがテストしたOpenSSLクライアントは1バイトの法を拒否し、現在のGo、Java、主要ブラウザも同様のため、セッションは決して完了しません。最小サイズ確認のないカスタムおよび組込みクライアントが露出する母集団で、そのトラフィックを記録すれば後から復号できます。
機器がどのTLSバックエンドを使うかはどうわかりますか?
外部からはわかりません。バックエンドと検証設定はコンパイル時の選択です。FoxIOのJA4Scanフィンガープリントは、インターネットから到達可能なGoAheadサーバーのバックエンドを特定し、自社ファームウェアのビルド設定が権威ある回答です。
誰かが攻撃されましたか?
2026年10月27日時点で攻撃を報じた情報源はありません。EmbedThisの開示方針は、欠陥が悪用されているか他者に開示された場合にエンバーゴを終え早期公開するため、10月12日の調整公開は既知の攻撃がないことと整合します。攻撃がないことの証明ではなく、影響を受ける母集団も確立されていません。
6.1.1は他に気にすべき点を修正しますか?
はい。このリリースは合計11件のアドバイザリを閉じます。Windowsの.bat/.cmdターゲット経由のCGIコマンド注入(9.8、CVEまだなし)、CGI ISINDEX引数注入(CVE-2026-115880、8.1)、httpoxy風のHTTP_PROXY注入(CVE-2026-115882、8.1)、2つのHTTPリクエスト密輸ベクトル、DigestナンスのmasterSecret開示、セッション固定に加え、それぞれに回帰テストが付いた31件の内部発見の欠陥です。
OstorlabでGoAhead機器を見つける
Ostorlab Attack Surface Discoveryを使い、保有するインターネット公開ホストを棚卸ししてください。その中のGoAhead機器、その管理インターフェイス、TLSフィンガープリントが、メーカーのファームウェア更新を待つ前に把握できます。
参考資料
- FoxIO、Sébastien Féry「Choose Your Backend: Three TLS Bugs in GoAhead」2026年10月26日:ソース引用付きの3つの根本原因、検証コールバックのトレース、ServerKeyExchangeバイト、JA4Scanフィンガープリント、DHE_RSAスイートリスト:https://foxio.io/blog/choose-your-backend-three-tls-bugs-in-goahead (2026年10月29日確認)
- EmbedThis GoAheadセキュリティアドバイザリ、2026年10月12日公開:GHSA-5m75-xq69-c3c5(OpenSSL CRL未適用、CVE-2026-115881、9.1、GoAhead 3.4.5~6.1.0):https://github.com/embedthis/goahead/security/advisories/GHSA-5m75-xq69-c3c5 (2026年10月29日確認)
- GHSA-r392-vqwx-3r4g、LibreSSLレガシービルドでのmTLSクライアント証明書チェーン深度バイパス、CVE-2026-115884、7.4:https://github.com/embedthis/goahead/security/advisories/GHSA-r392-vqwx-3r4g (2026年10月29日確認)
- GHSA-fmvx-2xfx-2gq4、MbedTLS DHパラメータの切り詰め、5.9、CVE割り当てなし:https://github.com/embedthis/goahead/security/advisories/GHSA-fmvx-2xfx-2gq4 (2026年10月29日確認)
- GHSA-qj3g-66fp-rhhr、BF1ハッシュユーザーの認証バイパス、CVE-2026-115888、9.8、GoAhead 6.1.0のみ、6.1.1で修正:https://github.com/embedthis/goahead/security/advisories/GHSA-qj3g-66fp-rhhr (2026年10月29日確認)
- GoAhead v6.1.1リリースノート:2026年8月2日にデバイスビルダーへ提供、10月12日にアドバイザリ公開。11件のアドバイザリと31件の追加修正を解決し、CriticalまたはHighの所見なし:https://github.com/embedthis/goahead/releases/tag/v6.1.1 (2026年10月29日確認)
- 6.1.1のその他のアドバイザリ:Windows CGIコマンド注入(GHSA-584w-ph2x-4gfq、9.8)、ISINDEX CGI注入(GHSA-c7w3-26wq-mjc3、CVE-2026-115880、8.1)、HTTP_PROXY注入(GHSA-w3p3-6x8p-vrjr、CVE-2026-115882、8.1)を含む:https://github.com/embedthis/goahead/security/advisories (2026年10月29日確認)
- Alan Coopersmith、oss-security「Three TLS Bugs in GoAhead web server prior to 6.1.1」2026年10月27日(メッセージの日付は2026年10月27日 17:17 UTC-7、アーカイブは10月28日付):https://www.openwall.com/lists/oss-security/2026/10/28/1 (2026年10月29日確認)
- The Hacker News「GoAhead TLS Flaws Allow Revoked Client Certificates and Enable Session Decryption」2026年10月27日:既知の攻撃なしの状況、EmbedThisの開示方針、CVEデータベースの遅延、更新後の推奨事項:https://thehackernews.com/2026/10/goahead-tls-flaws-allow-revoked-client.html (2026年10月29日確認)