Rembg: 認証されていないSAMモデルのインジェクションにより、悪意のあるONNXグラフを介してローカルファイルが公開される可能性があります。

公開されている`/api/remove`エンドポイントは、攻撃者によって制御される`extras.sam_model`を、SAMファイル名とGitHubのダウンロードURLの両方で使用します。パスのトラバーサルとURLのフラグメントを利用することで、認証されていない攻撃者が悪意のあるONNXモデルを、ターゲットファイルと並べて配置することができます。これらのモデルは、ファイルをONNXの外部データとして読み込み、そのバイトをエンコードして返されるPNGに組み込みます。

この問題は、SAMの`sam_model`において、バージョン2.0.81に影響を与え、ファイルの内容全体が返される可能性があります。

[画像1:最初の認証されていないリクエストにより、パスが設定され、HTTP 500エラーが返されます。]

### 技術的な詳細

`rembg/commands/s_command.py`の188行から223行、および384行から397行は、公開されている`extras`のJSONを受け取り、`new_session()`に渡します。`rembg/sessions/sam.py`の313行から355行は、`sam_model`をエンコーダー/デコーダーのファイル名と固定されたGitHubのURLに挿入し、その後、ピン留めされたハッシュなしで`pooch.retrieve()`を呼び出します。

リクエストはURLのフラグメントを削除しますが、ローカルのPOSIXパスはそれを保持します。Poochは、キャッシュの制限を強制せずに、攻撃者が選択した親ディレクトリを作成します。最初のリクエストは、パスのツリーを作成し、HTTP 500エラーを返します。同じ2番目のリクエストは、攻撃者が用意したファイルを2回ダウンロードし、それをSAMモデルとしてターゲットファイルと並べて保存します。

このグラフは、相対的な外部テンソルを使用してターゲットファイルを読み込み、すべてのバイトをマスクピクセルにマッピングします。rembgは、マスクをPNGとして返し、攻撃者はそれをデコードして元のバイトに戻します。

[画像2:同じ2番目のリクエストにより、HTTP 200エラーと共にエンコードされたPNGが返されます。]

[画像3:詳細な画像]

### 実証

添付されたローカル接続のみのPoC(Proof of Concept)によって、以下が生成されました。

```text
脆弱性:認証されていないSAMモデルインジェクションにより、合成された`/flag`ファイルが公開されました。
first-http=500 second-http=200
decoded-value=REMBG_AUDIT_SYNTHETIC_FLAG_2026_08_28

`/etc/passwd`のバリアントでは、以下の内容が出力されました。

```text
脆弱性:`/etc/passwd`ファイル(839バイト)が公開されました。
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
```

デコードされた内容は、所有されているコンテナ内の`/etc/passwd`ファイルと一致しました。テストでは、GitHubの代わりにローカルのTLS環境が使用され、公開されているターゲットサーバーには接続していません。

<img width="1816" height="1146" alt="image" src="https://github.com/user-attachments/assets/664eaf25-5963-4ca6-b7eb-3e198499194a" />

*スクリーンショット3 — デコーダは、`/etc/passwd`ファイルの839バイトすべてを再構築します。*

### 影響

認証されていない攻撃者は、任意のONNX計算を実行し、remlbgがアクセスできるファイル全体を、必要なファイルシステム権限の下で公開することができます。提供されたroot権限で実行されているコンテナでは、`/flag`ファイルと`/etc/passwd`ファイルの両方が公開されました。

### 対策

サーバー側で固定されたSAM識別子を、固定されたファイル名、URL、およびピン留めされたハッシュにのみ対応するようにします。パスとURLの構文を拒否し、宛先を正規化し、ディレクトリを作成する前にキャッシュの分離を強制します。コンテナをroot権限を持たないユーザーで、読み取り専用のルートファイルシステムで実行します。

[decode_samfragment_png.py](https://github.com/user-attachments/files/31601255/decode_samfragment_png.py)
[samfragment_04.py](https://github.com/user-attachments/files/31601256/samfragment_04.py)
[samfragment_etc_passwd_lab.py](https://github.com/user-attachments/files/31601258/samfragment_etc_passwd_lab.py)

影響を受けるパッケージ:
- pip (Python) rembg: 影響を受けるバージョンは2.0.82未満、修正されたバージョンは2.0.82
```