要点
- 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 までの版に当たる。
- 使い回した部品が、次の XML を読めなくなる。 読み取りの部品を初期化して使い回すと、前の文書で使ったメモリが数えられたまま残る。そのため、先に大きな文書を通した部品は、ふつうの大きさの XML にも「メモリが足りない」というエラーを返すようになる。部品を作り直すまで、この状態は続く。
- 「billion laughs」の変形で CPU を使い切る。 billion laughs は、短い XML の中に入れ子の置き換えを仕込み、読み取りの側で中身を何億倍にもふくらませる古い攻撃だ。Debian の追跡ページは、それほど大きくない文書でも、1回の読み取りで CPU を数十秒ふさげると書いている。原因は、ふくらみを見張る Expat の仕組みが、気づくのに遅れることだ。研究者の Hanno Böck が自作の道具でこの変形を見つけた。
- 特別な順で XML を渡すと、アプリが落ちる。 外部から取り込む部分の読み取りで、最初に空のデータを渡す順をとると、空のポインタ(どこも指していない住所)を読みに行き、アプリが止まる。Ubuntu は、データの区切り方を攻撃者が決められる場合に起きるとしている。
- 属性の数が多すぎると、数が桁あふれする。 タグに付く属性の数を数える値には、上限がある。Debian によると、1つのタグの属性が2の30乗(約10億)を超えると値があふれ、アプリが落ちたり、メモリが壊れたりするおそれがある。そうした文書は、何 GB もの大きさになる。
4件の多くは、サービスを止める・重くする害だ。Ubuntu は、3番目の欠陥の優先度を「Medium」としている。
日本の利用者への影響
Expat は日本でも、Python を使う業務の仕組み、Linux のサーバー、ネットにつながる機器などで広く動いているはずだ。日本の組織に被害が出ているかは分からない。
当たりやすいのは、外から受け取った XML を自動で読むサービスだ。たとえば、利用者がアップロードした文書や、外部のシステムから届くデータを XML のまま読む仕組みがそうだ。自分で作った XML だけを読むなら、心配はずっと小さい。
今すぐやること
- 外から XML を受け取る仕組みがあるか、担当者に確かめる。 あれば、そこから先に手を付ける。
- Linux のサーバーは、配布元の更新を待って当てる。 11月3日の時点で、Debian は開発中の版(unstable)では修正版を出したが、安定版はまだ直っていない。Debian は、いくつかの版で「軽い問題」とし、まとめての更新で直す予定としている。Ubuntu は、まだ「評価が必要」(Needs evaluation)の段階だ。
- Python は、次の修正版を当てる。 Python は、Expat の写しを同梱している。Python の開発チームは 3.12〜3.15 向けに入れ替えの作業を進めている。
- Expat を自分のソフトに同梱している開発者は、2.10.0 に上げる。 Sebastian Pipping は、配布する人や Expat を同梱・版を固定している人に、更新を勧めている。
- ネットにつながる機器は、メーカーの更新を気にかける。 中に 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が符号付き整数のあふれ
- CVE-2026-113351(#1431):
- 入っている版を確かめる
# 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 がある

