メインコンテンツへスキップ
見出し画像

【lwIP】Bug #6|SNMP対応機器が1パケットで異常停止(HardFault)する原因|SNMPv3認証パラメータのスタックバッファオーバーフロー(CVE-2026-8836)

    このnoteでは、lwIPで実際に起こり得る不具合・脆弱性・再現方法・最小修正の考え方やデバッグのノウハウをシリーズで解説しています。
    ▶ 日本語記事一覧はこちら:lwIPトラブル対策室|日本語記事一覧


    ■ lwIPでこんな現象に遭遇していませんか?

    • SNMPで監視できるようにした機器が、ネットワーク側からのアクセスをきっかけに突然停止・再起動する

    • 脆弱性スキャナー(Nessus等)で、SNMP関連の重大な指摘(Critical)を受け取った

    • SNMPマネージャやスキャンツールを動かしている間だけ、機器が不安定になる・ハングする

    • 「SNMPは社内ネットワークだから安全」と考えて有効化しているが、本当に外部から触れないか確信が持てない

    lwIPのSNMPv3機能に、外部から送られた1つの細工パケットでスタックメモリを破壊できる脆弱性(CVE-2026-8836)が報告されています。 これは認証を必要とせず、ネットワーク経由で成立します。

    画像

    影響は「機器が落ちる」だけにとどまりません。破壊されるのはスタック上のメモリで、単なるサービス妨害(DoS)を超えてリモートコード実行(RCE)に至るおそれもあります。実際、NVDは本脆弱性(CVE-2026-8836)を共通脆弱性評価システム CVSS v3.1 で 9.8(Critical)と評価しています。産業機器・監視装置・ネットワーク管理対応製品など、SNMPを有効にして出荷している製品では、優先的に影響の有無を確認する必要があります。

    さらに見落とせないのが、影響を受ける 2.1.0〜2.2.1 の正式リリースには、まだ修正が反映されていないことです。修正はlwIP本家のソースには入っていますが、正式リリースには届いていません(詳細は本文で解説します)。


    ■ 発生条件

    • lwIPバージョン: 2.1.0〜2.2.1(SNMPv3の該当コードを外部から到達可能な形で含むバージョン)

      • 対象バージョン(個別): 2.1.0 / 2.1.1 / 2.1.2 / 2.1.3 / 2.2.0 / 2.2.1

      • この6バージョンについて、src/apps/snmp/snmp_msg.c の snmp_parse_inbound_frame() のSNMPv3認証パラメータ処理をソースコードで照合し、オーバーフローに到達し得る実装であることを確認しています(詳細は有料パートの「ソースコード解析」)。さらに、そのうち lwIP 2.2.0 については実機(組み込みボード)で実際にDoSを再現し、認証情報を持たない相手からの1パケットの受信で機器が異常停止(HardFault)することを確認しました。 本記事は、ソースコード解析・CVE-2026-8836 の一次データ(NVD)・lwIP本家リポジトリの照合に加え、この実機再現に基づきます。なお、確認できたのはDoS(異常停止)までで、リモートコード実行(RCE)は実証していません。

      • 2.0.0 / 2.0.1 / 2.0.2 / 2.0.3 について: これらのバージョンは、ソース上はオーバーフローに到達しません(=影響を受けません)。到達可能な脆弱状態として確認できるのは 2.1.0 以降です(2.0.x が到達しない理由は有料パートで解説します)。

      • NVDの記述は "lwIP up to 2.2.1"(2.2.1以前)です。

    • 影響を受ける設定:

      • LWIP_SNMP が有効(SNMPエージェント機能をビルドしている)

      • LWIP_SNMP_V3 が有効(SNMPバージョン3対応を有効化している)

      • SNMPエージェントがUDPポート161で待ち受けており、信頼できないネットワークから到達可能

    • 対象外(この脆弱コードを実行しない構成):

      • SNMP機能を無効にしている製品(LWIP_SNMP 無効。lwIPのデフォルトは無効)

      • SNMPv3を使わず、SNMPバージョン1/2cのみ有効にしている構成(LWIP_SNMP_V3 無効)。バージョン1/2cの処理経路は、今回問題になる認証パラメータの解析ブロックに入りません

      • SNMPポート(UDP 161)が、信頼できる管理ネットワークからしか到達できない構成(外部から届きにくいぶん実害リスクは下がる。ただし脆弱性そのものは残ります)

    影響有無のセルフチェック

    自社製品がこの脆弱性の影響を受けるかどうかは、以下で確認できます。

    □ lwIP 2.1.0〜2.2.1(上記の個別バージョンのいずれか)を使用している
    □ ビルド設定で SNMP機能(LWIP_SNMP)を有効にしている
    □ さらに SNMPバージョン3(LWIP_SNMP_V3)を有効にしている
    □ 製品がSNMP用のUDPポート161で外部からの通信を受け付ける構成である
    □ 脆弱性スキャンでSNMP関連のCritical指摘を受けた、またはSNMP利用中に原因不明の停止・再起動が起きたことがある

    上の4つ(バージョンとSNMPv3有効・ポート到達性)にすべて該当する場合、本記事の対象です。5つ目に心当たりがある場合は、今回の脆弱性も確認対象に入れてください(SNMP関連の不安定さには他の原因もあり得るため、断定はできません)。


    ■ この記事で分かること

    1. なぜSNMPv3を有効にした機器が、認証情報を持たない相手からの1パケットでメモリ破壊されるのか

      • SNMPv3の認証パラメータ(msgAuthenticationParameters)がどう処理されるか

      • 「認証を必要としない」とはどういう意味か(オーバーフローが認証照合より前に起きること)

    2. どのlwIPバージョンが実際に危険なのか(ソースコード解析)

      • 到達可能なオーバーフローとして確認できるのが 2.1.0 以降である理由

      • 2.0.x に同種のミスがありながらオーバーフローに至らない理由

    3. 破壊されるとどうなるのか(影響分析)

      • サービス妨害(DoS)として確実に起きること

      • リモートコード実行(RCE)が「理論上可能・未実証」とされる根拠

    4. 自社製品でどう対応すべきか

      • 公式リポジトリでの修正内容(正式リリース前の位置づけ)

      • SNMPv3を無効化する・ポートを制限するなどの暫定的な緩和策とトレードオフ


    ■ 問題の概要

    SNMP(簡易ネットワーク管理プロトコル)は、機器の状態監視や設定取得に広く使われるプロトコルです。特にSNMPバージョン3(SNMPv3)は、それ以前のバージョン1/2cにない認証と暗号化を備えており、「セキュアなSNMP」として有効化されることがあります。

    SNMPv3の認証は、USM(User-based Security Model、利用者ベースセキュリティモデル)という仕組みで行われます。送信側は、メッセージ全体から計算した認証コード(HMACダイジェスト)を msgAuthenticationParameters というフィールドに入れて送ります。受信側はこれを取り出し、自分で計算した値と突き合わせて、正規の相手からのメッセージかを検証します。

    このダイジェストは仕様上の長さが決まっており、lwIPは受信した msgAuthenticationParameters を固定長のバッファ(12バイト)にコピーして扱います。ここに問題があります。

    画像

    lwIPの受信解析処理は、この12バイトのバッファへコピーする際に、「コピーしてよい上限のサイズ」として、本来のバッファサイズ(12バイト)ではなく、受信データ自身が申告した長さをそのまま使ってしまいます。 さらに、長さがバッファに収まるかを検証するはずのチェックが無効化されていました。

    その結果、攻撃者が msgAuthenticationParameters に12バイトを超える長さのデータを入れて送るだけで、12バイトのバッファをはみ出して、隣接するメモリ領域が上書きされます。このバッファは処理関数のローカル変数(スタック上)に置かれているため、スタックバッファオーバーフローになります。

    さらに重要なのは、このコピー処理が、認証コードの照合よりも前の「解析」段階で行われることです。つまり、攻撃者は正しい利用者名やパスワード(鍵)を一切知らなくても、パケットを送りつけるだけでメモリ破壊を引き起こせます。これがCVE-2026-8836が「認証不要・ネットワーク経由」で成立するとされる理由です。

    画像

    原因は、src/apps/snmp/snmp_msg.c の受信解析関数 snmp_parse_inbound_frame() において、認証パラメータのコピー時にバッファサイズの上限指定を誤り、かつ長さ検証が無効化されていたことにあります。


    ■ 再現手順

    注意(実施前に必ずご確認ください): 以降の内容は、自身が管理する検証環境・隔離ネットワーク内での影響確認を想定したものです。第三者が管理する機器やネットワークへの無断のパケット送信は、実害の有無にかかわらず不正アクセス禁止法に抵触するおそれがあります。必ず対象機器の管理権限を持つ立場で、許可された範囲内でのみ実施してください。

    本記事では、悪用可能な完全なエクスプロイト(攻撃コード)は提示しません。 本脆弱性はメモリ破壊を伴う重大なもので、動作する攻撃コードの公開は悪用を助長するおそれがあるためです。ここでは、自社製品が影響を受けるかどうかを安全に見極めるための「確認の考え方」を示します。

    前提環境

    • lwIP 2.1.0〜2.2.1 のいずれかで、LWIP_SNMP および LWIP_SNMP_V3 を有効にしてビルドした検証機

    • SNMPエージェントがUDPポート161で待ち受けている状態

    • 自身が管理する隔離ネットワーク

    影響有無を安全に見極める手順

    Step 1: SNMPv3が実際に有効かを確認する

    まず、対象機器のビルド設定(lwipopts.h 相当)で LWIP_SNMP と LWIP_SNMP_V3 が有効になっているかを確認します。両方が有効でなければ、今回の脆弱コードは実行されません。設定が追えない場合は、SNMPマネージャからSNMPv3でアクセスできるか(v3のメッセージに応答が返るか)で間接的に判断できます。

    Step 2: SNMPポートの到達性を確認する

    検証機のUDPポート161が、想定していない経路(外部ネットワーク側など)から到達可能でないかを確認します。到達可能であれば、認証情報を持たない相手からでも今回のパケットが届き得ることを意味します。

    Step 3: 影響の有無をソースで確定する

    最終的に「自社が使っているlwIPのソースがこの脆弱性を含むか」は、後述の有料パート「ソースコード解析」で示す該当箇所(snmp_parse_inbound_frame() の認証パラメータ処理と、長さ検証チェックの状態)を、自社のソースツリーで確認するのが最も確実です。ベンダーSDKが本家の修正を取り込んでいるかどうかも、この箇所を見れば判断できます。

    補足: 本記事の解析は、lwIP 2.2.1 のソースコード、CVE-2026-8836 の一次データ(NVD)、およびlwIP本家リポジトリの各リリースタグの照合に基づきます。加えて、lwIP 2.2.0 を載せた実機では、過大な認証パラメータを持つ1パケットの受信で機器が異常停止(HardFault)することを確認しました(DoS。リモートコード実行は実証していません)。影響判定は、あくまで自社ソース・自社環境での確認と組み合わせて行ってください。


    ■ 原因・対策

    ここまでで、発生条件・問題の概要・影響有無を見極める考え方を公開しました。

    ここから先の有料パートでは、次のことが分かります。

    • どのコードがなぜ危険なのか … snmp_parse_inbound_frame() の該当箇所と、上限指定の誤り・長さ検証の無効化を、ソースコードで具体的に示します

    • 2.0.x はなぜ「実装ミスはあるが到達しない」のか … 各リリースを1つずつ照合した結果と、バージョンごとの長さ検証の状態を解説します

    • 破壊されると何が起きるのか … スタック上で隣接するデータの並びから、DoSとして確実に起きること、RCEが「理論上可能・未実証」とされる根拠を整理します

    • 公式修正の内容と、正式リリース前にどう守るか … 本家リポジトリの修正コミットの中身と、SNMPv3無効化・ポート制限などの緩和策をトレードオフ付きで解説します

    SNMPポートが外部から届く状態であれば、認証情報を持たない相手が細工した1パケットを送るだけで機器を停止させられます(本記事の実機検証で確認済みです)。自社製品でSNMPポートがどこから到達できるかを確認し、正式リリースを待たずにリスクを下げるための具体策までを、有料パートで解説します。

    またlwIPの全体像や、各ベンダーSDKごとの差異、なぜlwIPの不具合情報が重要なのか、といった背景については、導入記事で整理しています。

    【lwIP】よくある不具合と対策まとめ|組み込みTCP/IPトラブル事例集


    ■ ソースコード解析

    src/apps/snmp/snmp_msg.c の受信解析関数 snmp_parse_inbound_frame() を中心に追います。この関数は、snmp_receive() から呼ばれ、受信したSNMPメッセージを先頭から順に解釈します。


    【解析1】認証パラメータのコピー処理

     
     
    猫とお酒とギター大好きな組み込みエンジニアです。 lwIPの不具合解析や、ネットワークトラブル対策を実務ベースで共有しています。世の中のネットワーク機器の不具合を少しでも減らしていければと思っています。

    あなたへのおすすめ