注意まだ起きていない

Expat 2.10.0、XML 読み取り部品の欠陥4件を修正

XML パーサ libexpat の2.10.0で、CVE-2026-113351、115506、117610、118370 の4件を修正した。影響は2.9.0までの版。Python、Debian、Ubuntu など同梱する製品への修正はまだ途中。

要点

  • XML(データを書くための決まった書式)を読み取る部品 Expat に4件の欠陥が見つかり、2026年11月2日に出た版 2.10.0 で直った。
  • 悪意のある XML を読まされると、アプリが止まったり、極端に重くなったりする。1件は、メモリが壊れるおそれもあるとされる。
  • Expat は Python や Linux の中に組み込まれているので、直った部品が手元に届くまでには時間がかかる。

何が起きたか

Expat(libexpat)は、C 言語で書かれた XML の読み取り部品だ。プログラミング言語の Python や、Linux の多くのソフトに入っている。使う人は、Expat が入っていると気づかないことが多い。

開発を取りまとめる Sebastian Pipping は11月2日、自身のブログで 2.10.0 を公開した。修正を早く届けるために出した版だという。変更履歴と Debian の追跡ページによると、4件の中身は次のとおりだ。どれも 2.9.0 までの版に当たる。

  1. 使い回した部品が、次の XML を読めなくなる。 読み取りの部品を初期化して使い回すと、前の文書で使ったメモリが数えられたまま残る。そのため、先に大きな文書を通した部品は、ふつうの大きさの XML にも「メモリが足りない」というエラーを返すようになる。部品を作り直すまで、この状態は続く。
  2. 「billion laughs」の変形で CPU を使い切る。 billion laughs は、短い XML の中に入れ子の置き換えを仕込み、読み取りの側で中身を何億倍にもふくらませる古い攻撃だ。Debian の追跡ページは、それほど大きくない文書でも、1回の読み取りで CPU を数十秒ふさげると書いている。原因は、ふくらみを見張る Expat の仕組みが、気づくのに遅れることだ。研究者の Hanno Böck が自作の道具でこの変形を見つけた。
  3. 特別な順で XML を渡すと、アプリが落ちる。 外部から取り込む部分の読み取りで、最初に空のデータを渡す順をとると、空のポインタ(どこも指していない住所)を読みに行き、アプリが止まる。Ubuntu は、データの区切り方を攻撃者が決められる場合に起きるとしている。
  4. 属性の数が多すぎると、数が桁あふれする。 タグに付く属性の数を数える値には、上限がある。Debian によると、1つのタグの属性が2の30乗(約10億)を超えると値があふれ、アプリが落ちたり、メモリが壊れたりするおそれがある。そうした文書は、何 GB もの大きさになる。

4件の多くは、サービスを止める・重くする害だ。Ubuntu は、3番目の欠陥の優先度を「Medium」としている。

日本の利用者への影響

Expat は日本でも、Python を使う業務の仕組み、Linux のサーバー、ネットにつながる機器などで広く動いているはずだ。日本の組織に被害が出ているかは分からない。

当たりやすいのは、外から受け取った XML を自動で読むサービスだ。たとえば、利用者がアップロードした文書や、外部のシステムから届くデータを XML のまま読む仕組みがそうだ。自分で作った XML だけを読むなら、心配はずっと小さい。

今すぐやること

  1. 外から XML を受け取る仕組みがあるか、担当者に確かめる。 あれば、そこから先に手を付ける。
  2. Linux のサーバーは、配布元の更新を待って当てる。 11月3日の時点で、Debian は開発中の版(unstable)では修正版を出したが、安定版はまだ直っていない。Debian は、いくつかの版で「軽い問題」とし、まとめての更新で直す予定としている。Ubuntu は、まだ「評価が必要」(Needs evaluation)の段階だ。
  3. Python は、次の修正版を当てる。 Python は、Expat の写しを同梱している。Python の開発チームは 3.12〜3.15 向けに入れ替えの作業を進めている。
  4. Expat を自分のソフトに同梱している開発者は、2.10.0 に上げる。 Sebastian Pipping は、配布する人や Expat を同梱・版を固定している人に、更新を勧めている。
  5. ネットにつながる機器は、メーカーの更新を気にかける。 中に Expat が入っているかは、外からは分かりにくい。

背景

Expat は広く使われているぶん、欠陥が見つかるたびに、多くの製品が後追いで直す。Python も、2.9.0 のときに Expat を入れ替えている。

守る側の余力も気になる。Sebastian Pipping はブログで、2.10.0 に集中できたのはミュンヘン市の制度「Open Source Sabbatical」のおかげだと書いている。それでも、直すより見つかるほうが速い。8月からの間に新しい報告は20件届いたが、直せたのは12件にとどまった。その差が積み上がり、既知で未修正の欠陥は、8月の5件から、この版のあとで13件になったという。Sebastian Pipping は、2027年1月より先も Expat に頼る企業に、維持の費用を出してほしいと求めている。

技術者向けの詳細
  • 修正版: libexpat 2.10.0(タグ R_2_10_0、2026-11-02)。前の版は 2.9.0(2026-10-05)
  • CVE と修正の PR
    • CVE-2026-113351(#1431): XML_ParserReset のあと、メモリの数えが残り XML_ERROR_NO_MEMORY になる。影響は 2.7.2〜2.9.0 とされる(Debian は bookworm の 2.5.0 も「vulnerable」としている)
    • CVE-2026-115506(#1433 ほか): accountingDiffTolerated() で増幅を見つけるのが遅い。変更履歴は、XML を圧縮で包むと攻撃に必要な大きさが大きく減ると注意している。古い版に移植するなら #1439 に注意とある
    • CVE-2026-117610(#1444): externalEntityInitProcessor2() で NULL ポインタ参照。Ubuntu の評価は CVSS 3.1 で 5.9
    • CVE-2026-118370(#1450): storeAtts() で attIndex と nPrefixes が符号付き整数のあふれ
  • 入っている版を確かめる
# Debian / Ubuntu
dpkg -l | grep -i expat
# RHEL 系
rpm -q expat
# Python が使う Expat の版
python3 -c "import pyexpat; print(pyexpat.EXPAT_VERSION)"
  • 配布の状況(2026-11-03 時点)
    • Debian: unstable は 2.10.0-1 で修正済み。bookworm、trixie、forky は vulnerable。一部は「no-dsa」
    • Ubuntu: expat はどの版も「Needs evaluation」。apache2、firefox などは CVE-2026-117610 では「Not affected」
    • CPython: issue #161192 で main と 3.12〜3.15 向けの PR がある

出典

一次情報

参考

記事は、運営者が生成 AI を活用して作成し、内容を確かめたうえで公開しています。 誤りに気づいたら編集方針の連絡先へ。

次に読む

同じタグの記事