27-Year-Old OpenBSD Security Flaw Exposes Systems to Full PAP Authentication Bypass
2026/06/17 gbhackers — OpenBSD の PPP スタックに、深刻な脆弱性 CVE-2026-55706 が発見され、2026年6月に修正された。この脆弱性を悪用する攻撃者は、Password Authentication Protocol (PAP) 検証をバイパスし、不正なネットワーク・アクセスを取得できる。この脆弱性の原因は、1999年にさかのぼるレガシーコードにあり、現代のオペレーティング・システムに至るまで長期間にわたり残存した。

OpenBSD のセキュリティ欠陥
この問題は、同期 PPP/PPPoE 接続を処理する sppp(4) サブシステム内の sppp_pap_input() 関数に存在する。OpenBSD は、PAP 認証時に bcmp() 関数を用いてユーザー認証情報を検証するが、この実装は受信パケットの長さフィールドに不適切に依存しているため、その悪用を攻撃者に許す可能性がある。そして bcmp() が長さ “0” で呼び出されると等価を示す “0” を返すため、空の認証情報を送信する攻撃者は、この挙動を悪用できる。
脆弱なコード部分は以下のとおりである。
if (name_len > AUTHMAXLEN || passwd_len > AUTHMAXLEN || bcmp(name, sp->hisauth.name, name_len) != 0 || bcmp(passwd, sp->hisauth.secret, passwd_len) != 0) { /* authentication failed */}
このコードでは、name_len および passwd_len が受信 PAP フレームから直接取得されているが、最小長の検証が行われていない。そのため両方の値を “0” に設定すると bcmp() の比較は等価扱いとなり、システムは認証情報を検証しない状態で認証を受け入れてしまう。その結果として、PAP 認証の完全なバイパスが成立する。
さらに、この欠陥はカーネルにおけるメモリ安全性の問題も引き起こす。認証情報バッファは、malloc(strlen(…) + 1) を用いて動的に割り当てられるため、実際のバッファより大きい長さを指定すると bcmp() が割り当て済みメモリの外側を読み取り、ヒープ・オーバーリード状態につながる。結果として、機密性の高いカーネル・メモリが露出する可能性がある。
この脆弱性の悪用に際して、攻撃者に有効な認証情報や事前アクセスは不要であり、PPPoE データパス pppoe_data_input → pppoeintr → sppp_input → sppp_pap_input を介してリモートからの攻撃が可能になる。
さらに、同一ブロードキャスト・ドメイン上の悪意の PPPoE サーバーは、正規のアクセス・コンセントレータを偽装し、PPP ハンドシェイクを完了して、完全に機能するセッションを確立できる。したがって、このシナリオにおいてネットワーク・トラフィックの傍受/リダイレクトが可能となり、事実上の中間者攻撃が成立する。
実験において成功が実証されたのは、OpenBSD 7.6 上での脆弱性の悪用である。Argus Blog によると、悪意の PPPoE サーバが、長さ “0” の認証情報を含む PAP リクエストを送信し、PAP_ACK を受信することに成功した。その後、接続は IPCP ネゴシエーションへと進み、最終的に認証なしで完全な IP 接続が確立された。
この脆弱性は、1999年7月に FreeBSD から取り込まれたコードに由来し、そのコード自体も 1990年代半ばの実装に起因する。OpenBSD の CHAP 認証ハンドラは、認証情報の長さを正しく検証していた一方で、PAP ハンドラでは、20年以上にわたり同様のチェックが実装されていなかった。
また、2009年の更新により、動的メモリ割り当てが導入されたことで、ヒープ・オーバーリードの問題はさらに悪化した。修正後の実装では、厳格な長さ検証が適用され、認証情報の長さが保存済みの値と完全に一致することを確認するようになった。
if (name_len != strlen(sp->hisauth.name) || passwd_len != strlen(sp->hisauth.secret) || bcmp(name, sp->hisauth.name, name_len) != 0 || bcmp(passwd, sp->hisauth.secret, passwd_len) != 0) { /* authentication failed */}
この修正により、認証バイパスおよびメモリ・オーバーリードの脆弱性が解消される。そのため、PPPoE 環境で OpenBSD を使用している組織に推奨されるのは、直ちにアップデートを適用し、信頼できないネットワーク・セグメントへの露出を制限して、潜在的な悪用リスクを軽減することである。
訳者後書:この問題は、1999 年から残存していたレガシーコードに起因しています。同期 PPP 接続を処理する関数において、受信したパケットの長さ検証が不十分だったことが主な原因です。認証情報を比較する関数の特性により、攻撃者が長さを “0” として空の認証情報を送信すると、検証を行わずに認証が通過してしまいました。さらに、実際のバッファより大きな長さを指定された場合に、メモリの外側を読み取ってしまうヒープ・オーバーリードのリスクも抱えていました。このように、外部からの入力を適切に検証しない状態で処理してしまう実装が、深刻な認証バイパスを招く結果となっています。ご利用のチームは、ご注意ください。
You must be logged in to post a comment.