7年間放置されたOpenBSDのセキュリティ欠陥、PAP認証の完全バイパスを可能に

OpenBSDのPPPスタックに重大な認証の欠陥が発見されました。攻撃者はこの脆弱性を悪用してパスワード認証プロトコル(PAP)の検証をバイパスし、ネットワークへの不正アクセスを得ることができます。

この脆弱性は2026年6月にパッチが適用されましたが、その原因は1999年にまで遡るレガシーコードにあり、現代のOSにおける最も長期にわたる認証バイパス問題の一つです。

OpenBSDのセキュリティ欠陥

この問題は、同期PPPおよびPPPoE接続を処理する`sppp(4)`サブシステム内の`sppp_pap_input()`関数に存在します。

PAP認証において、OpenBSDは`bcmp()`関数を使用してユーザーの認証情報を検証しています。しかし、この実装は受信パケットの長さフィールドに誤って依存しており、攻撃者はこれを操作することができます。

`bcmp()`が長さゼロで呼び出された場合、同一であることを示す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フレームから直接取得され、最小長の検証が行われていません。

両方の値をゼロに設定することで、`bcmp()`の比較は常に成功を返し、システムは認証情報を一切検証することなく認証を受け入れてしまいます。これにより、PAP認証が完全にバイパスされます。

さらに、この欠陥はカーネルメモリの安全性にも問題を引き起こします。認証情報バッファは`malloc(strlen(…) + 1)`を使用して動的に割り当てられるため、実際のバッファサイズより大きな長さを指定すると、`bcmp()`が割り当て済みメモリの範囲外を読み取るヒープオーバーリードが発生し、機密のカーネルメモリが漏洩するおそれがあります。

この脆弱性はPPPoEデータパス(`pppoe_data_input → pppoeintr → sppp_input → sppp_pap_input`)を通じてリモートから悪用可能です。攻撃者は有効な認証情報や事前アクセスを必要としません。

同一ブロードキャストドメイン上の悪意あるPPPoEサーバーが正規のアクセスコンセントレータを偽装し、PPPハンドシェイクを完了させて完全に機能するセッションを確立することができます。このシナリオでは、ネットワークトラフィックの傍受やリダイレクトが可能となり、事実上、中間者攻撃を実現します。

Argus Blogの報告によると、概念実証(PoC)の実証実験においてOpenBSD 7.6でのこの脆弱性の悪用に成功しています。不正なPPPoEサーバーが長さゼロの認証情報を含む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を使用している組織は直ちにこのアップデートを適用し、潜在的な悪用リスクを軽減するために信頼されていないネットワークセグメントへの露出を制限することをお勧めします。

CISOおよびセキュリティリーダーの皆様へ:次の侵害には顔がないかもしれません。ISC2のLIVEウェビナー 「Ghost in the Machine」にご参加ください。

翻訳元: https://gbhackers.com/7-year-old-openbsd-security-flaw/

ソース: gbhackers.com